OO第四单元总结
一、第四单元总结
本单元实现了一个UML解析器,实现了对UML源码的读入以及有关信息指令的查询。第一次作业中要完成的是将UML的输入信息进行解析,建立相应的数据结构,需满足能够处理多种不同的对类图的信息进行查询的指令。
在官方所给的架构的基础之上,只需要我们调用AppRunner运行程序,并且实现自己的Implement类,完成对UML中不同成员的读入、解析与存储,同时完成对类图中各种信息的查询方法。
由于输入数据并不对输入顺序作任何保证,故我在对各有元素的处理上我采用了三轮处理的方式。
第一轮:每一种数据类型建立一个ArrayList队列,将每种类型放入相应的队列中,同时,对于一些需要存储和其他类型有关联的类型,我们建立了对应的MyElement类,其中包含UMLElement以及其他需要用到的变量。
第二轮:
这一轮中主要处理的是需要被其他类型所调用的类型,需要提前与其建立完成。比如说Attribute类型需要放入MyClass类中的Arributes队列之中,Generalization类需要其source和target两个类都已经完成了读入,才能创建相应的图。
同时,为了方便之后的查询方法,我们建立几个HashMap用来完成图的创建。
其中,fatherTree用来查询当前类的父类是谁,由于本单元中不会出现类的多继承行为,所以每个类只会有一个父类。critical用来实现状态图中当前状态之后可能进入的所有状态,用来建立状态的路径图,从而判断关键节点。
第三轮:
第三轮实现的是最底层的类型,如Parameter、Message之类本身并不需要调用其他类型,但是其他类型需要知道自己所拥有的这些类型。
部分自己的MyElement类:
MyClass:包含operations用来保存类中的方法、parentClasses和sonClasses用来保存当前类的父子关系类、myInterface用来保存实现的所有接口,便于接口查询的O(1)复杂度、myAttribute用来保存类中的元素。
MyCollaboration:interactions和attributes用来保存collaboration中所有的元素。
MyInteraction:participants用来保存所有的生命线、umlMessage用来保存所有的消息。
MyInterface:fatherInterface和sonInterface用来保存接口的父子关系,同样是为了降低接口查询的实践复杂度。
MyLifeLine:将UmlLifeLine和UmlEndPoint全部统一到MyLifeLine中,通过在MyLifeLine中加入Type属性来判断MyLifeLine的类型,father和son记录了LifeLine和endPoint的消息传递关系。
MyState:将UmlState、UmlFinalState和Pseudostate统一进MyState中,通过Type进行区分,nextStates记录当前state可以迁移的所有状态。
MyTransition:保存了该迁移的所属事件和条件。
各类型关系图:
复杂度分析:
二、总结自己在四个单元中架构设计思维及OO方法理解的演进
在我的感觉里,每个单元最为重要的就是第一次作业。第一次作业应该尽可能的将整个单元的架构给建立好,这样在之后的两次作业中才能避免重构,耽误时间,同时也能让自己更好地理解这个单元作业的目的所在。
在架构设计方面,首先应该充分阅读指导书,明确本单元的目的。之后仔细地阅读官方包所给的代码,根据官方包和训练代码,对于架构有一个初步的设想,完成各级抽象,试着将需要自己完成的类的大概先搭好,完成读入工作和数据结构的建立。最后再次阅读指导书,搜索指导书中给出的各种条件,完善自己的代码,对各种边界情况有一个初步的映像,在写代码的时候能想起来。最后才是完成要求和算法优化。
三、 总结自己在四个单元中测试理解与实践的演进
四个单元的学习中学会了如何自己根据指导书中的条件来构造数据,学会了如何自己编写评测机。
四、 总结自己的课程收获
学习熟悉JAVA语言,能够根据需求实现类继承、接口继承等。自身的代码架构思路得到了锻炼,在设计架构的时候会考虑到客户的需求变更与版本迭代。了解多线程运作机制,建立了面向对象的思维,摆脱了面向过程的单一设计模式。
五、立足于自己的体会给课程提三个具体的改进建议
1)在第一单元或者pre训练的时候可以多增加一些java语法的教学或者相关的链接
2)bug修复的冷静期可以缩短
3)指导书将需要注意可能会遗漏的地方加粗