BUAA_OO_第四单元总结(UML)
第四单元架构设计
本单元作业由于并没有什么迭代难度,只需要根据新需求添加相应的解决方案即可,因此并没有出现像第一单元,第二单元那样难以预测新增需求导致重构的问题。因此,这里只选取本单元最后一次作业的架构来说明。
架构图

架构说明
在本单元实现时,我选择了按需架构的方式,根据每条指令的实现需求,来设计数据结构。
-
第一次作业只需要分析类图,只有上面提到的
MyUmlClassModelInteraction类,在类中,有11条指令,其中涉及到树的遍历的算法,较为基础。
-
第二次作业则在第一次作业类图解析的基础上新增了状态图和顺序图的解析。虽然指令数目不多,但是算法方面要求有所提高,包括深搜广搜算法,图的遍历等。因此我选择了构建
MyUmlStateChartInteraction类和MyUmlCollaborationInteraction类来实现新增指令,这两个类与之前的MyUmlClassModelInteraction类为同级关系,用MyUmlGeneralInteraction类来继承前述三类,在MyUmlGeleralInteraction类中对MyUmlElement进行分类处理。
-
第三次作业增加了合法性检查,我的做法是新建
MyUmlStandardPreCheck类继承MyUmlStandardPreCheck接口,先对UmlElement进行检查,然后再进行后续指令操作。
总体而言,本单元架构较为简单,难点在于对指导书的理解上。往往会遇到对指导书要求理解不到位而不知所措的情况,不过好在有讨论区。通过讨论区,我解决了大部分问题。
四个单元架构设计及OO方法理解的演进
第一单元 表达式求导
因为之前并没有接触过Java,因此,第一单元对我来说上手很困难,不过,现在来看,感谢当初的自己每个周末的连续两天对OO的钻研,上手之后,后面单元显得不那么困难了。
由于之前并没有面向对象的方法,上课时,对老师所提到的1+1的问题理解并不是很深刻,不明白为什么需要把加法当作一个类,现在来看,把加减乘除乘方当成运算类,传入两个表达式,输出结果的方法显得非常优雅,无论是在可迭代性还是鲁棒性方面,较之于我之前写的C代码都有很大的提高。
本单元作业存在不足如下:
-
代码风格不够规范。
-
没有建立面向对象的思想方法,导致在完成该单元作业时时常出现逻辑混乱的问题。
-
正则表达式运用不熟练。
第二单元 多线程电梯
通过第一单元的训练,我对OO单元的代码量有了一定的思想准备,在本单元三次作业的迭代过程中,并没有出现第一单元的重构问题,在动手写代码之前,我首先在脑海里对线程的构建,运行有了一定的认识,然后再开始实现,因此,整个单元三次作业过程中,我的思路还算清晰,采用生产者消费者模式,构建一个调度器来分配请求,另外,对锁的运用也通过这一单元入门了。
不足之处:
-
没有充分考虑设计的SOLID原则。
-
对锁的使用不熟悉,导致再第二次作业中出现了与之先骨干的bug。
第三单元 JML规格
本单元实际上只需要根据JML规格来实现对应的方法,虽然较为简单,但是,我的收获却不少。
首先,由于本单元的架构已经建好,虽然省却了架构的难题,但是,通过阅读已经有的代码,我学到了一个优秀的架构应该如何设计,这一单元是我学OO架构的一个极好的例子。
其次,通过本单元的训练,我巩固了数据结构中图的相关算法知识,并用Java语言实现了一遍。
不足之处:
-
没有充分运用面向对象的思想来实现指令需求。
-
算法实现没有考虑性能,一开始只是一味的翻译JML规格描述,性能低下。
第四单元 UML图
本单元的架构中,采用了接口的方式,用类来实现接口。用不同的类来实现相应指令。架构方法前面已经提到,不再赘述。
不足之处:
-
本次架构并不太理想,考虑较多的指令数目,但却并没有用很好的方法来实现指令的查询,而是把所有方法都用一个类来实现,导致一个类的长度太长,显得十分臃肿。
四个单元中测试理解与实践的演进
-
第一单元 表达式求导 测试主要是构造特殊数据,如-1,大数等考察边界数据的正确性。因为对数据的敏感性,我在自己的架构中着重测试了边界数据,正确性较高。
-
第二单元 多线程电梯 测试主要是构造数据考察性能,即能不能在规定时间内处理完所有请求。虽然我考虑了很多情况,但是,千虑难免一失,在性能测试上我考虑的还不周到,导致在互测,强测中因为性能被hack。
-
第三单元 JML规格 测试主要分为两方面:正确性和性能。正确性方面并没有什么错误,毕竟有规格说明。成也萧何败也萧何,因为有规格说明,因此并没有过多考虑,直接按照说明翻译成Java,这也导致性能上没有作过多的优化,在评测中出现了因为性能而CTLE的情况。
-
第四单元 UML图 测试主要在于完备性,考虑各种极端情况,因为,大多数人的代码对于正常情况都能保证正确性,但是,对于各种特殊情况,如继承关系中存在环,如果在搜索时不作标记,就会死循环,又如,重复继承一个类,如果用HashSet类存,则会自动去重,在第三次作业中检测正确性时会出现问题。
课程收获
另外,通过OO的学习,我的能力有了一定的提高,虽然比起别人而言或许这点能力不算什么,但是,我自己觉得有提高就够啦。
改进建议
-
实验课后能够给出正确答案以及讲解解析。
-
每单元结束后能够给出优秀代码模板以及推荐架构方式,便于在以后的作业中有意模仿,从而提升自己的架构能力。
-
指导书能够写的更加清晰。
浙公网安备 33010602011771号