JML基础梳理及工具链

  JML的全称是Java Modeling language,即Java建模语言。JML是一种行为接口规格。它为严格的程序设计提供了一套行之有效的方法。通过JML不仅可以基于规格自动构造测试样例,还可以以静态方式检查代码对规格的满足情况。

  一、注释结构

    行注释://@annotation

    块注释:/*@ annotation @*/

  二、JML表达式

  (1)原子表达式

    \result表达式:表示一个非 void 类型的方法执行所获得的结果,即方法执行后的返回值。

    \old(expr)表达式:用来表示一个表达式expr在相应方法执行前的取值。

    \not_assigned(x,y,…)表达式:用来表示括号中的变量是否在方法执行过程中被赋值。

    \not_modified(x,y,…)表达式:限制括号中的变量在方法执行期间的取值未发生变化。  

    \nonnullelements(container)表达式:表示container对象中存储的对象不会有null。

   (2)量化表达式

     \forall表达式:全称量词修饰的表达式,表示对于给定范围内的元素,每个元素都满足相应的约束。

    \exists表达式:与forall表达式使用结构类似,为存在量词修饰的表达式,表示对于给定范围内的元素,存在某个元素满足相应的约束。

    \sum表达式:返回给定范围内的表达式的和。

    \product表达式:返回给定范围内的表达式的连乘结果。

    \max表达式:返回给定范围内的表达式的最大值。

    \min表达式:返回给定范围内的表达式的最小值。

    \num_of表达式:返回指定变量中满足相应条件的取值个数。

   (3)集合表达式

      集合构造表达式:可以在JML规格中构造一个局部的集合(容器),明确集合中可以包含的元素。

   (4)操作符

      (1) 子类型关系操作符: E1<:E2 ,如果类型E1是类型E2的子类型(sub type),则该表达式的结果为真,否则为假。

      (2) 等价关系操作符: b_expr1<==>b_expr2 或者 b_expr1<=!=>b_expr2 ,这两个表达式的意思是 b_expr1==b_expr2 或者 b_expr1!=b_expr2 。

      (3) 推理操作符: b_expr1==>b_expr2 或者 b_expr2<==b_expr1 。

      (4) 变量引用操作符:JML提供了几个概括性的关键词来引用相关的变量。\nothing指示一个空集;\everything指示一个全集.

  三、方法规格

    (1)  前置条件:requires

    (2)后置条件:ensures

    (3)副作用范围限定:assignable或modifiable

  四、类型规格

    从课程要求来看有

    (1)不变式限制

    (2)约束限制

部署JMLUnitNG/JMLUnit及实现自动生成测试样例

针对如下的compare代码

利用JMLUnitNG生成测试样例:

可以看到自动生成的测试样例包括了正数,负数,0以及边界条件的各种组合。覆盖非常的全面。

架构设计分析

第一次作业直接填写方法,没有太多自己设计的地方。

第二次作业需要设计一个图结构来计算最短路径。

增加了一个数点个数的HashMap,来判断增删路径后结点是否还存在。

增加了一个数路径的HashMap,来判断增删路径后边是否还存在。

增加了记录一个点与哪些点连接的HashMap。

第三次作业比较麻烦。我参考的是讨论区的拆点法,然后用迪杰斯特拉求解最短路径,特殊的,在求解最少换乘时采用的是染色算法。

bug分析及修复情况

第一次作业的bug很惨。当时比较大小只写了同长度比较大小的算法,备注了三个?,然后忘了没写完,就把备注删了,导致最后提交的时候出现了bug。

第二次作业难度依旧很小。没有什么bug。互相测试时出现一个判断大小的bug,原因是一个判断条件写错了。

第三次作业比较难。拆点之后用的迪杰斯特拉算法。但是我并没有完全按照讨论区的做法,导致算法上有误。在修修补补多处之后仍然无济于事的我最后选择了重构。

心得体会

OO作业每次发布的时候都会觉得好难,感觉无法完成。把作业指导书反复地读几遍之后,任务看起来似乎又很简单,只要做到A,B,C三点问题就解决了。然而实际操作的过程中,A,B,C似乎轻而易举地解决了,但是一旦把代码跑起来,就发现漏洞百出,各种莫名其妙的bug。然后一环一环地测试,每一小步都会发现问题。码代码贵在细节。无论哪里错了,结果都会相去甚远。

