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

一、什么是JML

JML是一种java建模语言,有自己独特的语法,通过这套语法对前置条件,后置条件,变量不变式的控制,来描述一个模块的功能和行为。由于JML的语法更像是编程语言和算式,所以相比自然语言,JML虽然稍显复杂,却可以明确无二意的描述出模块的功能行为,在多人合作的工程化代码中,这显得尤为重要。JML写在注释中,每一行由@开头。

行注释表现为//@  ......

块注释表象为

/*  @......

@......

@......

*/

前置条件为requires,后置条件为ensures, 副作用为assignable。

三、我的架构。

  第一次作业比较简单,未涉及到实际应用的场景,因此在初次设计的时候忽略了复杂度的问题导致了超时。于以后的作业我们知道,这次作业实际上是地铁图的基础,因此一定是创建路径的操作少而查询路径的次数多。因此我开始的架构每次查询时计算会导致超时。正确的做法应该是创建完后直接计算并储存下来。查询时直接使用储存的数据。

本次作业主要的内容在于对Path的管理。在该类中,我建立了两个HashMap和一个ArrayList.

两个HashMap的键值和内容恰巧相反,均储存Path对象和Path的Id.因此当相互查询的时候时间复杂度均为O(1),可以做到快速查找。最后一个ArrayList则用来存储所有的点,最终查询点的个数的时候直接用ArrayList.size就可以方便的得到总的点数。

第二次作业在第一次作业的基础上进行。主要多了路径的概念,需要查询两个点是否相连,以及两个点之间的最短路径长度。同样面临时间的问题。解决的办法是直接应用Floyd算法,在引入无向不加权图,来计算它的Floyd矩阵,与第一次作业相同,每次添加或删除边的时候直接计算Floyd矩阵并储存起来,在查询的时候直接检查Floyd矩阵的值即可。

第三次作业在第二次作业的基础上加了部分要求,即各种不同要求下的最短路径长度。包括换乘最少,价格最低,不满意度最小等。实际上仍可以转化成最短路径问题,唯一的区别只是有无权改为有权即可,根据不同的要求改变不同的全职。对于最少换乘,只需要把在同一条线上的所有点之间的距离赋值为1计算最短路径即可。对于最低价格,需要先将在同一条地铁线上的点之间的最小距离算出当做初始价格。并且在更新价格时,相加的两个点之间的权要再加二,看做换乘的价格。最低不满意度同理可得,在同一条线内先将各个点的最低不满意度算出,当做初值,计算是同样根据公式改变加法法则即可。三次作业几乎都在类内完成,唯一添加的类是Edge类,用于储存边的信息。

 BUG:

总的来说本单元的BUG体现在复杂度上,会通过复杂度来卡强测时间,特别是第一次作业,开始没有采用优化,每次查询进行计算,因此会出现问题。第三次作业则主要体现在算法上,开始并没有使用更改权值的Floyd算法,导致程序非常复杂,且会有玄学现象。

本次作业让我们体会编写一个工程中一部分代码的感受,比较具有趣味性。进行代码测试时,本应该针对JML的规范进行逐个模块的测试,最终保证结果。但本次作业方法和最终的明令对应比较明显,所以我在编程过程中的测试基本都靠命令的正确性来测试。实际上还是应该引入模块化测试的思路来进行。我认为本次作业更加加深了我们工程化编程的思想,富有实践意义。

OO第三次作业总结(JML)的更多相关文章

  1. OO第三单元作业总结

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

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

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

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

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

  4. OO第三单元(地铁,JML)单元总结

    OO第三单元(地铁,JML)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉并了解JML来是我们具有规格化编程架构的思想.这个单元的主题一开始并不明了,从第一次作业的路径到第二次 ...

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

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

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

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

  7. oo第三次作业--jml

    1.首先我们应该了解什么是jml,jml是java modeling language的缩写,是一种为java规格化设计的标识语言,简单来说,就是描述“干什么”的标准语言(跟注释差不多,但是是标准化注 ...

  8. OO前三次作业分析

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

  9. OO前三次作业简单总结

    随着几周的进行,OO课堂已经经历过三次课下作业.在这三次作业中,我被扣了一些分数,也发现了自己几次作业中一些存在的共同的问题. 首先以第三次作业为例分析,我程序的类图如下 一共九个类,其中Als_sc ...

随机推荐

  1. 正则表达式exec方法的陷阱

    http://www.w3school.com.cn/jsref/jsref_exec_regexp.asp exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法 ...

  2. 18.5.2动态代理和AOP

    ----此处是JDK动态代理----package d18_5_2; public interface IDog { void info(); void run(); } package d18_5_ ...

  3. Android中ProgressBar显示小数的方法

    Android原生的ProgressBar的ProgressDialog.STYLE_HORIZONTAL(即水平样式)默认setMax和setProgress只能传int型的参数,而实际项目中我需要 ...

  4. Linux常用命令——tac、bc

    1.从文件尾到文件头一页一页的显示内容 tac xxx.log |more //tac命令与cat命令相反,从文件尾开始读文件 2.shell下科学计算工具bc echo "scale=5; ...

  5. P3717 [AHOI2017初中组]cover

    题目背景 以下为不影响题意的简化版题目. 题目描述 一个n*n的网格图上有m个探测器,每个探测器有个探测半径r,问这n*n个点中有多少个点能被探测到. 输入输出格式 输入格式: 第一行3个整数n,m, ...

  6. 关于ES6的Promise的使用深入理解

    ES6的promise对象研究 什么叫promise? Promise对象可以理解为一次执行的异步操作,使用promise对象之后可以使用一种链式调用的方式来组织代码:让代码更加的直观. 那我们为什么 ...

  7. 实现流水灯以间隔500ms的时间闪烁(系统定时器SysTick实现的精确延时)

    /** ****************************************************************************** * @file main.c * ...

  8. 【HEVC简介】Inter Prediction Tools

    参考文献:见<High Efficiency Video Coding (HEVC)>Inter-Picture Prediction in HEVC章节 <HEVC标准介绍.HEV ...

  9. IE8提速经验

    给人写了个web程序,其中detail页要加载不少东西,所以耗时略长.因为bootstrap的原因,我要求用户使用chrome; 而chrome出了名的快,所以也基本没觉得什么. 后来用户因为别的原因 ...

  10. vue路由高级语法糖

    1.当 <router-link> 对应的路由匹配成功,将自动设置 class 属性值 .router-link-active. 模板中可以用{{$route.params.xxx取到路由 ...