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. python模拟鼠标拖动操作的方法

    本文实例讲述了python模拟鼠标拖动操作的方法.分享给大家供大家参考.具体如下: pdf中的书签只有页码,准备把现有书签拖到一个目录中,然后添加自己页签.重复的拖动工作实在无趣,还是让程序帮我实现吧 ...

  2. VMware 虚拟机开机黑屏

    先记录一下害我差点点就又跑去重装了 好几天未打开vm 打开就黑屏 打开虚拟机就是黑屏没反应 找了很久(好像是wegame的原因,昨晚上好像是打开了wegame更新2k和lol) 1献上解决方案 管理员 ...

  3. 龙芯 Fedora 28 设置 VNC

    系统为龙芯版Fedora28 (床28) Fedora防火墙默认阻止了VNC所需的端口的访问,导致VNC客户端一直无法连接. 安装VNC Server sudo dnf install tigervn ...

  4. (初学JS)JS基础——ATM机终端程序编写<1.0>

    初步学习了JS基础,为了更好地将所学知识熟练运用,我进行了银行ATM存取款机的模拟程序编写,主要通过VScode终端实现系列操作. 我的ATM程序包括6个主要功能:1.查询余额 2.存钱 3. 取钱 ...

  5. 【WPF学习】第二十一章 特殊容器

    内容控件不仅包括基本控件,如标签.按钮以及工具提示:它们还包含特殊容器,这些容器可用于构造用户界面中比较大的部分区域. 首先介绍ScrollViewer控件,该控件直接继承自ContentContro ...

  6. HttpClient介绍和使用

    HttpClient介绍和使用 今天有一个需求:后台访问一个接口,获取返回的数据.于是找到了HttpClient 1.介绍 SpringCloud中服务和服务之间的调用全部是使用HttpClient, ...

  7. djgango装饰器

    from django.http import HttpResponse from django.views import View class MyView(View): def get(self, ...

  8. PYTHON经典算法-完美平方

    问题描述: 给定一个正整数n,找到若干个完全平方数(例如:1,4,9),使得 它们的和等于n,完全平方数的个数最少. 问题示例: 给出n=12,返回3,因为12=4+4+4:给出n=13,返回2,因为 ...

  9. 使用shiro 框架 报错No WebApplicationContext found: no ContextLoaderListener or DispatcherServlet registered?

    1.问题描述:ssm 框架中使用shiro  中出现问题 原来web.xml 文件如下: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, ...

  10. 连接redis出现错误:Cannot get Jedis connection

    错误信息: 错误描述:由于我的redis数据库没有设置密码,配置连接的时候我配置了密码为空,导致连接失败