第三次博客作业
JML语言的理论基础、应用工具链情况
JML(Java Modeling Language)—— java建模语言,是一种行为接口规范语言( behavioral interface specification language, BISL)。同时,JML也是一种进行详细设计的符号语言,它鼓励你用一种全新的方式来看待Java的类和方法,既规定了方法或抽象数据类型的接口,也规定了它们的行为。
注释结构 |
---|
//@ annotation 行注释 |
//@ annotation/ 块注释 |
原子表达式 | |
---|---|
\result | 表示返回值 |
\old(x) | 表示x在该方法运行前的取值 |
\not_assigned(x,y,...) | 表示括号内对象不被赋值 |
\not_modified(x,y,...) | 表示括号内对象不被修改 |
nonnullelements(container) | 表示container的存储对象没有null |
type(x) | 表示x的类型 |
typeof(x) | 表示x的准确类型 |
量化表达式 | |
---|---|
\forall | 全称量词 |
\exists | 存在量词 |
\sum | 一组对象的和 |
操作符 | |
---|---|
expr1<==>expr2 | 等价关系操作符 |
expr1==>expr2 | 推理操作符 |
\nothing | 空操作符 |
\everything | 全部对象操作符 |
方法规格 | |
---|---|
requires X | pre-condition |
ensures X | post-condition |
assignable | 赋值 |
pure | 关键字 |
singals | 子句 |
openJML,情况如下:
SMT Solver验证
First 简单的试探
显然是这样。
整个 Group
JMLUnitNG/JMLUnit
因此原因暂时无法分析,Group.java,但是可以分析简单程序,生成了测试文件。
阅读代码,大概知道所用均为极端数据与正常数据排列组合的策略。
架构设计
完全按照JML的要求进行编写,要说架构设计那也是助教们的设计。
Bug及修复
BUG: 三次作业中共有一处bug,第三次作业:dijsktra求最短路径,初始值本应该为较大整数,但一时脑抽 初始化为2000,导致无法出现长于2000的路径,错了三个点。
修复:2000->2000000,replaceAll。
心得体会
JML使得每个方法仅关注自己的事情,且由明确的表述使得验证起来更为容易,不容易出现差错,极大提高了编写代码的速度,而且调理清晰出错率低,但是感觉不够简明,光是写JML规格都是一项大工程了,可能这也是其无法流行起来的原因吧。但是确实好处很大,在团队合作中,这种规格,在提升团队协作效率和正确性可以产生巨大的优势