第三单元的课题是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. 转 OGG Troubleshooting-Database error 1 (ORA-00001: unique constraint ...)

    Q5: After imp data to target, when we start replc process, we find the following error: 2011-11-10 0 ...

  2. Winform datagridview 基础

    ======================================================================================== == 重点需要掌握 A ...

  3. 几种创建线程方式Thread类和Runnable接口

    对于很多想学习java的人来说,经常听别人说线程难,其实真正理解了线程后,一点都不会觉得线程难,这里我为大家梳理下线程的创建方式吧. 一.线程的创建方式有三种 1.继承Thread类 2.实现Runn ...

  4. AJPFX对选择和冒泡两种排序的理解

    冒泡排序和直接选择排序都是排序中比较简单和容易实现的算法,先简单说说两者的区别:先以按照元素从小到大为:冒泡排序:将相邻元素两两比较,如果有比较大的,就把比较大的放在右边,这样的结果就是一轮排序完毕后 ...

  5. AJPFX关于Set接口学习笔记及总结

    Set接口中的方法和Collection中方法一致的.Set接口取出方式只有一种,迭代器. |--HashSet:底层数据结构是哈希表,线程是不同步的.无序,高效: HashSet集合保证元素唯一性: ...

  6. LN : leetcode 215 Kth Largest Element in an Array

    lc 215 Kth Largest Element in an Array 215 Kth Largest Element in an Array Find the kth largest elem ...

  7. Oracle | Java日期处理

    public class Test{         public static void main (String args []){                               j ...

  8. Javaweb学习笔记8—DBUtils工具包

    今天来讲javaweb的第8阶段学习. DBUtils技术,DBUtils是我们操作数据库很常用的功能,虽然后期使用都是它的封装结果,但是也需要掌握. 老规矩,首先先用一张思维导图来展现今天的博客内容 ...

  9. 在同一页面显示多个JavaScript统计图表

    最近我接到一个开发任务,要求就"售后服务客户满意度调查问卷表"里客户填写的反馈答案做一个统计. 问题的例子如下: 您最后一次是何时购买了我们的产品? 服务人员服务态度是否友好.工作 ...

  10. Linux/Windows 实用工具简记

    以下只是开发中可能用的比较多的工具,另外还有其他很多未曾提及的实用工具.Linux篇: 1.链接过程的调试:主要用于查看构建过程:如链接时加载的动态库以及运行时加载动态库过程的调试 支持LD_DEBU ...