一、JML理论基础及应用工具链情况

理论基础

1.JML表达式

\result:表示方法执行后的返回值。

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

\foall:全称量词修饰的表达式。

\exists:存在量词修饰的表达式。

<==>:等价关系操作符。

==>:推理操作符。

\nothing:变量引用操作符,指示一个空集。

\everything:变量引用操作符,指示一个全集。

2.方法规格

requires:表示前置条件(pre-condition)。

ensures:表示后置条件(post-condition)。

assignable:表示副作用范围限定(side-effects)。

3.类型规格

invariant:不变式,要求在所有可见状态下都必须满足的特性。

constraint:状态变化约束,对前序可见状态和当前可见状态的关系进行约束。

应用工具链

OpenJML可以对规格进行检查,包括语法正确性检查、静态检查、运行时检查。

JMLUnitNG可以根据规格自动生成测试样例,检测程序的正确性。

二、部署JMLUnitNG/JMLUnit,实现自动生成测试用例

测试程序:

测试过程及结果:

测试样例主要是针对数据的边界情况,三个没有通过的测试点都是由减法溢出导致的。

三、按照作业梳理自己的架构设计,并特别分析迭代中对架构的重构

第一次作业

MyPath类里,用一个arraylist来存路径中的所有点,以及一个hashmap来存所有不同的点。方法都是按照规格完成,值得一提的是从大佬那里学来了简单的重写hashCode()的方法——直接return类中arraylist的hashCode(),因为对于arraylist来说,相同内容的两个arraylist,它们的hashCode是相同的。

MyPathContainer类里,由于MyPath重写了hashCode()方法,直接建立以id作为key、path作为value和以path作为key、id作为value的双向hashmap。另外对于所有不同点的个数,建立一个以点的id作为key,点的出现次数作为value的hashmap,在add和remove path时,对这一hashmap进行维护,将增加或删除的路径中的所有点的出现次数在这一hashmap中的value值进行加或减,次数为0时直接删除,这样在获取不同点个数时就可以直接return这一hashmap的size()。

第二次作业

第二次作业采用的是floyd算法求最短路径,每次add或者remove,都根据graph中存储的所有path建立一个二维矩阵,然后用floyd算法求解。

第三次作业

第三次作业仍采用floyd算法,基本方法参考讨论区大佬的不拆点方法(这方法真的太强了),维护四个二维矩阵,并且对于每个路径的不满意度和票价矩阵都用一次floyd,最后在每一次add和remove时,都重新初始化四个矩阵并各自floyd,以得到最终结果。

这三次作业其实基本上没有太多重构,因为第二三次都是用的floyd算法,其他的方法基本上都是沿用上一次的方法。

四、按照作业分析代码实现的bug和修复情况

第一次作业比较简单,没有出现bug。

第二次作业强测wa了两个测试点,互测被刀了两刀,都是源于同一处bug。由于路径中的点并不是从0开始递增,在建立二维数组时,需要建立一个从点的id到递增自然数的一个映射,以表示数组的index。我在每一次add和remove时,都会先将二维数组初始化,而忘记将储存映射关系的hashmap也初始化,这就导致删除了某些点之后,它的映射关系仍储存在hashmap中,会出现数组越界的错误。

第三次作业也吸取了第二次作业的教训,没有出现bug。

五、阐述对规格撰写和理解上的心得体会

在规格撰写方面,在几次上机以及理论课上的练习中,感觉撰写规格要比理解规格难一些,感觉一次性很难完整写出一个方法的规格。

至于规格理解,就要简单很多,在熟悉JML各种表达式及规格之后,对于规格要求的理解基本上不会存在偏差。

其实本单元的作业,主要难点还是在于算法及架构设计上,由于CPU时间做出了要求,我们必须充分考虑选择算法的时间复杂度,而第三次作业增加的票价、不满意度等计算,进一步加大了代码设计的难度。

总的来说,规格还是很有用的,它能很好地规范代码,而且能帮助程序员养成良好的代码编写习惯。

