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的更多相关文章

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

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

  2. OO第三单元作业总结

    OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...

  3. 【OO学习】OO第三单元作业总结

    [OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...

  4. OO第三单元——基于JML的社交网络总结

    OO第三单元--基于JML的社交网络总结 一.JML知识梳理 1)JML的语言基础以及基本语法 JML是用于java程序进行规格化设计的一种表示语言,是一种行为接口规格语言.其为严格的程序设计提供了一 ...

  5. OO第三单元作业——魔教规格

    OO第三单元作业--魔教规格 JML的理论基础和相关工具   JML(Java Modeling Language,Java建模语言),在Java代码种增加了一些符号,这些符号用来标志一个方法是干什么 ...

  6. OO前三次作业思考(第一次OO——Blog)

    OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...

  7. OO第三次作业总结(JML)

    第三单元的课题是JML, 即java建模语言.JML是一种描述接的语言.通过前置条件和后置条件,描述一个模块的行为.本单元我们扮演一个项目中的一员,完成自己的一小部分工作,最终实现整个项目.而限制我们 ...

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

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

  9. OO前三次作业分析

    一,第一次作业分析 度量分析: 第一次的oo作业按照常理来说是不应该有这么多的圈复杂度,但是由于第一次写的时候,完全不了解java的相关知识,按照c语言的方式来写,完全的根据指导书的逻辑,先写好了正确 ...

随机推荐

  1. linux 安装virtualbox5.2

    一.安装 1.下载package https://www.virtualbox.org/wiki/Linux_Downloads 2.添加源. $ cat /etc/lsb-release DISTR ...

  2. ZJU-Reactor Cooling(无源汇有上下界最大流)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 Reactor Cooling Time Limit: 5 ...

  3. Jconsole或者VisualVM监控远程主机(阿里云,jdk11或者8)

    准备: 1 一个war包或者jar包,这里我用springboot的 2 linux环境,安装tomcat,jdk,我用的jdk11和tomcat9,jdk11和8的拷贝权限文件路径有点不一样,这个需 ...

  4. 017.Python函数匿名函数

    匿名函数 lambda表达式 lambda表达式 : 用一句话来表达只具有返回值的函数,简单,方便,直截了当 # 语法: lambda 参数 : 返回值 无参数的lambda 表达式 def func ...

  5. vue中导入bootstrap.css

    1.利用cnpm下载然后导入,用npm也是一样的: cnmp install bootstrap -S 在main.js文件下导入: import "bootstrap/dist/css/b ...

  6. kvm命令

    查询:virsh -c     qemu:///system list    查看当前的虚拟系统 brctl show     列出当前所有的网桥接口virsh list   列出运行的虚拟机virs ...

  7. TortoiseSVN的安装及其简单使用

    VisualSVN-Server的安装以及简单使用 TortoiseSVN的安装及其简单使用 VisualSVN的安装及冲突的处理 安装完VisualSVN-Server后,Test仓储里边什么都没有 ...

  8. css- :before :after

    :before和:after的作用就是在指定的元素内容(而不是元素本身)之前或者之后插入一个包含content属性指定内容的行内元素,最基本的用法如下: #example:before { conte ...

  9. HDU_2579_bfs

    http://acm.split.hdu.edu.cn/showproblem.php?pid=2579 简单bfs题,刚开始在纠结怎么存放vis,因为步数可能有几百步,这么多格子开数组的话也太多了, ...

  10. 使用logstash结合logback收集微服务日志

    因为公司开发环境没有装elk,所以每次查看各个微服务的日志只能使用如下命令 这样子访问日志是并不方便,于是想为每个微服务的日志都用logstash收集到一个文件out中,那以后只要输出这个文件则可查看 ...