一.梳理JML语言的理论基础、应用工具链情况
形式化方法是保证软件正确性和质量的另一种重要方法。目前,许多基于JML[1~3]的验证、调试和测试工具已经非常成熟。
JML是一种为Java量身定做的形式化的行为接口规范语言(BISL),用来规范Java程序模块(如类和接口)的行为及详细设计决策。它沿袭了BISL良好定义的形式语义,同时也继承了DBC语言较强的执行能力。
使用JML书写的形式化的接口规范可以推动程序的自动化测试,减少单元测试的负担。
目前,许多基于JML的验证、调试和测试工具已经非常成熟,例如运行时刻的断言检查器(RuntimeAssertionChecker)、JmlUnit、JMLAutoTest等等。
利用这些支撑工具,JML规范可以被翻译为可识别的程序代码,并被动态断言检查器检验,也可以进行测试框架、测试用例等的自动生成。
二.部署JMLUnitNG
测试类Test.java
运行结果
可以看出测试的数据并不随机,只是将int的上下界以及0排列组合作为测试数据,只有边界测试,不能很好的验证程序
三.按照作业梳理自己的架构设计,并特别分析迭代中对架构的重构
第九次作业
第九次作业中参考了讨论区大佬的方法,MyPath类用Arraylist和Hashmap存储nodes,MyPathContainer类用双Hashmap来存储path
第十次作业
第十次作业的MyGraph类没有采用继承,主要是在MyPathContainer类的基础上加入了floyd算法计算最短路径并采用邻接矩阵存储,并用Adjacency类来存储直接相连的边。
第十一次作业
第十一次作业的MyRailwaySystem继承了MyGraph类,依然使用floyd算法计算最短换成次数等结果,写完后发现四种不同结果的算法相同,只是权值不同,没能很好的做到代码的复用
四.按照作业分析代码实现的bug和修复情况
三次作业的强测与互测均未发现bug。
五.阐述对规格撰写和理解上的心得体会
使用JML来声明性地描述一个方法或类的预期行为可以显著提高整体的开发进程。把建模标记加入到你的Java程序代码中有以下好处:
1.能够更为精确地描述这些代码是做什么的
2.能够高效地发现和修正程序中的bug
3.可以在应用程序升级时降低引入bug的机会
4.可以提早发现客户代码对类的错误使用
5.可以提供与应用程序代码完全一致的JML格式的文档
但是在三次作业中也出现了几次对规格更改的情况,说明对于一个略复杂的方法,写出一个正确的规格的难度还是很大的。特别是在第十一次作业中,
原本在数据结构已经学过的最短路径等概念,但是在读规格时读了很多次才完全看懂,其中也为了更好的描述规格而引入了一些不用实际实现的方法,
反而有增加难度的嫌疑。
不过本单元重点不在于jml的使用,也不是为了找出它的缺陷,更重要的是理解其思想,在这一方面我认为是非常有作用的。