一、梳理JML语言的理论基础

(1)理论基础

JMl的出现很大程度上一为了行为接口的规范化,用这种语言来指定特定模块的特定功能。JML的核心部分分为三个部分:前置条件(requires)、后置条件(ensures)、副作用(assignable)。通过JML的使用,程序员可以轻松的描述一个方法的与其功能而不用管具体的实现方法,JML把过程性的思考延迟到了方法的设计中,从而扩展了面向对象设计的这个原则。

(2)应用工具链

OpenJML可以检查JML描述语言语法的正确性、以及所实现的代码能否满足JML语言所描述的要求,并提示问题的所在。

Junit可以单独测试某一个方法的正确性,可以帮助编程者对程序进行彻底的排查,准确的定位出BUG。

Javadoc是提供编写Java注释程序模板的工具,在真正写JML注释时只需要调用提前编写好的模板就可以了,将会省去做大量的重复工作的时间。

二、JML Unit自动测试

JMLUnitNG是一个为使用了JML注释的java代码生成自动化测试的工具。

使用其的基本流程是首先进行环境配置,然后就可以使用工具生成文件的测试类,编译需要进行测试的文件,最后运行test类就可以了。

在测试后发现JMLUnit可以产生一些边缘数据和常规数据来对我们的代码进行检测。

三、梳理框架结构

第一次

第一次作业要求完成MyPath和MyPathContainer两个类。

在MyPath中我构建了两个容器,一个是储存当前所有节点以及节点顺序的ArrayList,以及储存非重复节点的容器HashSet。

nodes可以解决大部分查找点的问题,而nodeSet可以快速解决getDistinctNodeCount的问题。

在MyPathContainer中我构建了三个容器:

前两个可以完成ID与path之间的快速转换,而第三个HashMap是表示节点出现的次数,在每次add和remove时都要对这三个容器进行更新操作,虽然对于add和remove操作的速度回下降,但是对于getDistinctNodeCount问题可以把复杂度简化为O(1)。

第二次

第二次作业主要是完成MyGraph中的四个新方法:containsNode,containsEdge,isConnected和getShortestPathLength。其中containsNode可以通过上一次的total来迅速得出

我新构建了两个类:Edge和Connect

Edge类用来保存所有的边信息,也就是所构建出的一个邻接矩阵来存放边的信息。

Connect类用来储存两点之间shortestPath的信息。

用Edge类解决containsEdge,而isConneted和getShortestPathLength可以归为一类求解最短路径问题来考虑,只要存在最短路径必定相联通。所以每次输入from和to时如果已经储存在connect中就直接取出,否则就用dijkstra求解出最短边加入到Connect中。

第三次

第三次作业主要是完成MyRailwaySystem中的五个方法。

这次作业相较前两次有着较大的难度,首先困扰我的是如何解决不同路线的换乘问题。在看了讨论区的方法之后我的眼前豁然开朗。可以将一条路径根据不同的需求已不同的权重拆分成多段小路径并加入到相应的图中,之后只用遍历所求问题所对应的图就可以了。为此为三种不同的问题分别对应不同的边权重来各构建了两个图,一个是储存当前信息的图,另一个是储存所计算出来的最短结果的图。

每一个图求最短路径都用dijkstra的方法。

连通块个数的求解是运用深度优先遍历(DFS)的方法求解。

四、bug分析和修复

这三次作业每一次都是继承自上一次作业的接口,环环相扣,很可能由于第一次的构思不当而导致最后一次的结构十分复杂。就说我的程序,最后一次尽然达到了十二个图之多,每一次的addPath和removePath都是一次巨大的工程量。

但是这次作业方便的地方在于,只要你能够保证自己所写的程序和课程所提供的JML完全匹配,就基本上没有错误,再加上有许多辅助工具的帮助,只要算法充分掌握就应该没有什么难点了。所以我三次强测和互测都没有被找到BUG。

同学们所犯的错误大都分为两类:一是边界问题没有考虑清楚,或者是有些没有验证到的地方有输出错误,大多都是可以通过特殊样例检测以及全面测试而检测出来的;第二类则是数据结构比较简单,没有进行时间上的优化。对于这类问题,单靠自己空想是很难想到优秀的算法的,这时就要多搜索查找快速且方便的算法,多与同学们交流讨论,这些都是最快的取经之道。

五、心得体会

通过本次作业我感受到了JML的强大之处,明白了类规格,方法规格,数据规格的写法,感受到了规格的巧妙之处。方法规格由前置条件、副作用和后置条件所组成,用来方便上层统筹,下层协作。众多编程者都可以根据JML的描述完美无缺的来完成一个庞大的作业。

通过这次OO作业,我发现可以通过复杂的数据结构来节省出重复计算的时间开销,就是用时间换空间当我们的程序对于时间的要求交高而对空间限制几乎没有的时候,我们就可以将每一次计算所得的数据都记录下来,当下次要再次使用时在就可以快速查找了。在使用这种方法时一定要注意数据的更新与重置,一旦忽略了一步那么后面的数据都会出问题。总而言之,写程序讲究的就是一个小心仔细

