OO第三单元总结
一、JML语言基础及应用工具链
JML语言是为了明确、清晰描述行为而诞生的,其表述逻辑清晰,并且最重要的是没有二义性。进一步来说,JML语言可以规范、明确地指出程序中一个操作的行为,这样不仅让bug可以从逻辑层面分析出来,也有利于进行单元测试。
JML表达式
JML表达式分为四类:
原子表达式:\result,\old(expr),\not_assigned(x,y,...),\not_modified(x,y,...),\nonnullelements(container),\type(type),\typeof(expr)
量化表达式:\forall,\exists,\sum,\product,\max,\min,\num_of
集合表达式:可以在JML规格中构造一个局部的集合(容器),明确集合中可以包含的元素。集合构造表达式的一般形式为:new ST {T x|R(x)&&P(x)}
,其中的R(x)对应集合中x的范围,通常是来自于某个既有集合中的元素,如s.has(x),P(x)对应x取值的约束。
操作符:除了java所定义的操作符,JML还定义了四类操作符。E1<:E2
子类型操作符,b_expr1<==>b_expr2
或b_expr1<=!=>b_expr2
等价关系操作符,b_expr1==>b_expr2
或b_expr1<==b_expr2
推理操作符,\nothing
或\everthing
变量引用操作符
方法规格
前置条件(requires):对方法输入参数的限制,如果不满足前置条件,方法执行结果不可预测,或者说不保证方法执行结果的正确性。
后置条件(ensures):对方法执行结果的限制,如果执行结果满足后置条件,则表示方法执行正确,否则执行错误。
副作用(assignable/modifiable):副作用指方法在执行过程中会修改对象的属性数据或者类的静态成员数据,从而给后续方法的执行带来影响。
应用工具链
OpenJML:可以实现JML语法错误检查
SMTSolver: 在逻辑层面、对代码实现形式化验证
JMLUnitNG: 根据JML规格生成对应的测试样例来测试程序
二、部署JMLUnitNG并测试MyGroup类
下载jmlunitng-1_4.jar并对其路径进行配置之后,输入命令java -jar lib\jmlunitng-1_4.jar src\network\MyGroup.java
之后产生报错:
三、作业架构分析
第一次作业
第一次作业只需要严格按照JML规格进行实现就可以了,对于实现的算法复杂度并没有什么要求
第二次作业
第二次作业增加了许多嵌套的查询、计算操作,如果不事先将需要的信息储存起来,就很容易超时
第三次作业
第三次作业增加了一些对图的操作,让我学会了一些效率比较高的图查询算法
四、bug与修复
第一次作业我忽略了isCircle两个id相同的特殊情况,造成了返回值错误,增加特判条件进行修复;
第二次作业由于使用DFS加直接循环造成效率过低,使用并查集进行优化;
第三次作业同样由于直接使用循环造成效率过低,改进算法进行修复。
五、心得体会
这次作业给出了代码的规格,让我们对作业所需要的要求进行实现时,不需要再从零开始构造,从类到属性到方法进行分析了,而是只需要考虑我们实现的时候是否完全符合规格,使用的算法效率是否足够高。这样,大大提高了代码的成型速度。