标签:基本 开始 举例 情况 工具 基本语法 测试工具 row tle
JML是实现数据抽象的一种规格语言,通过前置条件、后置条件、副作用、异常行为等来约束方法的预期功能,在实现方法代码前完成约束和设计。
表示调用一个方法前所必须满足的要求,该要求需要由方法的调用者保 证满足,是对调用者的要求
requires P;
表示调用一个方法后所必须满足的要求,该要求由方法的实现保证满足, 是对调用者的承诺
ensures P;
表示调用方法后可能会改变哪些变量的值
assignable < \nothing | \everything | 变量名{, 变量名} >;
分为静态规格变量和实例规格变量,在类或接口中声明
public [ static | instance ] model [ non_null ] 类型 变量名;
(\forall T x; R(x); P(x))
//每一个T类型的元素x,如果x满足谓词R(x),则x必满足谓词P(x)
(\exists T x; R(x); P(x))
//存在一个T类型的元素x,如果x满足谓词R(x),则x必满足谓词P(x)
\result
//方法返回值
\old
//表示某变量修改前的值
举例:
/*@ public normal_behavior //正常情况规格表示1
@ requires [condition1] ;
@ assignable ... ;
@ ensures ... ;
@ also
@ public normal_behavior //正常情况规格表示2
@ requires [condition2] ;
@ assignable ... ;
@ ensures ... ;
@ also
@ public exceptional_behavior //异常情况规格表示
@ requires [condition2] ;
@ assignable ... ;
@ signals_only SomeException;
@*/
public boolean someMethod(Object obj) throws
SomeException;
java -jar jmlunitng.jar test/MyGroup.java
javac -cp jmlunitng.jar test/*.java
java -jar openjml/openjml.jar -rac test/MyGroup.java test/MyPerson.java
java -cp jmlunitng.jar test.MyGroup_JML_Test
第九次作业根据规格实现person类和net类中的方法,无需再增加自己的类。
其中isCircle方法中有图连通问题出现,初步使用迭代,结果爆栈。查找资料后使用bfs方法。
第十次作业增加了group类和一些方法。在看了讨论区的帖子之后,修改了所用的容器提高效率。
第十一次作业增加了图连通块的几个方法,对算法复杂度提出了更高的要求。为了节省容器扩容时间增加了默认容器大小,同时为了降低算法复杂度引入自己的几个方法。
由于三次作业采取固定的规格,故架构相似,仅放出简略的依赖图:
第九次作业强测得到0分。通过同学的讨论得知强侧的数据远大于弱中测,问题主要出在isCircle方法使用递归或者dfs还是bfs上。
第十次作业强测虽然得分但是扣分严重,问题主要出在容器的选择上。
第十一次作业强测同样扣分严重,在几个连通块方法上算法复杂度一直降不下去。数据量一堆叠起来直接TLE。
一开始认为按照规格撰写代码感觉像是找着答案写题一样的简单活。但随之发现,尽管已经约束好了输入输出,方法的规格和数据的规格,但是在具体实现上,对数据结构和容器的选取和以及对一些边界值的处理都有很大的选择空间。而这些直接影响到了程序的性能甚至正确性。
直接将过程处理在设计阶段解决,实现阶段只需要考虑具体的代码实现形式,这一单元工作量明显下降的主要原因就是只需要理解规格进行实现阶段,而跳过了设计阶段,省去了大量的时间。规格化设计对新手迅速上手很有帮助。
标签:基本 开始 举例 情况 工具 基本语法 测试工具 row tle
原文地址:https://www.cnblogs.com/noharaShio/p/12943509.html