OO课第三单元总结的更多相关文章

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

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

  2. 北航oo作业第三单元小结

    一.梳理JML语言的理论基础 1.jml的注释结构 jml注释语言的每一行都以@作为开始,若是块注释,则需要在注释块的首尾使用/*@ 与@*/ 2.jml的表达式体系 1.原子表达式 表达式可以看作是 ...

  3. OO作业第三单元总结

    目录 一.JML语言理论基础及应用工具链 二.部署JMLUnitNG,自动生成测试用例 三.架构设计 第一次作业 第二次作业 第三次作业 四.Bug分析 五.心得体会 一.JML语言理论基础及应用工具 ...

  4. 北航OO(2020)第三单元博客作业

    一.JML理论基础及相关工具链 1.JML理论基础 该部分梳理本单元作业中涉及到的JML知识. 1.1注释结构 JML采用javadoc注释的方式来表示规格,且每行以@开头.通过使用//@annota ...

  5. OO第三单元总结——JML

    目录 写在前面 JML理论基础 JML工具链 JMLUnitNG的使用 架构设计 Bug分析 心得体会 写在前面 OO的第三单元学习结束了,本单元我们学习了如何使用JML语言来对我们的程序进行规格化设 ...

  6. OO第三单元——JML之破分大法

    一.Jml总结及应用工具链 总的来说,jml就是对java程序进行规格化设计的一种表示语言,其中最核心的就是规格化,将代码要实现的功能和各项要求与约束不是通过自然语言,而是通过严密的逻辑语言来表达,这 ...

  7. OO第三单元个人总结

    OO第三单元个人总结 JML理论与基础与应用工具链 JML是什么? Java建模语言(JML)是一种行为接口规范语言,可用于指定Java模块的行为 .它结合了Eiffel的契约设计方法 和Larch ...

  8. 2020 OO 第三单元总结 JML语言

    title: 2020 OO 第三单元总结 date: 2020-05-21 10:10:06 tags: OO categories: 学习 第三单元终于结束了,这是我目前为止最惨的一单元,第十次作 ...

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

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

随机推荐

  1. 快速模式第一包: quick_outI1()

    文章目录 1. 序言 2. quick_outI1()流程图 3. quick_outI1()源码分析 4. quick_outI1_continue()源码分析 5. quick_outI1_tai ...

  2. openswan中out_sa()函数报文封装思想

    out_sa()函数报文封装思想讲解 1. out_sa前言 我已经在上一篇文章中将in_struct函数的基本原理进行了阐述,而out_struct()的实现基本是相同的,如果能理解in_struc ...

  3. Object类、Date类、Calendar类、System类、StringBuilder类和基本类型包装类

    一.Object类--toString方法 1.普通类重写toString方法,不然打印出来是存在栈内存的对象引用名称的堆内存中该对象的地址值: 2.equals方法: String比较equals是 ...

  4. FastAPI(2)- 快速入门

    安装 FastAPI pip install fastapi # 将来需要将应用程序部署到生产环境可以安装 uvicorn 作为服务器 pip install uvicorn 最简单的代码栗子 fro ...

  5. mysql忘记root密码连接本地库

    http://www.cnblogs.com/zf2011/archive/2012/03/13/2393387.html 今天想做个小项目,决定用mysql数据库,但是好久没用mysql了,也忘掉了 ...

  6. 使用 mysql 的 Docker 镜像

    使用 mysql 的 Docker 镜像 前言 之前搞了很多都是手工在操作系统的镜像中安装使用 mysql,作为自己折腾也就算了,作为实际使用实为不妥:Docker最重要的特性就是可扩展性,把各种程序 ...

  7. 集合Collection ----List集合

    Collection集合体系的特点: set系列集合:添加的元素是 无序,不重复,无索引的 ----HashSet: 无序,不重复,无索引 ----LinkedHashSet: 有序,不重复,无索引 ...

  8. PHP中使用if的时候为什么建议将常量放在前面?

    在某些框架或者高手写的代码中,我们会发现有不少人喜欢在进行条件判断的时候将常量写在前面,比如: if(1 == $a){ echo 111; } 这样做有什么好处呢?我们假设一个不小心的粗心大意,少写 ...

  9. Python-对Pcap文件进行处理,获取指定TCP流

    通过对TCP/IP协议的学习,本人写了一个可以实现对PCAP文件中的IPV4下的TCP流提取,以及提取指定的TCP流,鉴于为了学习,没有采用第三方包解析pcap,而是对bytes流进行解析,其核心思想 ...

  10. HTML 网页开发、CSS 基础语法——十一. CSS常用样式

    文字三属性 1.颜色color 2.字体font-family ① 常用字体 常用的中文字体: 宋体  SimSum 微软雅黑 Microsoft YaHei 常用的英文字体: 如果不设置字体属性,不 ...