北航OO第三单元总结的更多相关文章

  1. 2020北航OO第三单元总结

    2020北航OO第三单元总结 本单元要求是根据JML规格完善代码,初看是一个简单的代码照搬实现的东西,但最后才发现由于CPU时间的限制,还考察了大量优化策略及数据结构中关于图的知识,是一次非常注重细节 ...

  2. 2019年北航OO第三单元(JML规格任务)总结

    一.JML简介 1.1 JML与契约式设计 说起JML,就不得不提到契约式设计(Design by Contract).这种设计模式的始祖是1986年的Eiffel语言.它是一种限定了软件中每个元素所 ...

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

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

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

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

  5. 2019年北航OO第1单元(表达式求导)总结

    2019年北航OO第1单元(表达式求导)总结 1 基于度量的程序结构分析 量化指标及分析 以下是三次作业的量化指标统计: 关于图中指标在这里简要介绍一下: ev(G):基本复杂度,用来衡量程序非结构化 ...

  6. 2020北航OO第四单元总结

    2020北航OO第四单元总结 一.本单元架构设计 本单元作业是实现一个UML图解析器,其中实现接口及主要框架课程组已经提供,只需要我们完成特定功能. 在第一次作业时,感到十分迷茫,不知道如何下手,最后 ...

  7. 北航OO第四单元——UML图解析

    北航OO第四单元--UML图解析 作业要求简析 刚接触本次作业可能需要花上一会才能搞清楚到底是要我们写个啥,在这里简单说一下: UML图的保存格式.mdj文件是以json文件的形式存储的,将每一个Um ...

  8. OO第三单元作业总结

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

  9. 规格化设计——OO第三单元总结

    规格化设计--OO第三单元总结 一.JML语言理论基础.应用工具链 1.1 JML语言 ​ JML(java modeling language)是一种描述代码行为的语言,包括前置条件.副作用等等.J ...

随机推荐

  1. Appium自动化(8) - 可定位的控件属性

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 在前面几篇文章可以看到,一个 ...

  2. Docker(24)- docker login 命令详解

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 登录 Docker 镜像仓 ...

  3. Hearthbuddy跳过ConfigurationWindow窗口

    Hearthbuddy版本为按照上一条博客修复后的版本. 打开Hearthbuddy后会弹出一个这样的窗口: 这个界面没有什么用,而且也没有人对此进行任何修改. 由于之前折腾版早就已经把这个界面跳过了 ...

  4. 分布式搜索引擎Elasticsearch在CentOS7中的安装

    1. 概述 随着企业业务量的不断增大,业务数据随之增加,传统的基于关系型数据库的搜索已经不能满足需要. 在关系型数据库中搜索,只能支持简单的关键字搜索,做不到分词和统计的功能,而且当单表数据量到达上百 ...

  5. 垃圾分类app--NABCD--团队项目需求与分析

    我们的产品是--智能垃圾分类APP,它的设计灵感的来自于"可持续化发展战略,走绿色发展道路",众所周知,垃圾是放错了地方的资源,因此我们团队为了响应国家"垃圾分类&quo ...

  6. CentOS7下编译安装redis-5.0.9

    CentOS7下编译安装redis-5.0.9 本文地址http://yangjianyong.cn/?p=171转载无需经过作者本人授权 下载redis #code start wget https ...

  7. centos linux服务器apache+mysql环境访问慢优化方法

    查找软件安装目录:find / -name 软件名称 一.优化apache配置增加MaxClients的值 默认情况下,2.0及以上apache版本MaxClients的值为256,对于中大型应用访问 ...

  8. Jmeter系列(12)- 上传接口压测

    step-1上传接口分析 上传接口源码分析:分析上传文件类型.有无大小限制.存放上传文件服务器 没有源码通过抓包工具,或者Chrome查看框架源代码 接口路径/uploadfile,接口请求POST, ...

  9. jmeter加密解密(加密篇)

    最近刚好在弄jmeter加密解密,可以分享下.(有一段时间没写了,有点不知道从何写起,这篇写的有点乱o(╥﹏╥)o) 需求是:接口中的请求体的部分参数需要先加密再请求,返回的结果中部分字段需解密. 1 ...

  10. 利用Qt中的ui文件生成PyQt5程序,自定义槽函数

    1.在Qt Creator4.8.0上面设计如上.ui文件 2.点击上方图标,可以建立信号-槽连接,button_click()为自定义槽函数 3.设计目的:点击clear按钮,可消除上方文本框中的内 ...