OO第三单元总结
一、JML介绍及工具链
(一)JML理论
The Java Modeling Language (JML)是一种行为接口规范语言,可用于指定Java模块行为。使用JML可以对Java程序模块的行为进行准确和明确的描述,也允许人们不仅记录公共接口和行为,也记录一些详细的决策细节。
JML的语法内容非常丰富,具体可参考 http://www.eecs.ucf.edu/~leavens/JML/jmlrefman/jmlrefman_toc.html 这一官方手册(打不开不怪我~),在此仅对课程设计的重点部分做简单说明。
1、注释结构
和一般注释相比添加了@
行注释为://@
块注释为:/*@ ...something...@*/
2、方法规格
前置条件(requires):对输入参数的要求。
后置条件(ensures):对所得结果的要求。
副作用:执行过程中允许对某些变量进行修改。
3、表达式
(1)原子表达式
\result:表示执行时返回的结果。
\old(expr):执行相应方法前表达式expr的值。
(2)量化表达式
\forall:对于给定范围内的所有元素。
\exists:给定范围内存在某元素。
\sum:给定范围内的表达式和。
\max(min):给定范围内表达式的最大(最小)值。
4、操作符
等价:<==>
不等价:<=!=>
推理:==>
5、约束类型:
Invariant(不变式):要求在所有可见状态下必须满足的特性。
Constraint(状态变化约束):对前序可见状态和当前可见状态的关系进行约束。
(二)JML工具链:
SML solver: 检验代码等价性(试了好多次都出内部bug)。
OpenJML:代码规范化检查。
JMLUnitNG:侧重边界条件的检查。
JMLUnit: 课上讲过,个人感觉很实用,即使是在不写JML的情况下。爱了爱了。
二、SMT Solver
我对SML Solver进行了一些尝试,但效果不是很理想。
命令如下:
java -jar .\openjml.jar -exec g:\oo2\jml\z3-4.7.1.exe -esc g:\oo2\jml\Person.java
首先,我选了Person类(将Myperson的内容复制了进去),因为其较为简单。
emmm这是什么bug?
在经历了漫长的debug(假)(准确说是不停删内容看什么时候没bug)后,我得到了正常运行的结果。
虽然我不知道为什么不能使用修饰符private,但确实找出了我程序里的一些bug(如我将String类的name赋值为0)。
三、JMLUnitNG
开门一个异常
对代码进行修改之后,出现一堆警告
终于
很实用,自动生成边界数据进行测试,bye~
四、框架梳理
看完了第三单元总结课之后,我对自己的框架进行了检讨。不我没有,我根本没设计什么框架,我从第一次到第三次作业,都是JML让干啥就写啥,最多是加关系时采用了并查集,存储连通块数量并在适时加键等小优化。一直没有设计框架的想法,虽然心里知道是个图,很多地方采用图的算法,但并没有基于图对代码进行设计维护。唯一一个多出来的类和一个简单的结构体并没有什么区别......以后的学习中,我要更刻意的去培养自己的框架意识。
以下是我的UML图(第三次作业),emmm,没啥好说的,因为啥也没有。
五、Bug和修复情况
(一)主要测试方法
虽然本单元重点学习了JML,但我本次进行测试仍然是采用随机生成测试数据,对拍输出的方法。根据runner接口编写自动生成数据,编写脚本对拍输出后记录有不同测试用例,分析不同原因。
(二)bug和修复情况
第一、二次作业强测和互测都没有发现bug,但课下测试的一个bug令我印象深刻,我在通过中测后,发现自己一个函数的返回值错误的写成了另一个函数返回值,但中测并没有发现这一点。这让我感到深深的恐惧,并坚定了写测评机debug的决心。
第三次作业中,我在强测求最短路径的三个点中均超时了。我尝试了很多方法来降低复杂度,比如换ArrayList为HashMap,取消使用数组等,最后发现把遍历连通集改完遍历与某人直接相连的人的集合对改进效率卓有成效。修复后,整个函数基本是重写了,感谢助教在修改行数上的通过。
六、心得体会
JML看起来很麻烦,写起来更麻烦,为我们提供这单元JML的助教神仙们真是辛苦了。
个人感觉这种规格化设计在真实的产业中非常重要,真正一项工程涉及多人合作和长时间维护,如果在各部分代码要求上存在误解,很能保证整体的正确性。我觉得这单元的学习既是学习了JML,更重要的是学习了规格化设计思想,培养分工合作意思(指把任务分解,基于要求进行实践)。
数据结构和Java内部类的效率问题也是很重要的。我在之前的编程学习很少关注代码性能,这次也算培养了性能意识。
JML的工具链真的好难用啊,这次虽然进行了一些尝试,但估计以后除了Junit都不会真正用了。。。
还剩一单元,希望第四单元顺利。