一:梳理JML语言的理论基础、应用工具链情况
1.理论
1.1 简介:
JML是用于对Java程序进行规格化设计的一种表示语言,是一种行为接口规格语言。
1.2 用法:
(1)开展规格化设计。这样交给代码实现人员的将不是可能带有内在模糊性的自然语言描述,而是逻辑严格的规

写好程序后,src目录下执行命令行
结果如下

从结果可以看出:测试数据进行了边缘测试,并且结果符合预期,但是貌似测试的重点在于数据溢出以及对象为空等方面,程序逻辑似乎并没有很注重检测(Maybe this test case is too simple!)。

1.2度量
本次作业共三个类,除了主类,剩下的两个类均为作业要实现继承的类,并无多余方法,只实现了要求的方法。
复杂度:各类复杂度均比较低。

2.2度量
本次作业共6个类,这次作业主要求最短路径,于是我建立了一个Minpath类,用来接受图,并进行最短路的计算,Graph里增加了建图的方法,采用邻接表数据结构。
复杂度:由度量图可得各种复杂度都较低。
重构:本次作业只增加了一个专门接受图并提供求最短路方法的类,并没有重构。

3.2度量
本次作业共6个类,这次作业新增了查询不满意度,最小票价等功能,实际上这些查询都能通过拆点转化为求最短路问。
复杂度:由度量图可得除了ev(G)稍稍比上次升高一些,其他复杂度依旧保持较低。
重构:本次作业依旧采用Minpath这个类接受图并计算最短路,而新增的查询方法都能通过把原来的图进行拆点转化为求最短路问题,因此只需要在Minpath里面新增一个把图进行 拆点得到新的图的方法即可,所以本次作业依然没有重构。
四:按照作业分析代码实现的bug和修复情况
前两次作业均没有bug,第三次作业由于那段时间别的课作业很多,因此写完了代码后交上去把中测过了就去完成别的科目的DDL去了,没有时间进行单元化测试,结果导致强测成绩火葬场,一片wrong answer,心里一阵凉凉,回去分析bug发现,是remove path的时候,某个图忘了更新了,其他图都进行了更新。虽然这个伤心的结局是因为没有时间测试导致的,但通过这里也可以看出测试对于程序的极其重要性!
五:心得体会
这三次作业的难度以及复杂度是逐渐递增的,观察容易发现,三次作业的规格代码越来越长,越来越复杂,尽管如此,一个可靠的工程代码少不了规格的帮助,有了JML,可以从逻辑上对每一个方法进行检测,例如检查repok等,使得找出bug变得容易。
最后,感谢助教和老师们的辛勤付出!