第三单元的课题是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. Altium Designer的一些功能

    一 Snippets:将原理图或PCB的部分模块电路保存以便于以后重用.https://wenku.baidu.com/view/412a0dbcf121dd36a32d8217.html 二 设备制 ...

  2. 使用Appache部署WEB服务器

    Apache的起源(这个就不说了,百度下就都有了) 简介:Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行, ...

  3. C# winform 创建快捷方式

    using System;using IWshRuntimeLibrary;using System.IO; namespace UavSystem.Common{    public class S ...

  4. Win10 隐藏盘符

    1.隐藏盘符 打开磁盘管理 -> 对要隐藏的盘符单击右键 -> 更改驱动器号和路径 -> 删除. 打开资源管理,已经看不到该盘符,该盘符已被隐藏.只是隐藏,该盘符上的数据仍然还在. ...

  5. prevent to do sth 与 prevent sb (from) doing 用法

    prevent to do sth 如: Do not water in before making a turn every time 9 days, make wilting of its bra ...

  6. javascript中 if(变量)和if(变量==true)的区别

    if(判断表达式){执行内容} 如果判断表达式为true,则执行括号中的内容.这里,变量如果不为0,null,undefined,false,都会被处理为true.只要变量有非0的值或是某个对象,数组 ...

  7. Python虚拟环境 之 virtualenv 与 virtualenvwrapper

           在开发Python应用程序的时候,比如系统安装的Python3只有一个版本:3.6.所有第三方的包都会被 pip 安装到Python3的 site-packages 目录下. 如果我们要 ...

  8. eclipse android SDK代理跟新

    启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manager - Settings』窗口: 在『Andro ...

  9. windows10家庭版 远程桌面报错

    windows10家庭版 远程桌面报错“要求的函数不受支持 ...”,Windows没有编辑组策略选项(gpedit.msc),所以无法按照微软提供的方法来修改组策略.所以我们需要修改注册表的方法来修 ...

  10. [CF] 402 E. Strictly Positive Matrix

    一个矩阵,自乘无限次后能否全为正数? 如果n比较小,可以二分一下,但是这里n很大,乘一次都无法接受 可以考虑实际含义:矩阵看成邻接矩阵,那么0就是没有边,其余就是有边. 我们知道邻接矩阵自乘k次就相当 ...