oo第三次作业--jml
1.首先我们应该了解什么是jml,jml是java modeling language的缩写,是一种为java规格化设计的标识语言,简单来说,就是描述“干什么”的标准语言(跟注释差不多,但是是标准化注释)。jml基于Larch方法构建。BISL提供了对方法和类型的规格定义手段。所谓接口即一个方法或类型外部可见的内容。JML主要由Leavens教授在Larch上的工作,并融入了Betrand Meyer, John Guttag等人关于Design by Contract的研究成果。近年来,JML持续受到关注,为严格的程序设计提供了一套行之有效的方法。通过JML及其支持工具,不仅可以基于规格自动构造测试用例,并整合了SMT Solver等工具 以静态方式来检查代码实现对规格的满足情况。当我们使用jml时,必不可少的需要一些官方测试工具,比如openjml,这个可以用来检测你写的方法是否符合jml的要求。
3.
这是在bug修复后的结果。



4.本系列的作业主要是构建mypath和另一个容器类,第一次作业完全按照要求来,一个MyPath类,一个Main类,一个MyPathContainer,其中实现的方法也是接口中的方法,没什么太特别的,第二次我也属于懒惰型,把MyPathContainer中的代码复制到新的类MyGraph中,再加上新的方法即可,不需要什么重构,但是到了第三次作业则不一样了,第三次作业需要很多算法的思考,第二次作业由于在我第二次作业中是用的bfs去搜索无权最短路,用并查集确定两点是否连通,所以对于有多少个连通分支我就可以直接统计并查集数量即可,而剩下的最小换乘,最小票价和最少不满意度这三个都可以转化为带权图的最短路径问题,所以这三个的建图和求解我用了一个新的类叫dijsktra,用于专门完成这些任务的,而还有一个工具类是forqueue,用来实现dijsktra算法中用堆优化部分的比较。总体来看三次作业很平滑的过度了,并没有哪一次把之前的代码删改一点,所以我感觉这次的架构设计还是比较好的。
5.在代码实现部分,为了降低时间复杂度,对于最短路,由于不带权值,所以直接用n次bfs跑出所有结果,然后在之后则是o(1)的搜索结果了,而最小换乘,最小票价和最少不满意度,则用拆点的方法,遇到一个点就拆开,并把这个拆出来的点和总点相连,权值为换乘代价的一半,而这个和它的下一个点边的权值为本来的边权,这样我们在查找时,只需要找两个总点间的最短路并减去一次换乘代价即可,由于是有权图,所以我们使用dijskt+堆优化来求最短路,但是为了降低复杂度,我们不是每次add和remove都跑,只有在查找时才跑,同时给一个标记,跑过的就不需要再跑了,这样就可以节约时间,而在每次重新构图后徐熬夜清空标记,本次作业至此就没有什么难度了。本次作业让我深刻认识到==和equals的不同,由于对两个integer进行了==操作而导致本该相连的点不相连了,从而使强侧爆炸。再次提醒自己,对象间不能用==,都要用equals,这是本次作业唯一的bug,却让我挂了两次强测,真的再也不会犯了,印象太深刻了。
6.其实规格化就是在帮我们明确要做什么,有了jml的约束我们的代码会更不容易出错。如果作为一个软件架构师的角度,jml可谓异常重要,你想要让手下干什么全靠这个jml的约束,同时这个jml也可以让别人写的代码更符合你的预期,帮助别人提高作业质量。但是在这次作业中,我发现其实读懂jml并不是一件很简单的事,有些时候需要结合指导书去了解到底要干什么,看jml的次数远远小于我读指导书看懂的次数,所以如果下次jml练习还要改革的话,可以把指导书写的不那么详细,锻炼大家读jml的能力。希望oo越来越好
oo第三次作业--jml的更多相关文章
- OO第三单元作业(JML)总结
OO第三单元作业(JML)总结 目录 OO第三单元作业(JML)总结 JML语言知识梳理 使用jml的目的 jml注释结构 jml表达式 方法规格 类型规格 SMT Solver 部署JMLUnitN ...
- OO第三单元作业总结
OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...
- 【OO学习】OO第三单元作业总结
[OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...
- OO第三单元——基于JML的社交网络总结
OO第三单元--基于JML的社交网络总结 一.JML知识梳理 1)JML的语言基础以及基本语法 JML是用于java程序进行规格化设计的一种表示语言,是一种行为接口规格语言.其为严格的程序设计提供了一 ...
- OO第三单元作业——魔教规格
OO第三单元作业--魔教规格 JML的理论基础和相关工具 JML(Java Modeling Language,Java建模语言),在Java代码种增加了一些符号,这些符号用来标志一个方法是干什么 ...
- OO前三次作业思考(第一次OO——Blog)
OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...
- OO第三次作业总结(JML)
第三单元的课题是JML, 即java建模语言.JML是一种描述接的语言.通过前置条件和后置条件,描述一个模块的行为.本单元我们扮演一个项目中的一员,完成自己的一小部分工作,最终实现整个项目.而限制我们 ...
- 2020 OO 第三单元总结 JML语言
title: 2020 OO 第三单元总结 date: 2020-05-21 10:10:06 tags: OO categories: 学习 第三单元终于结束了,这是我目前为止最惨的一单元,第十次作 ...
- OO前三次作业分析
一,第一次作业分析 度量分析: 第一次的oo作业按照常理来说是不应该有这么多的圈复杂度,但是由于第一次写的时候,完全不了解java的相关知识,按照c语言的方式来写,完全的根据指导书的逻辑,先写好了正确 ...
随机推荐
- python笔记05
python笔记05 数据类型 上个笔记知识点总结: 列表中extend特性:extend,(内部循环,将另外一个列表,字符串.元组添加到extend前的列表中) li.extend(s),将s中元素 ...
- UIKit, AppKit, 以及其他API在多线程当中的使用注意事项
UIKit, AppKit, 以及其他API在多线程当中的使用注意事项 Overview The Main Thread Checker is a standalone tool for Swift ...
- Shell字符串比较相等、不相等方法小结【转】
#!/bin/sh #测试各种字符串比较操作. #shell中对变量的值添加单引号,爽引号和不添加的区别:对类型来说是无关的,即不是添加了引号就变成了字符串类型, #单引号不对相关量进行替换,如不对$ ...
- JS-02-js的变量
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- HLS协议
今天来介绍一下HLS协议,这个协议是由苹果公司提出并推广开来的.来一段维基百科的定义. HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议.是 ...
- 笔记常用Linux命令(二) 进程和端口
查看系统进程 ps:用于报告当前系统的进程状态 a:显示所有终端机下执行的程序 ps -ef/ps aux: 这两个命令都是查看当前系统正在运行进程,两者的区别是展示格式不同. 如果想要查看特定的进程 ...
- pandas使用的25个技巧
本文翻译自https://nbviewer.jupyter.org/github/justmarkham/pandas-videos/blob/master/top_25_pandas_trick ...
- HEXO常用命令总结
博客搬家:hexo常用命令总结 常见命令 hexo new "postName" #新建文章 hexo new page "pageName" #新建页面(新建 ...
- HDU6395 Sequence(矩阵快速幂+数论分块)
题意: F(1)=A,F(2)=B,F(n)=C*F(n-2)+D*F(n-1)+P/n 给定ABCDPn,求F(n) mod 1e9+7 思路: P/n在一段n里是不变的,可以数论分块,再在每一段里 ...
- To be contine ,NW NMM backup sqlserver failed.
Last time, we talk about separate under one cluster backup into two diffetent AG backup. Does it wor ...