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抄并没有太多可写的……
另外就像老师说的,考的太多心累所以互测不干活