代码改变世界

OO第三单元总结

2019-05-21 21:23  ilatei  阅读(172)  评论(0编辑  收藏  举报

1、JML语言的理论基础和工具链

JML(Java Modeling Language)是一种行为接口规范语言。这类的规范通常被称作面向模型,既规定了方法或抽象数据类型的接口,也规定了它们的行为。

SMT solver:使用SMT solver工具可以静态分析代码,检查代码对规格的满足情况

JMLUnitNG:基于jml来自动生成测试用例。

2、 部署SMT Solver

3、部署JMLUnitNG/JMLUnit

自动生成的测试样例大多是边界数据,如null、0、整形的最大值与最小值。

4、作业架构

4.1 第一次jml作业

使用了三个hashmap,myPathHashMap通过id来寻找path,nodeMap用来保存每一个点出现的次数,为了提高通过path找id的速度,我使用了verHashMap。

类图如下

4.2 第二次jml作业

第二次作业在第一次的基础上主要加入了最短路径的计算,难点是如何降低时间复杂度,我使用了最原始的dijistra并将所有点的id映射到1-200之间,这样就可以使用邻接数组来保存图。每一次计算出出发点到所有其他点的距离,并将这些值保存到shortest数组中。

 

4.2 第三次jml作业

第三次作业在第二次的基础上主要加入了票价、换乘、不满意度的计算和连通块数的计算,与第二次同样的思路,对于每一个需要计算的东西维护一个邻接矩阵和一个结果矩阵。我没有使用拆点的方法,而是把每一条路径看作一个点,提前把一条路径中相应需要求的东西求出。

 

5.bug及其修复

第一次作业比较简单,没有出现bug;第二次作业我使用了Java的set遍历,速度意外地慢,导致了tle,然后我把储存结构改为数组就修复了bug;第三次我沿用第二次的设计没有出现什么bug。

6.总结

这个单元主要学习了规格的使用,规格要求一个结构的require和result等,这样就可以保证设计的实现的正确性,但是比较复杂的函数的规格很难写得简洁而且正确,在完成作业的过程中,事实上我也没有着重去研究给出的jml规格具体是怎么描述的,换句话说jml对于怎么实现功能的帮助不大,它的意义在于能够用于生成样例检测模块的正确性。