总结本单元作业的架构设计
本单元架构设计是逐层递进的,故只对最后一次作业作说明。
预处理
在MyUmlGeneralInteraction类中进行预处理,将传入的elements分为按照classname索引的hashmap,每个classname对应的value是一个Arraylist数组。
将得到的hashmap传入类图处理类、状态图处理类、时序图处理类和有效性检查类生成的classModel、stateChart、collaboration和preCheck中。
对于UmlGeneralInteraction中的方法。在MyUmlGeneralInteraction的实现中只需要调用对应图对象的方法即可。
对于类图
类图相关的处理类包括MyClass、MyInterface、MyOperation、MyClassModelInteraction。其中MyClassModelInteraction为最顶层,MyClass、MyInterface为第二层,MyOperation为最底层。
MyClassModelInteraction中存放了MyClass、MyInterface、MyOperation的hashmap,MyClass、MyInterface存放了该类所拥有的MyOperation的ArrayList。
对于状态图
状态图相关的处理类包括MyStateChartInteraction、MyStateMachine、MyState、MyTransition。其中MyStateChartInteraction为最顶层,MyStateMachine为第二层,MyState为第三层、MyTransition为第四层。
MyStateChartInteraction存放了MyStateMachine、MyState、MyTransition的hashmap,MyStateMachine存放了MyState的hashmap,MyState存放了MyTransition的hashmap,MyTtrasition存放了trigger的ArrayList。
对于时序图
时序图的相关处理类包括MyCollaborationInteraction、MyInteraction、MyLifeLine。其中MyCollaborationInteraction是最顶层,MyInteraction为第二层、MyLifeLine为最底层。
MyCollaborationInteraction存放了MyInteraction、MyLifeLine的hashmap,MyInteraction存放了MyLifeLine的hashmap。MyLifeLine存放了对应的message的hashmap。
对于有效性检查
包括MyUmlStandardPreCheck类
将classModel、stateChart、collaboration三个实例化对象传入preCheck中,实现对应的方法时只需要调用对应图处理对象的方法即可,这些方法的主题逻辑都在最底层的类中实现。
总结自己在四个单元中架构设计及OO方法理解的演进
第一单元
在三次作业中逐步对对象化编程、继承和抽象有了深入了解。经过多次重构,到最后一次作业提交时整体设计已经不同于第一次作业的完全过程化。总体上架构是用item作为所有元素的父类、将所有运算元素都抽象为item。
第二单元
主要对多线程有了深入的了解,此外,我在这一单元对单例模式、观察者模式、生产者消费者模式等设计模式有了初步的了解,并进行了实践应用。总体上架构使用schedule将外部的waitingQueue元素分配到elevator的内部waitingQueue中,并通过elevator实现上下开关进出的所有操作。
第三单元
对JML规格、单元测试有了初步的了解。本单元主要是了解了如何根据规格实现代码并进行相关优化。总体上架构与所给规格一致。
第四单元
掌握Uml类图、时序图、状态图的入门知识。在这个单元中,我所有方法和类的实现都尽可能提取共性,相较于前三个单元的作业对象化程度更高,每次新增要求也很方便,可以说是尝到了对象化编程的好处。总体上架构在前文已有详细说明,故此处不再赘述。
总结自己在四个单元中测试理解与实践的演进
第一单元
用python实现了简单的自动评测机。
第二单元
用c语言+命令行管道的方法模拟时间戳测试。
第三单元
单元测试加对拍。
第四单元
主要是根据需要自己构造数据进行评测。
总体上了解了更多的测试方法,也能够写一些简单的评测机。
总结自己的课程收获
对于OO课程,我个人是又爱又恨,感觉我一直在抱怨作业的奇奇怪怪的要求,但每次也都挺下来了,而且那种经过长时间coding和debug后看到中测通过的喜悦感确实是无法否认的。印象中最深刻的一次就是电梯的第一次作业,正好碰上清明节假期,写加改总共花了2天,将近20多个小时,最后终于在助教和同学的帮助下成功通过了,也正是这一次痛苦的作业,让我对多线程的了解加深,使得电梯的第二第三次作业轻松通过。
我在OO课上最大的收获是学会了设计。如何设计继承使代码更加简洁,如何使用合理使用算法优化时间性能、如何在时间和空间上做权衡(本学期作业一般都是空间换时间)以及如何理清逻辑选择合理的设计方式等,这些都是本学期的OO课程教会我的,让我从之前的拿到需求就开始写、一个main函数干到底的菜鸟成长到现在能够用对象化的思想写出一份不那么难看的代码的菜鸟。从第一次作业一路摸爬滚打到圆满结束,离不开课程组老师和助教的教导和指点,也离不开同学大佬的分享帮助。最后,感谢OO课,让我体会到编程与交流的乐趣。
立足于自己的体会给课程提三个具体改进建议
1.希望训练课开放的时间和作业开放的时间能够错开。
2.建议部分中测数据可以增强一些。
3.建议最后一次作业和考期不要冲突,留出复习和修改bug的时间。