OO第三单元总结——JML系列
一、设计策略
-
浏览JML规格,看大致实现了什么功能
-
完成MyPerson,MyGroup,MyMessage等耦合度比较低的类,进一步理解题目
-
完成异常类
-
实现MyNetwork类
-
进行优化
-
分辨出条件并使用
if语句分开
-
实现所有的
exceptional_behavior,抛出异常,剔除异常情况 -
阅读
normal_behavior,如果有多条就分类 -
对于每个方法识别出模式和背后的含义
二、测试策略
参考了往年的测试方式
JMLUnitNG:测试MyGroup方法

用Junit对函数进行单元测试
三、使用容器和架构设计
第一次作业
本次作业main中容器均使用的Arraylist,Exception类使用了HashMap。
MyPerson类除了继承Person类的方法,另外加了link方法,将有关人员加入acquaintance中。

第二次作业
本次作业main中的类有对应的尝试使用了HashMap但用时反而长,所以继续使用了ArrayList作为容器。
MyPerson除了继承接口外新添addFirstMessage方法。

第三次作业
下面仅为main部分的UML类图,除了添加方法外容器与前面差别不大。
关于图的构建与维护策略,基本上是按照jml的说明构造的,并没有特意想(菜鸡落泪)

四、性能问题
本单元二三次作业均出现了tle。
第二次作业性能分析如图所示,主要是MyNetwork和MyPerson类复杂度高。

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

tle原因分析:
-
isCircle、sendIndirectMessage、leastPathLength算法复杂度高。
-
一些O(n)复杂度的计算方法每次调用都重新计算。
-
后面一些方法用到了前面的方法,导致算法复杂度加和。
尽管使用了Dijkstra算法仍然tle,应该是前面一些地方算法不好。
五、感想
虽然感觉这次比前两个单元都简单,但强测结果是最差的,还是算法的锅(数据结构不牢,地动山摇,假期一定重学数据结构),另外大多照jml抄并没有太多可写的……

浙公网安备 33010602011771号