一、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. 「newbee-mall新蜂商城开源啦」GitHub 上最热门的 Spring Boot 项目,我也要做一次靓仔!

    没有一个冬天不可逾越,也没有一个春天不会到来. 介绍一下新蜂商城的近况,同时,新蜂商城 Vue 版本目前也在开发中,在这篇文章里我也向大家公布一下新蜂商城 Vue 版本的开发进度,和大家同步一下,在不 ...

  2. Journal of Proteome Research | Proteomic analysis of Rhizobium favelukesii LPU83 in response to acid stress.(酸胁迫下根瘤菌LPU83(Rhizobium favelukesii)的蛋白质组学分析)(解读人:丑天胜)

    文献名:Proteomic analysis of Rhizobium favelukesii LPU83 in response to acid stress.(酸胁迫下根瘤菌LPU83(Rhizo ...

  3. 将SublimeText加入右键菜单

    将SublimeText加入右键菜单 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\SublimeText] @=&q ...

  4. Django redis的使用

    一 简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted ...

  5. 接口自动化框架pyface详细介绍

    版权说明 本框架系本人结合一些实践经验和开源框架设计思想,在家基于兴趣爱好独立完成的代码开发. 源码只保存在私人电脑,办公电脑上无.github开源与公司无关,先把关系撇清,不涉及侵权. 嘘. 框架定 ...

  6. eclipse-JEE配置Tomcat并发布第一个项目

    一.配置过程 Window--preferences--Server--Runtime Environment, 然后点击add 我下载的是Tomcat7.0,选择你的版本就行了 选择Tomcat的安 ...

  7. Ubuntu 18.04 将gcc版本降级为5.5版本

    Remark: Polynomial algebra 程序由于版本问题只能在gcc 5.0 版本运行, 而ubuntu更新会将gcc 更新到7.0版本,出现冲突(报错:如下) collect2: er ...

  8. 8 个出没在 Linux 终端的诡异家伙

    这篇文章,我们一起来到 Linux 的诡异的一面-- 你知道吗?在我们日常使用的 Unix(和 Linux )及其各种各样的分支系统中,存在着一些诡异的命令或进程,它们让人毛骨悚然,有些确实是有害,但 ...

  9. (线段树 -星星等级)Stars POJ - 2352

    题意: 给出n个星星的坐标 x,y ,当存在其他星星的坐标x1,y1满足x>=x1&&y>=y1时 这个星星的等级就加1. 注意: 题中给的数据是有规律的 ,y是逐渐增加的 ...

  10. 莎士比亚电路ヾ(≧▽≦*)o

    偶尔记录一件有趣的事儿! 这个电路叫做 "莎士比亚电路"[1],请自行参悟,ヾ(≧▽≦)o,ヾ(≧▽≦)o,ヾ(≧▽≦*)o ヾ(≧▽≦*)o . <穿越计算机的迷雾> ...