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问题解决方案(4)- Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException

    背景 操作步骤 运行 uiautomatorviewer.bat 点击左上角的 Device ScreensShot 报错 截图 解决方法 网上还是有很多方法的,可能造成的原因不同,我是第六种方法解决 ...

  2. yield实现 coroutine协程案例

    yield可以手工实现协程,但python为我们封装了一个greenlet,先看看yield实现,yield需要手工操作,无法实现IO操作时自动切换协程,greenlet是封装好的,能方便使用io切换 ...

  3. Vue3.x全家桶+vite+TS-搭建Vue3.x项目

    目录 一.搭建基础项目 1.vite创建项目 3.运行项目 2.环境变量设置介绍 vite配置多环境打包 二.配置Router 1.安装路由 2.配置路由 3.引入 三.配置Vuex 1.安装vuex ...

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

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

  5. webpack learn2-vue的jsx写法和postcss 1

    首先输入命令安装 npm i postcss-loader autoprefixer babel-loader babel-core 在根目录创建文件 .babelrc和postcss.config. ...

  6. Java基础(六)——集合

    一.概述 1.介绍 为什么出现集合? 答:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,对对象进行存储,集合就是存储对象最常用的一种方式. 数组和集合类同是容器,有何不同? ...

  7. FreeRTOS-06-信号量

    说明 本文仅作为学习FreeRTOS的记录文档,作为初学者肯定很多理解不对甚至错误的地方,望网友指正. FreeRTOS是一个RTOS(实时操作系统)系统,支持抢占式.合作式和时间片调度.适用于微处理 ...

  8. nginx rewrite重写规则集合

    本文根据网络搜索整理,不是原创 一.正则表达式匹配,其中: ~ 为区分大小写匹配 ~* 为不区分大小写匹配 !~和!~* 分别为区分大小写不匹配及不区分大小写不匹配 . 匹配除换行符以外的任意字符 \ ...

  9. test,exec,match,replace方法区别 正则

    这四种方法都是用来检测字符串是否包含某一子串或是否匹配否个正则表达式 test方法,匹配返回true,不匹配返回false match,匹配返回匹配到的数组(包含多次/g),匹配一次返回包含匹配子串的 ...

  10. P5212-SubString【LCT,SAM】

    正题 题目链接:https://www.luogu.com.cn/problem/P5212 题目大意 开始一个字符串\(S\),有\(n\)次操作 在\(S\)末尾加入一个字符串 询问一个串在\(S ...