第四单元总结

本单元实现了一个UML解析器,支持对UML类图、状态图、顺序图的解析,以及简单的规范性验证。

1. 架构设计

本单元中仍然进行了层次化设计。由于输入的UMLElement是无层次结构的元素集合,因此架构重点是根据类图、状态图、顺序图的各种元素的逻辑关系,为他们进行建模,重新组织起层次化关系。

具体来说,我将类图、状态图、顺序图分成三个部分进行存储。顶层类是MyImplementation,持有MyClassMyInterfaceMyInteractionMyStateMachine等图示的顶层类。对于类图而言,MyClass中储存着类中的方法Operation、属性Attribute,方法中又储存着参数Parameter,构建出了如图所示的类型树。对于顺序图和状态图,也是用相同的方法,按照从属的逻辑关系(其实也近乎是UML中的_parent字段建立起的树)建立起了类型树。

这种架构有以下两个特点:

  1. 所有类都直接或间接地继承自MyElement。该类主要功能是重写了equals方法,该方法严格按照id的等价性给出两个类的等价性,可直接通过该方法判断所有自建类型对象是否为同一个,也为直接使用HashSet等容器提供了遍历与正确性保证。
  2. MyClassMyInterface继承GeneralClass(广义类),MyFinalStateMyPseudoState继承MyState,使逻辑上相似的对象间有继承关系,支持向上转型,给一些函数的设计(例如判断循环继承、连通性等)带来了遍历。

2. 四个单元的设计思想

四个单元中贯穿始终的是”层次化设计“的思想。从第一单元开始,将现实生活中的实际模型按照层次结构进行建模并编程,体会到了”面向对象“设计思想的强大。这种设计思想让程序的设计可以直接站在实际模型上进行,而不用进行转换和进一步抽象。第二单元涉及到了多线程的程序设计,也需要站在实际问题的模型上进行建模,编码上让需要”同时“进行的对象继承Thread类或Runnable接口,并描述这些对象的特征。第三单元有关JML规格,在作业完成过程中涉及到了如何抽象出工具类以复用相关的数据结构。第四单元和第一单元类似,也需要考虑元素间实际逻辑关系,设计合理的架构(继承关系等),从而方便编码。在这几次作业中,我基本都提前完成了设计,画好了类图,之后再进行编码,这让我的架构整体没有进行过重构,维护成本较低。

3. 四个单元的测试

这四个单元中,我都使用的是整体生成测试数据进行对拍的方式进行测试。前两个单元中,使用这种测试方法是有好处的,在数据量大、覆盖率高的情况下,也可以测试多线程程序的并发问题。在第三单元中,所有方法均有JML规格,此时十分适用单元测试,通过依次保证每个方法的功能与设计相同,来保证整体的程序实现与JML规格化设计一致。然而,过于简单的方法、一周一次的作业让我没有选择单元测试。在这个单元中,我也体会到了关于”设计“和”实现“两个软件设计环节的联系。

4. 课程收获及建议

可以感受到OO课程组的良苦用心,总共16次作业,每次作业的描述严谨、作业量比较大,让我的软件能力有了提升。同时也促进我思考了很多关于计算机领域的工程方法,相信可以在软件设计这一领域之外也有所收获。对课程的建议有:

  1. 在Pre可提早开发,增加内容和资料,让感兴趣、没有基础的同学可以尽快上手,理解重要思想
  2. 第三单元可不使用传统的作业+强侧这种方式,让同学们动手写JML规格、进行单元测试等
  3. 实验课增加反馈
posted on 2022-06-29 14:35  StyWang  阅读(23)  评论(0编辑  收藏  举报