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. 手势识别控制pygame精灵

    步骤: 编写简易pygame精灵游戏(只实现键盘上下左右控制) 解决opencv手势识别核心问题 上述2部分对接上 pygame部分我们只加载个背景,然后里面放1只乌龟精灵,用键盘的上下左右键来控制, ...

  2. 嗯 想写个demo 苦于没数据

    step 1: 来点数据: 各种数据 随你便了. step 2: 来个 服务端 step 3 : 客户端 调用

  3. SpringBoot系列教程之事务传递属性

    200202-SpringBoot系列教程之事务传递属性 对于mysql而言,关于事务的主要知识点可能几种在隔离级别上:在Spring体系中,使用事务的时候,还有一个知识点事务的传递属性同样重要,本文 ...

  4. centos7下redis安全相关

    Centos7下redis安全相关 在使用云服务器时,安装的redis3.0+版本都关闭了protected-mode,因而都遭遇了挖矿病毒的攻击,使得服务器99%的占用率!! 因此我们在使用redi ...

  5. Jenkins环境配置(集成自动化程序)

    一.下载 直接到官网https://jenkins.io/download/  进行下载 二.安装 1.在浏览器地址栏输入:http://loclhost:8081 运行Jenkins,首次进入会提示 ...

  6. C语言博客作业6

    本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 作业链接 我在这个课程的目标是 熟悉多分支结构.字符型数据类型和逻辑运算符 这个作业在那个具体方面帮助我实现目标 完成pta作 ...

  7. HanLP《自然语言处理入门》笔记--2.词典分词

    2. 词典分词 中文分词:指的是将一段文本拆分为一系列单词的过程,这些单词顺序拼接后等于原文本. 中文分词算法大致分为基于词典规则与基于机器学习这两大派. 2.1 什么是词 在基于词典的中文分词中,词 ...

  8. servlet 深入了解

    servlet  作用 在Java web b/s架构中,servlet扮演了重要的角色,作为一个中转处理的容器,他连接了客户端和服务器端的信息交互和处理.简单来说,客户端发送请求,传递到servle ...

  9. 搭建DevOps模式的项目

    在后端的开发领域,各类开发框架都已经很多,在开发项目时可以根据不同的需要和需求选择合适的开发框架.然而在需要开发一个完善的工程化项目时,仅仅一个后端开发框架是不够的,还面临着在对开发项目的快速迭代中进 ...

  10. 实验7:交换机IOS升级

    交换机IOS升级首先需要有IOS文件,如果没有备份原文件的话,可以找个同一版本的IOS来替代. 第一种方法:X-Modem 以前我曾经尝试过一种方法,就是当Flash被删除后,启动无法进入系统,可以用 ...