OO第四单元总结

这个学期OO的学习时光非常的充实,学习到很多知识的感觉是快乐的。

1.本单元架构设计

本单元在架构上不算太难,难点主要在于理解指导书的意思···

首先处理输入,分写出多个方法,首先按照element的种类分装进不同的map里,然后再写几个方法进行元素之间关系的连接。

分类分装时采用switch语法,而不用一大堆的if。

for (UmlElement element : elements) {
   putInCertainHashmap(element);
}
extensionWeb();
interfaceRealize();
associationSetup();
attributeSetup();
operationSetup();
parameterSetup();


//...
switch (elementType) {
           case UML_CLASS:
               MyClass myClass = new MyClass(name, id);
               umlClassWithIdAsKey.put(id, myClass);
               if (umlClassWithNameAsKey.containsKey(name)) {
                   umlClassWithNameAsKey.put(name, null);
              } else {
                   umlClassWithNameAsKey.put(name, myClass);
              }
               classesForCheck.put(id, (UmlClass) element);
               setNameCorrect(name);
               break;
           case UML_ATTRIBUTE:
               umlAttribute.put(id, (UmlAttribute) element);
               break;
           case UML_ASSOCIATION:
               umlAssociation.put(id, (UmlAssociation) element);
               break;
      // ....(摘了一部分)

在组织元素的时候,也要注意组织顺序。因为有的方法需要依靠之前别的方法整理好的容器。如果顺序不对,会出现空指针异常。(搞错了两次!)

元素的承装容器则主要选Hashmap,细节上根据方法的需要,对部分元素会采用两种key,开两个容器。

private final HashMap<String, UmlAssociation> umlAssociation;
private final HashMap<String, UmlAssociationEnd> umlAssociationEnd;
private final HashMap<String, UmlAttribute> umlAttribute;
private final HashMap<String, UmlOperation> umlOperation;
private final HashMap<String, UmlParameter> umlParameter;
private final HashMap<String, UmlGeneralization> umlGeneralization;
private final HashMap<String, UmlInterfaceRealization> umlInterfaceRealization;
private final HashMap<String, MyClass> umlClassWithIdAsKey;
private final HashMap<String, MyClass> umlClassWithNameAsKey;
private final HashMap<String, MyInterface> umlInterfaceWithIdAsKey;
private final HashMap<String, UmlClass> classesForCheck;
private final HashMap<String, UmlInterface> interfacesForCheck;
private final ArrayList<UmlAttribute> realAttrs;

在类的构建上,如果元素有需要存储的与他相关的属性,那么就在写方法的过程中修改UmlElement,改成自己新写的类`Myxxx'.

 

MyClass中设置的属性如下,这是最重要的一个类。

private final String name;
private final String id;
private MyClass superClass;
private int operationCount;
private final HashMap<String, ArrayList<Integer>> visibilityCount;
private final HashMap<String, ArrayList<UmlOperation>> operations;
private final HashMap<String, UmlAttribute> attributes;
private int attrDuplicated;
private final HashMap<String, MyInterface> realizedInterfaces;
private final ArrayList<MyClass> associatedClasses;
private final ArrayList<MyInterface> associatedInterfaces;
private final HashMap<String, HashMap<String, MyOperation>> paramOperation;
private final HashMap<String, UmlAssociationEnd> ends;

整体属性顺序没有调整过,大概就是按照每次作业新增的需求一个一个往下加,不费劲,也没有重构。

由于在一些方法中我使用了HashSet,且存的是MyClass,因此要注意重写一个equalshashCode方法,这样才能正确运作。

@Override
public boolean equals(Object obj) {
    return (obj instanceof MyClass
            && ((MyClass) obj).id.equals(this.id));
}

@Override
public int hashCode() {
      return id.hashCode();
}

MyInteraction:

private final String name;
private final String id;
private final String parentId;
private final HashMap<String, UmlLifeline> containLifelines;
private final HashMap<String, Integer> lifelinesGettingMessages;
private final HashMap<String, ArrayList<Integer>> sentSorts;
private int participantsNum;

MyInterface:

private final String name;
private final String id;
private ArrayList<MyInterface> superInterface;
private ArrayList<UmlAttribute> attributes;
private boolean attrVisWrong;

MyOperation:

private final String id;
private final String name;
private ArrayList<NameableType> paramIns;
private boolean returnOrNot;
private NameableType returnType;
private final String className;

MyState:

private final String name;
private final String id;
private final ElementType type;
private final String parentId;//region
private final HashMap<String, ArrayList<UmlEvent>> subsequences;
private final ArrayList<MyState> nextLevel;
private boolean guard;

MyStateMachine:

private final String name;
private final String id;
private final HashMap<String, MyState> states;//name as key
private int stateNum;

有了这样的整体架构,在构建联系上会容易不少。在实现方法时也就需要从这些类里取出想要的成员属性,在进行计算就行。

本单元给的CPU时间挺宽松的,所以在算法实现上没有怎么多想,用了很多for循环,不值得继续这样的做法。

2.四个单元中的架构设计及OO方法理解的演进

第一单元第一次作业完全没有面向对象的概念,基本就是跟着上机实验的代码学,满满的面向过程感。

第二次作业经历了巨大的重构,也是这个学期OO最惨烈的一周。不过就是在这个周,面向对象的感觉逐渐有了。对于项的分类,以及他们内部的成员,我开始有了逐渐深入的认识。但是第一单元总体而言对我来说还是非常的面向过程。

第二单元作业学习了几个模式,重点是生产者-消费者。而整体的架构一开始也是跟着上机课代码学的,但是后来发现死锁问题还是存在。生产者消费者也是面向对象的一种体现形式,生产者,调度器,消费者各司其职,这就是对象自己管自己的事。

第三单元总体是学习JML,感觉轻松一些,学习了图论的一些知识是除了JML以外收获最大的一点。

第四单元感觉上面向对象的感觉强烈一些,封装多个Myxxx类,让他们各自存好自己的成员属性方法,方便后续调用。

3.测试理解与实践的演进

第一单元作业采用自造数据来进行测试。在惨烈的互测后,明白了自己在构造数据时要考虑到一些极端情况(如超多层括号的情况)。

第二单元作业除了根据样例打造一些自己能想到的问题(主要是针对同时并发海量线程的情况),更重要的也是梳理自己代码同步锁的逻辑。

第三单元测试主要从JML入手,JML将各种情况都标的很清楚,将各个方法的各种情况进行一定数量的组合,可以获得一定的正确性保证。第四单元也比较相似。

4.课程收获

首先,学习到了java语言肯定是最大的收获,新学习了一门编程语言,而且感觉这个语言比C功能更强大,HashMap什么的都能直接用(虽然作业并没有简单到哪儿去),magic!

其次就是面向对象思想的培养。一开始看到课程名字时还不太理解这个具体是什么意思,疑惑写代码还能面向对象?一个学期下来,初步地了解了这个思想的意义,这种思想,也会对我在日常生活中的一些思考方式产生影响。

5.具体改进建议

一 作业的难度顺序是否有些奇怪?经历了一个学期,依然感觉第一单元的作业是最最最难的!我相信也有很多同学和我想法一样。也许可以进行适当的调整?

二 理论课和代码作业的联系在前两个单元可能还不算紧密。有不少内容在课上感觉很重要,然后写代码的时候感觉好像没有用上。很有可能是个人问题,但是我确实是这么感觉的。

三 指导书的编写也许可以再改进改进,第一单元和第四单元,尤其是第四单元,部分表述真的挺难懂,需要借助讨论区才能明白具体的要求。

posted @ 2021-06-26 14:39  tomzzzz  阅读(145)  评论(0编辑  收藏  举报