BUAA_OO_UNIT3_2020

第三次博客作业

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 简单的试探

image-20200519211436631

image-20200519211502425

显然是这样。

整个 Group

image-20200519212950488

JMLUnitNG/JMLUnit

image-20200520110129151

因此原因暂时无法分析,Group.java,但是可以分析简单程序,生成了测试文件。

image-20200520110322208

阅读代码,大概知道所用均为极端数据与正常数据排列组合的策略。

架构设计

完全按照JML的要求进行编写,要说架构设计那也是助教们的设计。

Bug及修复

BUG: 三次作业中共有一处bug,第三次作业:dijsktra求最短路径,初始值本应该为较大整数,但一时脑抽 初始化为2000,导致无法出现长于2000的路径,错了三个点。

修复:2000->2000000,replaceAll。

心得体会

JML使得每个方法仅关注自己的事情,且由明确的表述使得验证起来更为容易,不容易出现差错,极大提高了编写代码的速度,而且调理清晰出错率低,但是感觉不够简明,光是写JML规格都是一项大工程了,可能这也是其无法流行起来的原因吧。但是确实好处很大,在团队合作中,这种规格,在提升团队协作效率和正确性可以产生巨大的优势

猜你喜欢

转载自www.cnblogs.com/Wandy666/p/12922937.html