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. 痞子衡嵌入式:在MDK开发环境下将关键函数重定向到RAM中执行的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在MDK开发环境下将关键函数重定向到RAM中执行的几种方法. 这个关键函数重定向到 RAM 中执行系列文章,痞子衡已经写过 <IA ...

  2. ubantu硬盘不足,无法启动

    我的ubantu虚拟机经过我一顿操作后,就起不来了.然后经过多方询问,广集天下良方,最终发现是由于分配的硬件空间不足导致的.现象如下: 通过查看 root@ubantu:/snap# df -h Fi ...

  3. servlet请求转发于重定向

    请求的转发与重定向是Servlet控制页面跳转的主要方法,在Web应用中使用非常广泛. 一. 请求的转发 Servlet接收到浏览器端请求后,进行一定的处理,先不进行响应,而是在服务器端内部" ...

  4. find用法 以及和exec xargs 的组合使用

    1.查找当前目录下所有的txt的文件 [root@master1 ~]# find . -name "*.txt" -type f ./a.txt ./b.txt 2.exec 结 ...

  5. 消息队列之 kafka 集群搭建

    我们先弄清楚kafka集群环境首先需要些什么 JDK 10+ Zookeeper Kafka 2.x 首先准备三台虚拟机 centos7 ,更改IP地址为静态地址分别为,29.30.31 cd /et ...

  6. 引人遐想,用 Python 获取你想要的 “某个人” 摄像头照片

    仅用来学习,希望给你们有提供到学习上的作用. 1.安装库 需要安装python3.5以上版本,在官网下载即可.然后安装库opencv-python,安装方式为打开终端输入命令行. 2.更改收件人和发件 ...

  7. 记一次k8s pod频繁重启的优化之旅

    关键词:k8s.jvm.高可用 1.背景 最近有运维反馈某个微服务频繁重启,客户映像特别不好,需要我们尽快看一下. 听他说完我立马到监控平台去看这个服务的运行情况,确实重启了很多次.对于技术人员来说, ...

  8. python pip 安装使用国内镜像源

    国内镜像源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 ...

  9. 接口测试checklist

    静态测试 接口文档与设计文档对应 接口定义 接口定义与数据库定义 业务功能测试 系统全流程验证 逆向全流程验证 事务性测试 边界值测试 业务规则边界值 场景分析合理长度 场景分析合理数据量 输入.输出 ...

  10. windows terminal+wsl+neovim配置过程杂记

    长期记录,草稿 coc依赖于node,直接sudo apt intsll node得到的版本是10.x,无法满足要求, 这篇博客介绍了安装新版node的方法https://www.cnblogs.co ...