OO第三单元JML规格

一、JML情况

JML是对Java程序进行规格化设计的一种表示语言,为逻辑性的程序设计和代码的严格要求提供了有效方法。通过JML及其支持工具,不仅可以自动构造测试用例,还可以用静态方法检查代码对规格的满足情况。一千个人心中有一千个哈姆雷特,那么JML规格就是产生千变万化代码的原书。

JML的功能定义:

(1)对一个方法/类/程序的外部可感知行为进行抽象表示

(2)把程序的设计与实现有效分离

JML有两种主要的用法:

(1)开展规格化设计。这样其他人员面对的将不是模糊语言描述,而是逻辑严格的规格。

(2)针对代码设计其规格,这对于他人代码的维护提供了便利方法。

二、作业架构分析

第一次作业:

  基本上是照着规格写代码,没什么架构可言。每个类和方法不需要了解逻辑关系,只需要根据所给规格进行完善即可。唯一的区别则是数据存储方式,这会影响到数据查找的效率。

第二次作业:

第二次作业增加了Group这个类,并进行了一系列查询工作。对于容器的选择,选择了方便遍历arrarlist。

相应的ConflictSum、getAgeMean、getAgeVar没有采用更利于数据更新的缓存法,没有在增加人的时候进行更新,而是只在调用时进行查询操作。

需要注意的是getRelationSum、getValueSum等对于isLink的调用实际是查询一个人际关系图,对每个人的关系图进行更新会减少查找时间。

第三次作业

第三次作业,在上次基础上增加了删除group元素并,增加了最短路径的查询,这也是导致TLE的根本问题。

大体架构没有改变,自上而下遍历树结构,找到Value最小的路径。

类图结构如下:

OO第三单元JML规格_第1张图片

代码复杂度分析:

OO第三单元JML规格_第2张图片

 

三、BUG分析

(1)第一次作业BUG在于数据存储方式,在强测时CTLE爆炸

(2)第二次作业吸取第一次的教训,采取了更合理的存储结构,但是出现了在求平均值时没有考虑到分母为0的致命BUG

(3)第三次作业的最小路径查询算法不优,导致强测很多测试点时间超时

四、在规格作业中的心得体会

(1)数据存储方式的选取和算法优化很重要,本单元的作业完成难度不大,但是表面看不到的时间复杂度会埋下很多坑。

(2)Junit测试是很有效的一种测试方式,可以帮助我们快速检测一些漏洞

(3)由规格到代码的实现不是照猫画虎,对于所写程序的理解更重要

你可能感兴趣的:(OO第三单元JML规格)