一、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. Flask——蓝图

    蓝图介绍 一个项目中,有不同的模块,但是只有一个入口,程序入口可以随便取名,一般叫做,app.py或者manage.py.当我们写一个程序,当然可以在一个文件中写完,但是有一定规模的项目,我们肯定不会 ...

  2. 如何禁用Visual Studio的Browser Link功能

    在Web.Config的AppSetting节点添加<add key="vs:EnableBrowserLink" value="false"/>

  3. Spring根据XML配置文件注入对象类型属性

    这里有dao.service和Servlet三个地方 通过配过文件xml生成对象,并注入对象类型的属性,降低耦合 dao文件代码: package com.swift; public class Da ...

  4. Python多版本共存安装

    Python的安装 进入Python官方网站:www.python.org下载系统对应的Python版本 按照提示步奏安装,安装路径选择自定义,方便查找 安装完成后,按win+R键,输入cmd进入cm ...

  5. Linux内核中的段属性

    #define __init __attribute__ ((__section__ (".init.text")))

  6. ZZULIoj 1912 小火山的爱情密码

    Description 小火山获得了一个字符串,然而大火山让小火山从里面截取一段字符串,并且让小火山截取的字符串满足一些字符达到一定数量. 小火山觉得很容易,但是他想要知道他至少得截取多长的字符串. ...

  7. CodeForces 484B 数学 Maximum Value

    很有趣的一道题,题解戳这. #include <iostream> #include <cstdio> #include <cstring> #include &l ...

  8. 修改JVM的参数、Jstat、Jstack、gclog

    ---恢复内容开始--- 1. jetty 修改JVM的参数 deploy/bin/env.sh 在上面的环境变量脚本中进行修改:如果分配给JVM的内存是4g 这个里面的JAVA_OPTS 的配置项就 ...

  9. Appium+python自动化-appium元素定位

    前言 appium定位app上的元素,可以通过id,name.class这些属性定位到 一.id定位 1.appium的id属性也就是通过UI Automator工具查看的resource-id属性

  10. OSPF 一 基础

    本节介绍ospf路由选择协议    为链路状态  路由选择协议 一  分类 open shortest path first   开放最短路优先   公有协议 单区域的ospf实施  运行在一个自治系 ...