一、JML语言理论基础,应用工具链情况
1.1JML语言的理论基础
JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言。JML是一种行为接口规格语言(Behavior Interface Specification Language,BISL),基于Larch方法构建。JML将注释添加到 Java 代码中,这样就可以确定方法所执行的内容,而不必说明它们如何做到这一点。有了 JML,就可以描述方法预期的功能,无需考虑实现。通过这种方法,JML 将延迟过程设想的面向对象原则扩展到了方法设计阶段。
JML以javadoc注释的方式来表示规格,每行都以@起头。有两种注释方式,行注释和块注释。其中行注释的表示方式为 //@annotation ,块注释的方式为 /* @ annotation @*/ 。
JML的表达式是对Java表达式的扩展,新增了一些操作符和原子表达式:
原子表达式
\result:表示一个非 void 类型的方法执行所获得的结果
\old( expr )表达式:用来表示一个表达式 expr 在相应方法执行前的取值
量化表达式
比如\forall, \exists, \sum等
JML方法规格的核心内容包括三个方面,前置条件、后置条件和副作用约定。前置条件是对方法输入参数的限制,后置条件是对方法执行结果的限制,副作用指方法在执行过程中对输入对象或 this 对象进行了修改(对其成员变量进行了赋值,或者调用其修改方法)。
一般而言,JML语言有两种主要的用法:
(1)开展规格化设计。这样交给代码实现人员的将不是可能带有内在模糊性的自然语言描述,而是逻辑严格的规格。
(2)针对已有的代码实现,书写其对应的规格,从而提高代码的可维护性。这在遗留代码的维护方面具有特别重要的意义。
1.2应用工具链
JML有相应的工具链,便于实践者和学生使用该工具去指定和验证Java程序。常用的是openjml:
openjml,其使用SMT Solver来对检查程序实现是否满足所设计的规格(specification)。目前openjml封装了四个主流的solver:z3, cvc4, simplify, yices2。
JMLUnitNG,可以根据JML自动生成对应的测试样例,用于进行单元化测试。
二、架构设计
第一次作业
按照作业要求,设计了三个类,分别为Main类,MyPath类,MyPathContainer类。
第二次作业
第二次作业在第一次作业的基础上,新增了间结点是否有边,是否相连以及最短路径的指令。
第三次作业
在第二次作业的基础上,新增了连通块数量、最低票价、最少换乘、最少不满意度4条指令。
四、Bug分析
第一次作业:
出现了超时现象,算法效率较低。
第二次作业
设计仓促,强测错误较多
第三次作业:
由于设计比较仓促,只能勉强完成,强测错误很多。
这个单元的作业,因为个人时间的限制,在通过中测后,没有进行充分的调试,bug较多。在理解JML时出现了考虑不周的情况,而且算法效率也没有进行优化,只保证了基本的正确性。
五、心得与体会
JML的语言的优势是不言而喻的,作为对Java程序进行规格化设计的一种表示语言,在大型工程和团队开发中,会起到很大的作用,因为其确保了每个模块的准确性,避免了不必要信息或错误信息的产生和传达。通过对JML的学习,我了解了契约式设计的重要性,通过规格的撰写,能够明确各类及方法需要实现怎样的功能,一方面使得代码实现人员能够根据规格完成代码,另一方面能够提高代码的可维护性,使得维护人员能够迅速理解各个方法的功能。