OO 第四单元总结
一、总结本单元的架构设计
以下是我的MyUmlClassModelInteraction类的成员变量:
private HashMap<ElementType,HashMap<String,UmlElement>> list = new HashMap<>(); private HashMap<String,String> classList = new HashMap<>(); private HashMap<String, HashSet<String>> interfaceList = new HashMap<>(); private HashMap<String,HashMap<String,String>> parentTree = new HashMap<>(); private HashMap<String,HashSet<String>> interfaceTree = new HashMap<>(); private HashMap<String,HashSet<UmlElement>> attributeList = new HashMap<>(); private HashMap<String,HashSet<UmlElement>> endList = new HashMap<>(); private Checker checker;
list:根据ElementType分别存储了类图中所有的element。
classList:存放类的直接继承关系。
interfaceList:存放接口的直接继承关系。
parentTree:存放类的所有直接或间接父类。
interfaceTree:存放接口的所有直接或间接父接口。
attributeList:存放类包含的元素。
endList:存放类或接口的关联对端。
checker:执行部分合法性检查。
以下是MyUmlStateChartInteraction的成员变量:
private HashMap<ElementType, HashMap<String, UmlElement>> list = new HashMap<>(); private HashMap<String,HashSet<String>> nextList = new HashMap<>(); private HashMap<String,HashSet<String>> treeList = new HashMap<>(); private UmlFinalState finalState; private UmlPseudostate pseudoState;
list:根据ElementType分别存储了状态图中所有的element。
nextList:存放状态的前后继关系。
treeList:存放状态的所有后继状态。
finalState:存放唯一的UmlFinalState。
pseudostate:存放唯一的UmlPseudoState。
以下是MyUmlCollaborationInteraction的成员变量:
private HashMap<ElementType,HashMap<String, UmlElement>> list = new HashMap<>(); private HashMap<String,HashMap<String,UmlElement>> lifelineList = new HashMap<>(); private HashMap<String,Integer> numList = new HashMap<>(); private HashMap<String,UmlElement> attribute = new HashMap<>();
list:根据ElementType分别存储了时序图中所有的element。
lifelineList:存放interaction对应的lifeline。
numList:存放lifeline对应的incomingMessageCount。
attribute:存放attribute的id和对应的element。
以下是MyUmlGeneralInteraction的成员变量:
private MyUmlStateChartInteraction state; private MyUmlCollaborationInteraction collabortion; private MyUmlClassModelInteraction classModel; private MyUmlStandardPreCheck check;
state:用于调用状态图对应的接口。
collabortion:同于调用时序图对应的接口。
classModel:用于调用类图对应的接口。
check:进行合法性检查。
以下是MyUmlStandardPreCheck的成员变量:
private MyUmlStateChartInteraction state; private MyUmlCollaborationInteraction collabortion; private MyUmlClassModelInteraction classModel;
state:用于调用状态图中检查合法性的接口。
collabortion:同于调用时序图中检查合法性的接口。
classModel:用于调用类图中检查合法性的接口。
第一次作业中查找接口的所有父接口的部分代码实现:
public HashSet<String> searchParentInterface(String id) { if (interfaceTree.containsKey(id)) { return interfaceTree.get(id); } if (!interfaceList.containsKey(id)) { return null; } HashSet<String> parent = interfaceList.get(id); HashSet<String> ans = new HashSet<>(parent); for (String parentId : parent) { if (interfaceList.containsKey(parentId)) { ans.addAll(searchParentInterface(parentId)); } } interfaceTree.put(id,ans); return ans; }
第三次作业中关于R002检查是否有循环继承时的部分代码实现:
public void searchLoop(String id) { if (!interfaceList.containsKey(id)) { return; } loop.add(list.get(ElementType.UML_INTERFACE).get(id).getId()); loops.add(list.get(ElementType.UML_INTERFACE).get(id).getId()); for (String nextId : interfaceList.get(id)) { UmlInterface element = (UmlInterface) list.get(ElementType.UML_INTERFACE).get(nextId); if (loops.contains(element.getId())) { for (int i = loop.size() - 1; i >= 0; i--) { invalidU002.add(element.getId()); if (loop.get(i).equals(element.getId())) { break; } } } else { searchLoop(element.getId()); } } loops.remove(loop.get(loop.size() - 1)); loop.remove(loop.size() - 1); }
二、四个单元中架构设计及OO方法理解的演进
第一单元
第一单元是表达式求导,从最开始只有简单的幂函数加减到后面加入表达式因子,嵌套因子的三角函数,难度逐渐增大。
当时我的架构设计还是十分面向过程的。从表达式到项再到因子的一个层次关系也很混乱。虽然分出了不同的类但是感觉只是把方法分开,建立了几个类。虽然最后也完成了要求的任务,但是代码十分的丑陋和难以理解。
除此之外第一次作业时也不懂为后续的作业留下迭代的空间,导致第二次作业基本等同于重新写了一遍。
第二单元
第二单元是关于多线程同步的电梯问题,现在想来还是挺有意思的。
在第一次作业的时候我还不能运用synchronized块,不太理解哪些部分需要锁,哪些不用锁,只好学着上机实验时的代码不断尝试,最后就很简单粗暴的把整个运行部分都锁了起来。不过因为是单部电梯所以没什么影响。后来我才弄懂了什么时候需要锁什么时候不用锁,也开始思考如何利用wait和notifyAll让多部电梯能够同时运行。
从这一单元开始我渐渐能够掌握面向对象的设计思想了,也能够建立多个对象类(如Elevator类,Floor类,WaitQueue类等),各司其职了。但是在完成代码时,依然会出现一个方法中进行了多部操作,最后方法的复杂度过高的问题,没有让方法的功能更加专一化。
第三单元
第三单元是根据给出的JML语言实现程序架构。
本单元的难度并不高,只要严格按照JML语言进行“翻译”就不会WA。(然而会TLE,而优化之后就有可能WA了)这一部分主要的难点在于复杂度的控制。程序中总有那么几个指令需要对图进行遍历。而如果只是“翻译”JML语言中的描述,就会导致RTLE,CTLE的问题。所以我们要根据自己的理解,选用恰当的方法降低程序的复杂度。
这一单元主要教会我的是对于复杂,大量的数据,可以建立相应的HashMap,HashSet将可能需要用到的数据储存起来,并在需要的时候直接调用,可以有效地降低程序的复杂度。
第四单元
第四单元是实现查询UML类图、时序图、状态图的指令接口,和合法性检查。
本单元的难度依旧不高,只需将element用HashMap存好,查询时调用既可。主要难度依然在于几处需要递归查找的地方。另外还有可能出现某些特殊输入没有考虑到导致合法性检查出现问题。
三、四个单元的测试理解与实践推进
到了一学期的结尾,我依然没有学会怎么写测评机TT,所以这四单元的测试基本都是靠的手动构造数据或者试试dalao们提供的样例。
手动构造数据主要是针对一些在临界点的数据,具有特殊性的数据。(主要在一二单元)第四单元中可以用StarUML绘制一些类图等进行测试。对于程序复杂度的问题,我基本都是靠直接检查程序代码,思考有无可能出现死循环,有无可能进行优化...
四、总结自己的课程收获
这学期下来感觉在OO课程中收获颇丰。
1、逐步掌握了面向对象的编程思想。
2、学会了如何实现多线程同步。
3、学会了处理复杂需求时,将需求逐步分解,转化为多个简单需求的方法。
4、学会阅读理解JML、UML语言。
5、学会使用并查集、迪杰斯特拉算法等方法降低程序复杂度。
6、对于java语言的运用更加熟练了。
五、课程改进建议
1、希望能加强第三单元JML语言部分的弱测、中测测试点。(因为这一单元我两次出现中测全过,强测大面积WA,甚至还有很基础的问题。虽然是我自己后续没好好测试的锅,但还是希望弱测和中测至少把基本的东西测一测吧)
2、希望实验课能够在课后公布结果和正确答案,不然我觉得这个实验课就挺没有意义的,我做完也不知道自己有没有做对。
3、如果能够能专门提供一个教程指导同学们如何自己写测评机就好了,否则对于一部分不会写评测机的同学(比如我)而言,平时debug很痛苦,互测环节只能躺平……