一、JML的理论基础应用工具链

JML是用于对Java程序进行规格化设计的一种表示语言。基于Larch方法构建。

(1)注释

JML以javadoc注释的方式来表示规格,每行都以@起头。有两种注释方式,行注释和块注释。其中行注释的表示方式
为//@annotation ,块注释的方式为/* @ annotation @*/ 。

(2)原子表达式

\result表达式:表示一个非void 类型的方法执行所获得的结果,即方法执行后的返回值。\result表达式的类型就是
方法声明中定义的返回值类型。如针对方法: public boolean equals (Object o) ,\result的类型是boolean ,
任意传递一个Object 类型的对象来调用该方法,可以使用\result来表示equals 的执行结果( true 表示this 和o
相等; false 表示不相等)。

(3)量化表达式

\forall表达式:全称量词修饰的表达式,表示对于给定范围内的元素,每个元素都满足相应的约束。(\forall int
i,j; 0 <= i && i < j && j < 10; a[i] < a[j]) ,意思是针对任意0<=i<j<10,a[i]<a[j] 。这个表达式如果
为真( true ),则表明数组a实际是升序排列的数组。

(4)方法规格

前置条件(pre-condition)
前置条件通过requires子句来表示: requires P; 。其中requires是JML关键词,表达的意思是“要求调用者确保P为
真”。注意,方法规格中可以有多个requires子句,是并列关系,即调用者必须同时满足所有的并列子句要求。如果
设计者想要表达或的逻辑,则应该使用一个requires子句,在其中的谓词P中使用逻辑或操作符来表示相应的约束场
景: requires P1||P2; 。
后置条件(post-condition)
后置条件通过ensures子句来表示: ensures P; 。其中ensures是JML关键词,表达的意思是“方法实现者确保方法执
行返回结果一定满足谓词P的要求,即确保P为真”。同样,方法规格中可以有多个ensures子句,是并列关系,即方
法实现者必须同时满足有所并列ensures子句的要求。如果设计者想要表达或的逻辑,这应该在在一个ensures子句
中使用逻辑或( || )操作符来表示相应的约束场景: ensures P1||P2; 。
副作用范围限定(side-effects)
副作用指方法在执行过程中会修改对象的属性数据或者类的静态成员数据,从而给后续方法的执行带来影响。从方法
规格的角度,必须要明确给出副作用范围。JML提供了副作用约束子句,使用关键词assignable 或者
modifiable 。

(5)应用工具

Openjml,junit,SMT Solver都能从不同方面对于所写代码的规格以及类方法等进行测试正确性。

二、架构设计与重构分析

(1)第一次作业

度量图

类图

第一次作业主要就是按照所给规格进行代码的书写,比较简单,类方法也比较好理解,关键是对查询增删等数据结构存储的优化。

(2)第二次作业

度量图

类图

本次作业主要是增加了计算最短路径和连通性,比第一作业难度还是增加了不少,主要是考虑路径删减与边的删减联系起来的快速方法,采用hashmap等数据结构存储边,便于快速增删还有就是对最短路径的算法的选择以及对最短路径结果的存储管理,主要是如何快速查找以及计算的问题。

(3)第三次作业

度量图

类图

本次作业增加了连续换乘,票价,不满意度等的计算,所以导致前面所写的方法大量重构,本次作业所写的算法也是一个难点之一,如何寻找一个快速的算法尽快求出结果,又如何存储图的数据而避免来回的轮询是一个非常困难的问题。对于类的继承、重写的要求也非常高。

三、bug修复

  第一次作业

  在比较字典序路径时对规格方法理解出现错误,当一条路径比一条路径的节点多时就误认为这条路径比较长。还有就是使用的是ArrayList结构,在大量的查询命令情况下容易超时。

  第二次作业

  这次作业问题主要是超时,主要是程序中采用的dfs算法计算最短路径结果存储的遍历有大量的偏高的复杂度,需要对查询的算法进行优化。

  

四、心得和体会

JML在描述相对不是很复杂的类方法时可以清晰的描述方法需求,前置条件,计算结果等,便于对方法功能特性的理解。使用JML也使得代码能够更加便于封装和继承,在工程上使用也是具有很大的优势。

