这个学期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
,因此要注意重写一个equals
和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.具体改进建议
一 作业的难度顺序是否有些奇怪?经历了一个学期,依然感觉第一单元的作业是最最最难的!我相信也有很多同学和我想法一样。也许可以进行适当的调整?
三 指导书的编写也许可以再改进改进,第一单元和第四单元,尤其是第四单元,部分表述真的挺难懂,需要借助讨论区才能明白具体的要求。