OO课第三单元总结
一、梳理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课第三单元总结的更多相关文章
- BUAA OO 2019 第三单元作业总结
目录 总 JML规格化设计 理论基础 工具链 规格验证 验证代码 代码静态检查 自动生成测试样例 生成结果 错误分析 作业设计 第九次作业 架构 代码实现 第十次作业 架构 代码实现 第十一次作业 架 ...
- 北航oo作业第三单元小结
一.梳理JML语言的理论基础 1.jml的注释结构 jml注释语言的每一行都以@作为开始,若是块注释,则需要在注释块的首尾使用/*@ 与@*/ 2.jml的表达式体系 1.原子表达式 表达式可以看作是 ...
- OO作业第三单元总结
目录 一.JML语言理论基础及应用工具链 二.部署JMLUnitNG,自动生成测试用例 三.架构设计 第一次作业 第二次作业 第三次作业 四.Bug分析 五.心得体会 一.JML语言理论基础及应用工具 ...
- 北航OO(2020)第三单元博客作业
一.JML理论基础及相关工具链 1.JML理论基础 该部分梳理本单元作业中涉及到的JML知识. 1.1注释结构 JML采用javadoc注释的方式来表示规格,且每行以@开头.通过使用//@annota ...
- OO第三单元总结——JML
目录 写在前面 JML理论基础 JML工具链 JMLUnitNG的使用 架构设计 Bug分析 心得体会 写在前面 OO的第三单元学习结束了,本单元我们学习了如何使用JML语言来对我们的程序进行规格化设 ...
- OO第三单元——JML之破分大法
一.Jml总结及应用工具链 总的来说,jml就是对java程序进行规格化设计的一种表示语言,其中最核心的就是规格化,将代码要实现的功能和各项要求与约束不是通过自然语言,而是通过严密的逻辑语言来表达,这 ...
- OO第三单元个人总结
OO第三单元个人总结 JML理论与基础与应用工具链 JML是什么? Java建模语言(JML)是一种行为接口规范语言,可用于指定Java模块的行为 .它结合了Eiffel的契约设计方法 和Larch ...
- 2020 OO 第三单元总结 JML语言
title: 2020 OO 第三单元总结 date: 2020-05-21 10:10:06 tags: OO categories: 学习 第三单元终于结束了,这是我目前为止最惨的一单元,第十次作 ...
- OO第三单元作业(JML)总结
OO第三单元作业(JML)总结 目录 OO第三单元作业(JML)总结 JML语言知识梳理 使用jml的目的 jml注释结构 jml表达式 方法规格 类型规格 SMT Solver 部署JMLUnitN ...
随机推荐
- 《Go语言圣经》阅读笔记:第二章程序结构
第二章 程序结构 2.1 命名 在GO语言中,所有的变量名.函数.常量.类型.语句标号.包名都遵循一个原则: 名字必须以字母或者下划线开头,后面紧跟任意数量的字母数字下划线.区分大小写. 在GO语言中 ...
- JS010. 三元运算符扩展运用(多层判断语句 / 多条表达式)
MDN - 三元运算符 语法 Condition ? exprIfTrue : exprIfFalse 用例: function getFee(isMember) { return(isMember ...
- 对easyui-validatebox的验证类型的扩展
easyui为我们提供了validatebox类型的组件,使用它可以完成自动验证,十分方便.要注意的是,easyui中的各个组件都是有继承关系的.通过查看api,textbox继承validatebo ...
- ElasticSearch集成SpringData史上最全查询教程
1.简单介绍 springboot 使用springdata操作es,ElasticsearchRepository使用QueryBuilder构造查询条件 2.集成es //maven集成 < ...
- webpack 安装与卸载
全局安装(不推荐): npm install webpack webpack-cli -g 安装好后打印版本: webpack -v webpack-cli -v 卸载全局 npm uninstall ...
- Flutter 对状态管理的认知与思考
前言 由 编程技术交流圣地[-Flutter群-] 发起的 状态管理研究小组,将就 状态管理 相关话题进行为期 两个月 的讨论. 目前只有内定的 5 个人参与讨论,如果你对 状态管理 有什么独特的见解 ...
- win10环境charles抓包unknow问题
win10环境,charles已经安装了证书,但是抓包的时候还是unknow,让人头疼. 1.确保证书安装成功. 2.检查charles设置是否正确. 进入Charles - > Proxy - ...
- python学习笔记(五)-文件操作2
一.文件修改 现有文件file.txt,内容如下:二十四节气歌春雨惊春清谷天,夏满芒夏暑相连.秋处露秋寒霜降,冬雪雪冬小大寒.上半年逢六廿一,下半年逢八廿三.每月两节日期定,最多相差一二天.要求:将文 ...
- linux 客户机挂载vitualbox共享文件夹
1. 安装增强功能包(Guest Additions) 安装好Ubuntu 9.10后,运行Ubuntu并登录.然后在VirtualBox的菜单里选择"设备(Devices)" - ...
- Spring技术内幕笔记2--我懒不写了哈哈哈哈。
目录 1.1 关于IOC容器设计的线路区别 1.1.1 BeanFactory 1.1.2 ApplicationContext 2.1 FileSystemXmlApplicationContext ...