OO第三单元总结——JML系列

OO第三单元总结——JML系列

一、设计策略

  1. 浏览JML规格,看大致实现了什么功能

  2. 完成MyPerson,MyGroup,MyMessage等耦合度比较低的类,进一步理解题目

  3. 完成异常类

  4. 实现MyNetwork类

  5. 进行优化

在实现一个比较复杂的方法时:

  • 分辨出条件并使用if语句分开

  • 实现所有的 exceptional_behavior,抛出异常,剔除异常情况

  • 阅读 normal_behavior,如果有多条就分类

  • 对于每个方法识别出模式和背后的含义

二、测试策略

参考了往年的测试方式

JMLUnitNG:测试MyGroup方法

OO第三单元总结——JML系列

用Junit对函数进行单元测试

三、使用容器和架构设计

第一次作业

本次作业main中容器均使用的Arraylist,Exception类使用了HashMap。

MyPerson类除了继承Person类的方法,另外加了link方法,将有关人员加入acquaintance中。

OO第三单元总结——JML系列

第二次作业

本次作业main中的类有对应的尝试使用了HashMap但用时反而长,所以继续使用了ArrayList作为容器。

MyPerson除了继承接口外新添addFirstMessage方法。

OO第三单元总结——JML系列

第三次作业

下面仅为main部分的UML类图,除了添加方法外容器与前面差别不大。

关于图的构建与维护策略,基本上是按照jml的说明构造的,并没有特意想(菜鸡落泪

OO第三单元总结——JML系列

四、性能问题

本单元二三次作业均出现了tle。

第二次作业性能分析如图所示,主要是MyNetwork和MyPerson类复杂度高。

OO第三单元总结——JML系列

第三次作业main类性能分析如图所示,也是MyNetwork和MyPerson类复杂度高。

OO第三单元总结——JML系列

tle原因分析:

  1. isCircle、sendIndirectMessage、leastPathLength算法复杂度高。

  2. 一些O(n)复杂度的计算方法每次调用都重新计算。

  3. 后面一些方法用到了前面的方法,导致算法复杂度加和。

尽管使用了Dijkstra算法仍然tle,应该是前面一些地方算法不好。

五、感想

虽然感觉这次比前两个单元都简单,但强测结果是最差的,还是算法的锅(数据结构不牢,地动山摇,假期一定重学数据结构),另外大多照jml抄并没有太多可写的……

另外就像老师说的,考的太多心累所以互测不干活

上一篇:面向对象第三单元总结


下一篇:OO-第三单元总结-2021