OO第三单元作业小结的更多相关文章

  1. OO第三单元作业总结

    OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...

  2. 【OO学习】OO第三单元作业总结

    [OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...

  3. OO第三单元作业——魔教规格

    OO第三单元作业--魔教规格 JML的理论基础和相关工具   JML(Java Modeling Language,Java建模语言),在Java代码种增加了一些符号,这些符号用来标志一个方法是干什么 ...

  4. OO第三单元作业(JML)总结

    OO第三单元作业(JML)总结 目录 OO第三单元作业(JML)总结 JML语言知识梳理 使用jml的目的 jml注释结构 jml表达式 方法规格 类型规格 SMT Solver 部署JMLUnitN ...

  5. OO第四单元作业小结

    一.本单元两次作业的架构设计 1.第一次作业 整体思路:以class为核心,建立MyInterface.MyAttribute.MyOperation.MyAssociation四个类分别储存每个类的 ...

  6. 2019北航OO第三单元作业总结

    1.梳理JML语言的理论基础.应用工具链情况 JML基础理论: JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML是一种行为接口规格语言,基 ...

  7. 北航OO第三单元作业总结(3.1~3.3)

    JML简介及相关工具链使用 1.JML规格描述语言介绍 本单元学习的内容是JML规格描述语言.我们知道,面向对象方法是一个抽象过程,需求者仅需关注方法的规格.规格是对一个方法/类/程序的外部可感知行为 ...

  8. OO第三单元作业分析

    一.JML的理论基础应用工具链 JML是用于对Java程序进行规格化设计的一种表示语言.基于Larch方法构建. (1)注释 JML以javadoc注释的方式来表示规格,每行都以@起头.有两种注释方式 ...

  9. BUAA OO 2019 第三单元作业总结

    目录 总 JML规格化设计 理论基础 工具链 规格验证 验证代码 代码静态检查 自动生成测试样例 生成结果 错误分析 作业设计 第九次作业 架构 代码实现 第十次作业 架构 代码实现 第十一次作业 架 ...

随机推荐

  1. vue父组件获取子组件页面的数组 以城市三级联动为例

    父组件调用子组件 <Cselect ref="registerAddress"></Cselect> import Cselect from '../../ ...

  2. 洛谷 P2846 光开关

    https://www.luogu.org/problemnew/show/P2846 好多题解用线段树来写,然而分块不是更简单好些吗? 一个数组use记录这一块进行了多少次开关操作,两边单独计算,注 ...

  3. Android Studio问题记录

    1>Android Studio中module是什么,? 答:Android Studio是基于intellij,跟eclipse不太一样.对应关系如下: intellij的project -- ...

  4. (65)login as guest zabbix无法进入登陆界面

    很早之前有一位群友告知zabbix登陆不了,一直有如下提示:Access denied.Your are logged in as guest. You have no permissions to ...

  5. pytorch 加载数据集

    pytorch初学者,想加载自己的数据,了解了一下数据类型.维度等信息,方便以后加载其他数据. 1 torchvision.transforms实现数据预处理 transforms.Totensor( ...

  6. HDU 3516 DP 四边形不等式优化 Tree Construction

    设d(i, j)为连通第i个点到第j个点的树的最小长度,则有状态转移方程: d(i, j) = min{ d(i, k) + d(k + 1, j) + p[k].y - p[j].y + p[k+1 ...

  7. html,css样式错误总结

    a元素不能嵌套a元素 a元素嵌套a元素会使a元素闭合出现混乱,导致浏览器识别出多个a元素.

  8. [转]python开发_shelve_完整版

    ''' python中的shelve模块,可以提供一些简单的数据操作 他和python中的dbm很相似. 区别如下: 都是以键值对的形式保存数据,不过在shelve模块中, key必须为字符串,而值可 ...

  9. HDU 4417 Super Mario(划分树问题求不大于k的数有多少)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  10. Codeforces Round #360 (Div. 2)——C. NP-Hard Problem(BFS染色判二分图)

    C. NP-Hard Problem time limit per test 2 seconds memory limit per test 256 megabytes input standard ...