BUAA OO Unit4
面向对象构造与设计第四单元总结
本单元三次作业的内容为实现一个UML类图分析器,并借助本单元的作业了解UML类图、顺序图、状态图的构成要素及其解析方法。总体来说难度并不高,架构设计相对前两个较为简单,代码实现也较为容易,但对UML的理解却是学习的重点,如果在理解时出现了偏差,则可能在解析时出现错误。
本单元作业的架构设计
本单元作业的是基于课程组已实现的代码进行的,其实相对来说更加复杂的解析mdj格式文件的部分已由官方代码实现了,留给我们的是相对简单的分析各个UML元素之间的关系的任务,因此,如何利用好官方代码中的接口梳理出各个UML元素的关系是本单元作业架构设计的关键。
如果仅从方便实现的角度考虑,各个元素的关系完全可以使用java中的容器来存储,但这样设计没有任何层次,随着迭代次数的增加代码的实现也会越来越繁琐,不符合面向对象的思想。因此在本次作业中,采用了一种类似树形的结构,如下图所示,对于每个非最底层的元素,设计一个新的类对其进行封装,并利用组合的形式,将官方的接口包含在其中。这样设计有两个好处,一是可以清楚地分出各个元素的层次,二是在增加所查询的关系时只需找到对应元素的上一层添加相应的容器存储关系即可。

对于解析器具体的实现,设计为解析+查询的结构,由于本次作业的重点并不在执行速度,因此在解析时使用多次循环,由高层次向低层次逐层解析,并在相应的层次中配备查询方法。
四个单元中架构设计、OO方法及测试理解的演进
第一单元
第一单元由于刚开始接触面向对象的编程,扩展性考虑的较少,因此在架构设计上做的并不是太好,仅用数组实现了各个项的存储,在第二次作业时不得不进行了重构。但重构后有所进步,设计了树形结构存储表达式,并用HashMap存储求导结构进行化简,第三次作业架构设计基本沿用上一次的设计。整体架构如下:

第一单元由于重构花费了时间,并没有过多的考虑测试,仅仅利用python的rstr包中的xeger函数写了一个简单的测评机进行黑箱测试,虽然有一定效果,但是没能做到全面覆盖,导致出现了一处bug。
第二单元
第二单元的重点是多线程,而对于架构设计基本有两种:集中式和分布式,由于有了第一单元的经验,因此在第二单元时慎重考虑了架构设计,并为了能够进行比较,分别实现了集中式和分布式的架构。最后经过三次作业的比较,发现集中式由于共享一个请求队列可以实现更高的性能,而分布式虽然性能不如集中式但扩展性要更好一些,更加符合面向对象的设计思想。最后在进行了全面测试的前提下,为了追求性能还是提交了集中式的设计,也因此取得了较高的性能分。本单元的架构设计是较为满意的一单元,并且在研讨课上分享了这两种设计架构的思考。两种架构的如下:
集中式

分布式

第二单元在测试方面也投入了一定的精力,首先是参考评论区的方法实现了本地定时投放数据,其次,通过构造不同顺序的请求队列全面测试了各个调度、换乘算法的性能优劣,对构造全面的测试数据有了初步的接触。
第三单元
第三单元的架构设计并不像前两个单元完全由自己设计,因此难度也降低了不少,重点是对于JML的理解,而架构设计上只是设计了一些缓存变量以提高查询速度。类图如下:

第三单元在测试方面,除了自行构造数据进行全面测试以外,还用python写了对拍机,与同学的程序进行对拍。这样双重的测试效果较好,在本单元三次作业的强测中均未出现bug。
第四单元
第四单元的架构设计在第一部分已经提及,简单来说就是“树形结构+组合”的架构设计,虽然相对来说有些繁琐,但各个元素之间层次清晰,也较好地体现了面向对象的设计思想,扩展性也相对更好。
第四单元的测试与第三单元基本一致,自行构造数据+对拍,遗憾的是最后一次作业由于考期时间紧张,没有进行充分的测试因而导致出现了一个bug,也在课程的最后再次提醒了我测试的重要性。
课程收获
经历了四个单元的OO训练,不仅熟练掌握了java语言、基本具备了面向对象的设计思想、学习了JML和UML、了解了测试相关的内容,还在课程中学到了很多小的知识点,比如正则表达式、递归下降、各种算法、python语法(测评机),感觉收获满满。回想当初寒假在家做预习作业时,抓耳挠腮地研究引用和克隆的区别,和如今相比可谓天差地别。总之,OO课程是一次很棒的体验。
课程改进建议
-
感觉第一单元难度略高,导致没有足够经历去思考如何更好地面向对象,而是花费大量时间去用面向过程的方式保证程序的正确性和性能,或许降低求导的难度,增加其他一些更明显体现面向对象的内容,更能帮助我们顺利入门。
-
第三单元设计三次实现JML规格的作业感觉有些多余,而且官方代码的规格也出现了一些锅,似乎保证JML规格本身的正确性也是值得思考的问题,或许可以考虑将其中一次作业改为JML规格的实现?
-
关于训练,似乎更多的是关于实验的训练,完成训练对于作业的帮助除了了解基本的内容,对架构设计、面向对象的设计帮助并不大,如果在训练中更多的体现对于架构设计、面向对象的引导,我觉得训练的效果会更好。
-
以及实验能否公布一下参考答案或者某种形式的反馈,否则感觉做完就忘了帮助不大...
最后特别感谢一下助教大大,真的给了我很多的帮助:)

浙公网安备 33010602011771号