2021面对对象设计与结构 - 第四单元
UML是统一建模语言的简称,是一种编制软件蓝图的标准化语言。UML主要使用图形符号来表示软件项目的设计,为开发团队提供标准通用的设计语言来开发和构建计算机应用。
本单元主要的目的就是实现一个UML分析器,能支持对UML类图、UML顺序图和UML状态图的解析。
架构设计
在本单元里,我基本上都是使用HashMap
来存储数据。一般上我都会以id
为Key,以类为Value来存储,但对于那些需要以name
查询的类,我便会创建多一个以name
为Key,以idList
为Value的HashMap
来存储,这样也方便我检查name
是否有重复的。
第一次作业
因为本次作业只需要分析UML类图,所以MyUmlInteraction类里,只存储了MyUmlClass和MyUmlInteraction。而其他的如方法和属性则按它们之间的关系依次存储到对应的类/接口里。
第二次作业
本次作业不单需要分析UML类图,还需要分析UML顺序图和UML状态图,所以在MyUmlGeneralInteraction
里,增添了存储MyStateMachine
和MyUmlInteraction
的HashMap
。至于其他的元素,依然是按它们之间的关系和层次,存储到对应的元素里。
第三次作业
本次作业并没有在上次的作业的基础上,添加其他需要分析的元素,只是增加了对模型的有效性检查。所以在这次的作业中,我只在构造函数构建元素时,按照作业要求对元素进行检查,看是否有非法的元素,若有则将它们另存起来,并在之后的CheckAllRules时输出即可。因此相较于上次的作业,本次作业只新增了以下几个容器:
private HashSet<AttributeClassInformation> r001 = new HashSet<>(); private HashSet<UmlClassOrInterface> r002 = new HashSet<>(); private HashSet<UmlClassOrInterface> r003 = new HashSet<>(); private HashSet<UmlClass> r004 = new HashSet<>(); private boolean r005 = false; private boolean r006 = false; private boolean r007 = false; private boolean r008 = false;
架构设计和OO方法理解的演进
我认为在第一单元中,我对面向对象写法还是太陌生了,导致我很多方法还是按照之前的面向过程的思维方式写的。虽然在第一次作业中感觉差别不大,可是差别在之后的作业就慢慢显现出来了。尤其是在第三次作业中,代码错综复杂,代码重复性和复杂性都挺高的,也没实现到高内聚低耦合的标准。
结合了第一单元的经验和教训后,在第二单元动手写代码之前,我都会先想好架构,再动手写代码。第二单元主要实现的是多线程,个人认为除了刚接触多线程时的迷茫,其实多线程实现并不复杂。因为只要明白了死锁产生的原因,能有效地避开死锁,其实多线程并没有什么大坑,而且还能实现线程间的交互。
第三单元主要的是通过阅读官方给的JML实现类的接口。而对于本次单元的作业来说,其实最注重的不是接口的实现,而是接口实现的方式。因为只能要能读懂JML,接口的实现其实是没什么难度的,可是若要完美通过本次单元,则必须对类接口的实现有较高的要求。
而第四单元主要的是实现一个UML分析器。因此完成本次单元的前提是必须会一些UML的相关知识,才能有效地构造出一个能支持解析UML图地分析器。
测试理解与实践的演进
在每次作业中,我的测试方法其实都大同小异:
- 构造针对性数据
- 会针对每个方法构造出一个能测试功能和性能的数据。
- 构造边界数据
- 对拍
课程收获
个人认为这门课还是让我学到了蛮多的,可是却又很难具体地描述自己到底学了什么,可能是代码整体框架的设计方式,可能是写代码的思维方式,也可能是整体代码的可用性和灵活性提高了。反正每一单元都会让我感觉受益良多,但却又是从各个方面的,所以也很难具体地说在这门课里我究竟收获了什么。
改进建议
-
指导书
尤其是在第四单元里,个人认为可以再给更多的样例,让学生能更为直观地看清楚每条指令的相关要求和限制。因为明白很多东西是非常难用文字表达,而且写得太长,也可能会导致整体看上去非常绕,倒不如给多一点样例,让学生能根据样例来自行理解每条指令的要求和限制。
-
单元难度
相较于第一和第二单元,第三单元的难度其实降低了很多。不单是类接口的实现已经由官方提供了,就连大多数的类接口的实现方式都是较于简单、直接的。个人认为可以适当地增加更多难度较高的接口,以保持每一单元的整体难度。
-
实验课反馈
个人认为可以在实验课结束后,提供实验课的参考答案,让同学知道自己作答是否有误。因为每次实验课,同学们互相讨论后,有些题目还是存在异议的,所以建议课后可以提供答案,也能让做错的同学发现自己的错误。
感想
OO这门课终于来到了尾声,但却又有一丝丝的不舍,该不会是每个星期都被虐,已虐出感情了吧。真的非常感谢这门课,让我学到了很多,感觉每个星期都在作业堆里过得非常充实,而且助教人也超好的,最可惜的是我还是不能回到学校上课,只能接受线上授课。