一、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. JS数组专题2️⃣ ➖ 数组去重

    距离上次发文,已经有一段时间了,最近工作比较忙,这不眼看快双十一了,就相当于给大家一些福利吧! 一.什么是数组去重 简单说就是把数组中重复的项删除掉,你 GET 到了吗 ?下面我将简单介绍下几种基本的 ...

  2. UVa-232-纵横字谜的答案

    这一题的话,输出的时候,我们要按照3位输出,不能按照两位,因为是10*10的网格,所以就是100位,不管有没有100的起始格,它都是按照3位进行输出的,从题上的输出可以看到,不然的话,就会PE. 然后 ...

  3. (41)zabbix监控api接口性能及可用性 天气预报api为例

    现在各种应用都走api,例如淘宝,天气预报等手机.pad客户端都是走api的,那么平时也得对这些api做监控了.怎么做呢?zabbix的web监控是不二选择了.今天就以天气预报api作为一个例子. 天 ...

  4. tkinter学习-选择按钮

    阅读目录 Checkbutton Radiobutton LabelFrame checkbutton : 说明:多选框控件,用于在程序中提供多项选择框,但是处理“多选一”的问题,还是交给 Radio ...

  5. 【Gradle】Downloading https://services.gradle.org/distributions/gradle-3.3-bin.zip 失败

    提示连接超时 Downloading https://services.gradle.org/distributions/gradle-3.3-bin.zip 失败 这时候需要单独去官网下载包,然后放 ...

  6. CSS3-transform-style

    transform-style属性 transform-style属性是3D空间一个重要属性,指定嵌套元素如何在3D空间中呈现.他主要有两个属性值:flat和preserve-3d. transfor ...

  7. 浅谈Session与Cookie的关系

    一.概念理解: 首先cookie是服务端识别客户的唯一标识的依据,客户在访问网站时候,服务端为了记住这个客户,会在服务端按照它的规则制作一个cookie数据,会将这个cookie数据保留在服务端一段时 ...

  8. python 学习总结5

    字符串类型及操作 一.字符串类型的表示 (1)字符串:由0个或多个字符组成的有序字符序列  例如:“请输入带有符号的温度值” 或者‘c’都是字符串 (2)字符串是字符的有序序列,可以对其中的字符进行索 ...

  9. 《C/C++工程师综合练习卷》之小试牛刀

    第一套练习之感受 刚刚注册了牛客网的账号,准备在此衡量一下水平,好好磨练一番.看到推荐练习<C/C++工程师综合练习卷>,oh,20道题,2个小时.由于木有经验,好一番紧张~ 结果用了20 ...

  10. luogu3759 [TJOI2017]不勤劳的图书管理员

    分块+权值逆序对 #include <algorithm> #include <iostream> #include <cstdio> #include <c ...