OO2021 - 第四单元

2021面对对象设计与结构 - 第四单元

UML是统一建模语言的简称,是一种编制软件蓝图的标准化语言。UML主要使用图形符号来表示软件项目的设计,为开发团队提供标准通用的设计语言来开发和构建计算机应用。
本单元主要的目的就是实现一个UML分析器,能支持对UML类图、UML顺序图和UML状态图的解析。

架构设计

在本单元里,我基本上都是使用HashMap来存储数据。一般上我都会以id为Key,以类为Value来存储,但对于那些需要以name查询的类,我便会创建多一个以name为Key,以idList为Value的HashMap来存储,这样也方便我检查name是否有重复的。

第一次作业

因为本次作业只需要分析UML类图,所以MyUmlInteraction类里,只存储了MyUmlClass和MyUmlInteraction。而其他的如方法和属性则按它们之间的关系依次存储到对应的类/接口里。

OO2021 - 第四单元

第二次作业

本次作业不单需要分析UML类图,还需要分析UML顺序图和UML状态图,所以在MyUmlGeneralInteraction里,增添了存储MyStateMachineMyUmlInteractionHashMap。至于其他的元素,依然是按它们之间的关系和层次,存储到对应的元素里。

OO2021 - 第四单元

第三次作业

本次作业并没有在上次的作业的基础上,添加其他需要分析的元素,只是增加了对模型的有效性检查。所以在这次的作业中,我只在构造函数构建元素时,按照作业要求对元素进行检查,看是否有非法的元素,若有则将它们另存起来,并在之后的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图地分析器。

测试理解与实践的演进

在每次作业中,我的测试方法其实都大同小异:

  1. 构造针对性数据
    • 会针对每个方法构造出一个能测试功能和性能的数据。
  2. 构造边界数据
  3. 对拍

课程收获

个人认为这门课还是让我学到了蛮多的,可是却又很难具体地描述自己到底学了什么,可能是代码整体框架的设计方式,可能是写代码的思维方式,也可能是整体代码的可用性和灵活性提高了。反正每一单元都会让我感觉受益良多,但却又是从各个方面的,所以也很难具体地说在这门课里我究竟收获了什么。

改进建议

  • 指导书

    尤其是在第四单元里,个人认为可以再给更多的样例,让学生能更为直观地看清楚每条指令的相关要求和限制。因为明白很多东西是非常难用文字表达,而且写得太长,也可能会导致整体看上去非常绕,倒不如给多一点样例,让学生能根据样例来自行理解每条指令的要求和限制。

  • 单元难度

    相较于第一和第二单元,第三单元的难度其实降低了很多。不单是类接口的实现已经由官方提供了,就连大多数的类接口的实现方式都是较于简单、直接的。个人认为可以适当地增加更多难度较高的接口,以保持每一单元的整体难度。

  • 实验课反馈

    个人认为可以在实验课结束后,提供实验课的参考答案,让同学知道自己作答是否有误。因为每次实验课,同学们互相讨论后,有些题目还是存在异议的,所以建议课后可以提供答案,也能让做错的同学发现自己的错误。

感想

OO这门课终于来到了尾声,但却又有一丝丝的不舍,该不会是每个星期都被虐,已虐出感情了吧。真的非常感谢这门课,让我学到了很多,感觉每个星期都在作业堆里过得非常充实,而且助教人也超好的,最可惜的是我还是不能回到学校上课,只能接受线上授课。

OO2021 - 第四单元

上一篇:leetcode 474. 一和零


下一篇:centos 安装gitblit