OO第三次作业总结(JML)
第三单元的课题是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)的更多相关文章
- OO第三单元作业总结
OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...
- OO第三单元作业(JML)总结
OO第三单元作业(JML)总结 目录 OO第三单元作业(JML)总结 JML语言知识梳理 使用jml的目的 jml注释结构 jml表达式 方法规格 类型规格 SMT Solver 部署JMLUnitN ...
- 【OO学习】OO第三单元作业总结
[OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...
- OO第三单元(地铁,JML)单元总结
OO第三单元(地铁,JML)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉并了解JML来是我们具有规格化编程架构的思想.这个单元的主题一开始并不明了,从第一次作业的路径到第二次 ...
- OO第三单元作业——魔教规格
OO第三单元作业--魔教规格 JML的理论基础和相关工具 JML(Java Modeling Language,Java建模语言),在Java代码种增加了一些符号,这些符号用来标志一个方法是干什么 ...
- OO前三次作业思考(第一次OO——Blog)
OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...
- oo第三次作业--jml
1.首先我们应该了解什么是jml,jml是java modeling language的缩写,是一种为java规格化设计的标识语言,简单来说,就是描述“干什么”的标准语言(跟注释差不多,但是是标准化注 ...
- OO前三次作业分析
一,第一次作业分析 度量分析: 第一次的oo作业按照常理来说是不应该有这么多的圈复杂度,但是由于第一次写的时候,完全不了解java的相关知识,按照c语言的方式来写,完全的根据指导书的逻辑,先写好了正确 ...
- OO前三次作业简单总结
随着几周的进行,OO课堂已经经历过三次课下作业.在这三次作业中,我被扣了一些分数,也发现了自己几次作业中一些存在的共同的问题. 首先以第三次作业为例分析,我程序的类图如下 一共九个类,其中Als_sc ...
随机推荐
- 使用PreparedStatement接口
- [已读]web性能实践日志
书是在今年5月份出版,但是书中的内容是发表于11年到12年之间的,如果知道这一点,我一定不会买~ 列举一下大致内容: YSlow localStroage读取数据最佳策略 性能优化各种策略(图片精灵 ...
- Aria's Loops
https://www.hackerrank.com/contests/101hack41/challenges/arias-loops 可以看我以前的笔记,http://www.cnblogs.co ...
- ping localhost 返回 ::1的导致不能打开http://localhost的原因及解决
虽然可以在浏览器中正常访问http://localhost但用file,file_get_contents等函数打开http://localhost异常.用127.0.0.1也可以打开,本地hosts ...
- Sublime折腾记录
本文可以理解为FAQ,主要是为了大家GET一些技能,具体内容包括LICENSE.重置.Package Control的安装,其他内容以后可能补充... 最后说明一下自己的版本:Build 3114 L ...
- SAP云平台架构概述
在我们开始SAP云平台的架构之旅之前,让我们先看看SAP已经发布的一些其他云产品.这些云产品方案可以分为公有云和私有云两种. SAP公有云解决方案见下图最右侧,比较著名的有SAP SuccessFac ...
- H3C S5024P交换机 vlan实验
H3C S5024P交换机第二次vlan实验 实验1 与交换机端口G0/1和G0/2相连的PC1与PC2属于VLAN 1,与G0/3和G0/4相连的PC3和PC4属于VLAN 2,PC1.PC2.PC ...
- C++中vector用法
在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<in ...
- docker 的容器入门
Linux Namespace LXC所实现的隔离性主要是来自kernel的namespace, 其中pid, net, ipc, mnt, uts 等namespace将container的进程, ...
- com组件简单应用
1.打开VS2010,新建ATL COM 项目,步骤:“文件” -->“新建” -->“项目”,选择“Visual C++” -->“ATL 项目” ,填写“名称” FirstCOM ...