OO Unit3 JML总结

OO第三单元——JML总结

一、JML语法总结

Java建模语言(JML)是一种行为接口规范语言,可用于指定Java模块的行为 。它结合了Eiffel的契约方法设计和 Larch 系列接口规范语言的基于模型的规范方法 ,以及细化演算的一些元素 。

契约设计和JML(由Gary T. Leavens和Yoonsik Cheon撰写) 的草案 解释了JML作为Java合同设计(DBC)语言的最基本用法。

下面是一些基本的语法梳理

①注释结构块
1 /@ annotation
2 @ annotation
3 @ annotation
4 @
/
②原子表达式

  • \result表达式:表示一个非void 类型的方法执行所获得的结果,即方法执行后的返回值。

  • \old( expr )表达式:用来表示一个表达式expr 在相应方法执行前的取值。【任何情况下,都应该使用\old把关心的表达式取值整体括起来。\old(v.size()) 和\old( v ). size() 有相同的结果但是会倾向使用前者】

  • \not_assigned(x,y,...)表达式:用来表示括号中的变量是否在方法执行过程中被赋值

  • \not_modified(x,y,...)表达式:与上面的\not_assigned表达式类似,该表达式限制括号中的变量在方法执行期间的取值未发生变化。

  • \nonnullelements( container )表达式:表示container 对象中存储的对象不会有null

  • \type(type)表达式:返回类型type对应的类型(Class),如type( boolean )为Boolean.TYPE。

  • \typeof(expr)表达式:该表达式返回expr对应的准确类型。如\typeof( false )为Boolean.TYPE

③量化表达式

  • \forall表达式:全称量词修饰的表达式,表示对于给定范围内的元素,每个元素都满足相应的约束。

  • \exists表达式:存在量词修饰的表达式,表示对于给定范围内的元素,存在某个元素满足相应的约束。

  • \sum表达式:返回给定范围内的表达式的和。

  • \product表达式:返回给定范围内的表达式的连乘结果。

  • \max表达式:返回给定范围内的表达式的最大值。

  • \min表达式:返回给定范围内的表达式的最小值。

④集合表达式

⑤操作符

  • 子类型关系操作符: E1<:E2 ,如果类型E1是类型E2的子类型(sub type),则该表达式的结果为真,否则为假。如果E1和E2是相同的类型,该表达式的结果也为真,如Integer.TYPE<:Integer.TYPE 为真;但Integer.TYPE<:ArrayList.TYPE 为假。需要指出的是,任意一个类X,都必然满足X.TYPE<:Object.TYPE 。

  • 等价关系操作符: b_expr1<>b_expr2 或者b_expr1<=!=>b_expr2 ,其中b_expr1和b_expr2都是布尔表达式,这两个表达式的意思是b_expr1b_expr2 或者b_expr1!=b_expr2 。可以看出,这两个操作符和Java中的和!= 具有相同的效果,按照JML语言定义, <> 比== 的优先级要低,同样<=!=> 比!= 的优先级低。

  • 推理操作符: b_expr1>b_expr2 或者b_expr2<b_expr1 。对于表达式b_expr1>b_expr2 而言,当b_expr1false ,或者b_expr1true 且b_expr2true 时,整个表达式的值为true 。【这一种和代码的if是相对应的】

  • 变量引用操作符:除了可以直接引用Java代码或者JML规格中定义的变量外,JML还提供了几个概括性的关键词来引用相关的变量。\nothing指示一个空集;\everything指示一个全集,即包括当前作用域下能够访问到的所有变量。

⑥方法规格

  • 前置条件通过requires子句来表示: requires P;

  • 后置条件通过ensures子句来表示: ensures P;

  • 副作用约束子句,使用关键词assignable 或者modifiable

⑦类型规格

  • 不变式(invariant)是要求在所有可见状态下都必须满足的特性,语法上定义invariant P ,

  • 状态变化约束(invariant)只针对可见状态(即当下可见状态)的取值进行约束,而是用constraint来对前序可见状态和当前可见状态的关系进行约束。

二、工具链情况

【官方】断言检查编译器(jmlc),单元测试工具(jmlunit),以及了解JML规范的javadoc(jmldoc)增强版本。

【推荐】OpenJML(静态检查)、自动check JML规格文档并生成报告、JMLunitNG(自动化测试)

【普适】Junit自动化测试,编写测试用例,覆盖度测试。

具体的内容不在此具体阐述,可以参考讨论区大佬的分享

三、三次作业总结

设计方面

数据管理方面,由于数据量方面的差别,我使用Hashmap容器存储person类,用ArrayList存储Group。三次作业都没有进行较大的结构变化。

自我反省

本单元在写的时候缺少了对层次和图管理方面的考虑。

第一次作业

由于只是机械的按照JML来完成的代码,对自行添加的代码没有添加JML规格并进行测试,在强测中出现了重大bug,导致程序出现了死循环。强测点全部挂掉了。

第二次作业

在本次作业中我吸取了上一次作业的教训,进行了较充分的自动化测试,因此本次作业完成情况较好。

第三次作业

在本次作业中,在算法方面耗了很多时间,对其他的方法测试不够充分,导致在dfg方法中出现了除零的现象。此外,对规格的理解出现了问题,在互测被hack出了问题。
此外,为了较为方便的实现dijkstra算法,另外增加了实现算法的类,单独进行数据处理。
在qbs方面,我维护了一个Hashmap:root存储键值对,并在添加关系时更新root,这样一方面qbs只需要计算root中存储的非重根节点id个数,第二,qsl和qmp可以很方便的获得同一连通图内的节点。

你可能感兴趣的:(OO Unit3 JML总结)