JML的描述也是十分严谨的,对于自己正确书写JML规格的要求也比较高,此外虽然JML语言描述出了方法具体的需求,但具体的实现过程以及如何使用相应的算法却也是更重要的,只有二者在解决实际工程问题上很好的结合起来才能达到更好的效果,JML配备的各种测试工具也能较快的让我们对于自己程序的错误进行精准的打击然后改正。JML是非常有实用价值的。

OO第三单元作业分析的更多相关文章

  1. OO第三单元作业总结

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

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

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

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

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

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

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

  5. OO前三次作业分析

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

  6. OO第三单元作业小结

    一.JML理论基础及应用工具链情况 理论基础 1.JML表达式 \result:表示方法执行后的返回值. \old(expr):表示一个表达式expr在相应方法执行前的取值. \foall:全称量词修 ...

  7. 北航OO第三单元作业总结(3.1~3.3)

    JML简介及相关工具链使用 1.JML规格描述语言介绍 本单元学习的内容是JML规格描述语言.我们知道,面向对象方法是一个抽象过程,需求者仅需关注方法的规格.规格是对一个方法/类/程序的外部可感知行为 ...

  8. 2019北航OO第三单元作业总结

    1.梳理JML语言的理论基础.应用工具链情况 JML基础理论: JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML是一种行为接口规格语言,基 ...

  9. BUAA OO 2019 第三单元作业总结

    目录 总 JML规格化设计 理论基础 工具链 规格验证 验证代码 代码静态检查 自动生成测试样例 生成结果 错误分析 作业设计 第九次作业 架构 代码实现 第十次作业 架构 代码实现 第十一次作业 架 ...

随机推荐

  1. No compiler is provided in this environment报错解决方案

  2. Python基础 | 关于“循环”那些事

    目录 for 循环 list range enumerate zip while 循环 while相当于if时 while充当for和if的混合体 泛循环 列表解析 map 迭代器 生成器 循环的跳出 ...

  3. 【转】不怕难之BlockingQueue及其实现

    1. 前言 BlockingQueue即阻塞队列,它是基于ReentrantLock,依据它的基本原理,我们可以实现Web中的长连接聊天功能,当然其最常用的还是用于实现生产者与消费者模式,大致如下图所 ...

  4. 题解 P1985 【[USACO07OPEN]翻转棋】

    讲讲我的做法 刚开始做这道题的时候,看到\(n<=15\),我这个\(6\)年级的蒟蒻的第1反应是状压\(dp\).貌似不好做.然而,等到我在省中集训的时候,老师的一席话,让我豁然开朗.今天我准 ...

  5. 【多校】2019 Multi-University Training Contest 1官方题解

    Blank 定义dp[i][j][k][t]dp[i][j][k][t]dp[i][j][k][t]代表填完前ttt个位置后,{0,1,2,3}\{0,1,2,3\}{0,1,2,3}这4个数字最后一 ...

  6. python中的抽象类

    今天给大家介绍一下python中一个强大的功能:抽象类 因为最近发现很多同事不理解抽象类,正好抽空写篇博客,给大家介绍一下抽象类 抽象类的作用就是控制子类的方法的名称,要求子类必须按照父类的要求的实现 ...

  7. C# 录音和播放录音-NAudio

    在使用C#进行录音和播放录音功能上,使用NAudio是个不错的选择. NAudio是个开源,相对功能比较全面的类库,它包含录音.播放录音.格式转换.混音调整等操作,具体可以去Github上看看介绍和源 ...

  8. Android之练习MVVM+DataBinding框架模式

    最近简单学习了MVVM框架,记录一下. 结果演示: 分析其功能在不同框架下的构成: 无框架 可以明显感受到在无框架下,虽然一个单独的Activity即可实现功能,但其负担过重,代码复查时繁琐,一旦需要 ...

  9. ES6语法:函数新特性(一)

    ES6 函数 引言: 函数在任何语言中偶读很重要,java里面的函数通常叫做方法,其实是一个东西,使用函数可以简化更多的代码,代码结构看着更加清晰.今天我们来学学ES6语法中,函数有什么变化. 虽然现 ...

  10. iOS 13DarkMode暗黑模式

    iOS 13系统的iPhone 在设置-->显示与亮度 -->选择深色 即开启暗黑模式 1.暗黑模式关闭 1.1 APP开发未进行暗黑适配,出现顶部通知栏字体颜色无法改变始终为白色.可以全 ...