一、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. docker系列详解<二>之常用命令

    此篇我们以从docker运行一个tomcat为例,进行一下操作: 拉取镜像 查看镜像 创建容器 查看运行状态 进入退出容器 停止容器 重启容器 删除容器 删除镜像 1.拉取tomcat镜像: 1).查 ...

  2. CodeForces - 1006F (深搜从两端向中间搜,省时)

    题意:输入n,m,k,给出一个n*m的图,里面有权值,从1,1一路异或到n,m,只能向右或向下走,等于k有多少种路径. 思路:一开始就是直接暴力写个深搜,稳稳的超时,分析一下时间复杂度.每个点有两个方 ...

  3. 面试刷题28:如何写出安全的java代码?

    对jdk,jvm,java应用程序的攻击多种多样?那么从java程序员的角度,如何写出安全的代码呢? 我是李福春,我在准备面试,今天的题目是:如何写出安全的java代码? 答:这个需要从功能设计到实现 ...

  4. 利用sqlmap进行Access和Mysql注入

    sqlmap将检测结果保存到C:\Users\Administrator.sqlmap\output (windows) linux:(/root/.sqlmap/output) Access注入 1 ...

  5. 7.Maven命令

    在eclipse中运行maven 一.首先要对pom.xml文件右键→Run As→Maven build 二.输入Maven命令 三.常见的Maven命令有: [1]clean 清理 [2]comp ...

  6. 数据库连接JOIN

    1,连接类型及差异 INNER JOIN:结果集只有配对成功的数据,即不包含左表或右表为空的情况: OUTER JOIN: LEFT JOIN:结果包含左表的所有记录,右表不能成功匹配的显示NULL ...

  7. 使用IDEA创建SpringBoot项目

    SpringBoot学习第一步:搭建基础 IDEA对SpringBoot的项目支持可以说是点击就能完成基础的搭建,方便的不得了, 流程如下 1.左上角File选项,New project,选择Spri ...

  8. CCF题库刷题编译错误

    最近在CCF上刷题,因为C语言更合适,就使用了devc编译器,选择C语言但是却报编译错误 后来查了一下,发现在提交时选择C++语言就能满分通过,问题得以解决.

  9. vue中的$router 和 $route的区别

    最近在学习vue的单页面应用开发,需要vue全家桶,其中用到了VueRouter,在路由的设置和跳转中遇到了两个对象$router 和 $route ,有些傻傻分不清,后来自己结合网上的博客和自己本地 ...

  10. html5 css写出一个实心三角形和空心三角行

    原理:css中的border属性的特殊性. 实心三角形: html5: <div id="mydiv"></div> css: #mydiv{ height ...