OO第三次博客作业

理论基础

JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言,主要有两个用法:(1)开展规格化设计,(2)针对已有的代码实现,书写其对应的规格,从而提高代码的可维护性。

整体上而言,JML是保证了在一定条件的基础下会得到的结果,但并不关心实现的具体方法。

语法

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

\old(expr) 用来表示一个表达式expr在相应方法执行前的取值。

\not_assigned(x,y,...) 用来表示括号中的变量是否在方法执行过程中被赋值。如果没有被赋值,返回为true,否则返回false。实际上,该表达式主要用于后置条件的约束表示上,即限制一个方法的实现不能对列表中的变量进行赋值。

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

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

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

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

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

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

\max && \min 返回给定范围内表达式的最大(最小)值。

\num_of 返回指定变量中满足相应条件的取值个数。

requires 方法的前置条件,只有满足前置条件的情况下方法才能被正确执行,因此调用者需要确保前置条件为真。

ensures 方法的后置条件,方法保证执行完毕后的结果满足后置条件的约束。

assignable 副作用范围限定,即方法在执行过程中允许或者可能对某些变量进行修改。

signals 抛出异常。

invariant 在所有可见状态下都必须满足的特性。

constraint 对象的状态在变化时需满足的约束。

JML工具链

1.OpenJML:

  -check:对JML注释的规范性检查

  -esc:静态检查

  -rac:动态检查

2.SMT Solver:对代码与规格的等价性进行检查

3.JMLUnitNG:生成测试用例

JMLUnitNG测试

可以看出自动生成的测试用例基本上都是null或边界数据,感觉并没有想象中那么好用。

架构设计

 

整体上的架构笔者是采用了接口所给的架构,Mynetwork管理整体,Myperson管理个人,MyGroup管理组。同时,为了提高效率,笔者创建并管理了大量新的变量,用以实现缓存机制,同时有部分小的类对象被创建,从而实现更高效的qmp,qsl查询方法,总的来说,作业在时间上要比空间更为重要,因此笔者使用了大量空间换区时间上的减少。

BUG分析

第一次作业:

第一次作业中,笔者没有严格按照规格,而是根据自身想法书写代码,导致isCircle方法中误判了两id相同的情况

第二次作业:

第二次作业中有两个主要bug,其一是笔者是通过每一步的添加person和relation时进行group的更新来实现结果的缓存,从而进行优化,但是却没有完备的测试,导致出现了严重的问题。其二是笔者在遍历hashmap时是通过value进行acquaintance的遍历,导致rt大大增加,改为id遍历后大大提高了速度。

第三次作业:

第三次作业主要问题是笔者的qmp方法使用的是最简单的Dijkstra算法,到时ctle,使用优先队列优化后,得以解决。

心得体会

整体而言,我认为JML是保证程序正确性的利器,一个正确可靠的JML可以大大减低测试的复杂度,因为我们只需要保证每个功能的正确性,程序整体的正确性就可以得以保证,同时JML的条件要求也使得测试用例更容易得以书写,但是,这同时也要求我们对于每个功能都要有一个严谨的测试,否则整个程序都可能有巨大的问题。同时,由于JML只保证了输入与输出,但并没有要求具体的实现细节,但是实际上可能时间空间等也会有很多限制,这些就是我们要额外注意的。而在这点上,笔者深有体会,在第二次作业中,笔者就因为测试样例不完备导致了巨大问题,而第三次则因为具体实现不太好导致ctle。

但是,JML确实是一个十分效率且工程化的工具,有了JML,程序员之间的协作就变得不再那么抽象,每个人只需要保证实现JML的要求,就能保证整体上的协作,同时JML的使用也大大降低了程序员理解要求的难度,不需要个人理解那些抽象的要求,而只需要保证JML的实现,这大大提高了程序的严谨性。

posted @ 2020-05-23 15:39  AOEHST  阅读(139)  评论(0编辑  收藏  举报