OO第三单元——JML的使用与地铁系统

梳理JML语言的理论基础、应用工具链情况

JML

The Java Modeling Language (JML) is a specification language for Java programs, using Hoare style pre- and postconditions and invariants, that follows the design by contract paradigm. Specifications are written as Java annotation comments to the source files, which hence can be compiled with any Java compiler.

——https://en.wikipedia.org/wiki/Java_Modeling_Language

jml,简单来说,就是在每个方法之前,类似于Javadoc,用注释的形式写出这个方法的效果。和其他规格化是设计不同的是,它可以算是使用了形式化的语言——这样,我们就可以使用程序来解读他,同时他也没有了歧义性。

他的基础如下:

  • 使用注释结构
  • 由表达式构成
    1. 原子表达式

      • 即各种特殊“符号(Symbol)”
      • 如 \result
    2. 量化表达式
      • 如\forall \exists等
      • 基本格式类似于java中for的写法,(\exist; condition; condition)可以在里面进行限制,约束。
      • 类似于 谓词逻辑(离散数学)
    3. 集合表达式
    4. 操作符
  • 方法规格
    • 前置条件 (requires)
    • 后置条件 (ensure)
    • 副作用范围限定 (assignable modifiable)
  • 类型规格

参考:

​ https://en.wikipedia.org/wiki/Java_Modeling_Language

​ 《JML Level 0手册》

以上构成了jml的基础

JML工具链

A variety of tools provide functionality based on JML annotations. The Iowa State JML tools provide an assertion checking compiler jmlc which converts JML annotations into runtime assertions, a documentation generator jmldoc which produces Javadoc documentation augmented with extra information from JML annotations, and a unit test generator jmlunit which generates JUnit test code from JML annotations.

——https://en.wikipedia.org/wiki/Java_Modeling_Language

jml 需要支持一个编译器jmlc,一个文档生成器 jmldoc,一个单元测试程序jmlunit

以下团队在做jml相关内容

  • ESC/Java2 [1], an extended static checker which uses JML annotations to perform more rigorous static checking than is otherwise possible.
  • OpenJML declares itself the successor of ESC/Java2.
  • Daikon, a dynamic invariant generator.
  • KeY, which provides an open source theorem prover with a JML front-end and an Eclipse plug-in (JML Editing) with support for syntax highlighting of JML.
  • Krakatoa, a static verification tool based on the Why verification platform and using the Coq proof assistant.
  • JMLEclipse, a plugin for the Eclipse integrated development environment with support for JML syntax and interfaces to various tools that make use of JML annotations.
  • Sireum/Kiasan, a symbolic execution based static analyzer which supports JML as a contract language.
  • JMLUnit, a tool to generate files for running JUnit tests on JML annotated Java files.
  • TACO, an open source program analysis tool that statically checks the compliance of a Java program against its Java Modeling Language specification.
  • VerCors verifier

在Github和Gitlib搜索JML,大致获得了一下比较完善的开源项目实现:

  • OpenJML, 包含了编译器等
  • JmlUnitNG,单元测试

JMLUnitNG 尝试

这里尝试使用了一个较为简单的类

(有错误)

public class Alu {/*@@ ensures (a <= b) ==> (\result == a);@ ensures (a > b) ==> (\result == b);@*/public static int min(int a, int b) {return Integer.min(a, b);}/*@@ ensures (a >= b) ==> (\result == a);@ ensures (a < b) ==> (\result == b);@*/public static int max(int a, int b) {return Integer.min(a, b);}
}

分别运行

java -jar jmlunitng.jar Alu.java
javac -cp jmlunitng.jar *.java
java -jar openjml.jar -rac Alu.java

(注意这里jmlunitng和openjml都只支持java8)

然后查看生成的文件

.
├── Alu.class
├── Alu.java
├── Alu_ClassStrategy_int.class
├── Alu_ClassStrategy_int.java
├── Alu_InstanceStrategy.class
├── Alu_InstanceStrategy.java
├── Alu_JML_Test.class
├── Alu_JML_Test.java
├── Alu_max__int_a__int_b__0__a.java
├── Alu_max__int_a__int_b__0__b.java
├── Alu_min__int_a__int_b__0__a.class
├── Alu_min__int_a__int_b__0__a.java
├── Alu_min__int_a__int_b__0__b.class
├── Alu_min__int_a__int_b__0__b.java
├── PackageStrategy_int.class
├── PackageStrategy_int.java
├── PackageStrategy_java_lang_String.class
├── PackageStrategy_java_lang_String.java
├── PackageStrategy_java_lang_String1DArray.class
└── PackageStrategy_java_lang_String1DArray.java

这里阅读这些文件,可以注意到Jmlunitng生成的单元测试文件是使用TestNG测试的。

因此我们使用TestNG测试。

得到如上结果。

可以看到有的test Failed了,这就说明我们写错了,这时候,就可以去查找对应的错误了。

(仔细查找,可以发现是我Max里面返回的是min(故意写错的(笑)))

本单元的作业

结构

以下是三次作业的横向对比:

第一次:

第二次:

可以看到,我前两次作业的结构比较简单,基本只是使用简单的方法实现了题目要求。

每次也是基本复制了前一次代码。

第三次

第三次作业,我进行较大的改动。

以下是类图:

首先,我将算法封装了起来,封装成了一个ShortestPathAlgorithm类,里面有静态的方法,通过传入图,进行计算。

然后,我是写了Calculator抽象类,这个抽象类要负责对图进行储存,实时计算最短路,并缓存。

我分别实现了两种Calculator,分别是Mapped和Normal,其中Mapped是为了我在拆点的时候,给点编号使用了Map,因此单独实现了。

之后,我实现了一个工厂类GraphBuilder负责建图。在建图的时候,需要传入一个Engine,这个Engine要负责计算每条边的长度。(即,不同的需求,只需要更改和重写engine即可)

由此我实现了代码的服用和解耦。

bug 和 测试

很不幸,我在第一次作业中写出了bug,得了60分。

我在维护每个点点出现的个数这个map的时候,我在如果加入一个已经存在的Path时,我可能重复加入,虽然只是一行代码的问题,但是这可带来的巨大的bug。

因此,在之后的实验中,我吸取了教训,进行了较多的测试,并写了自动化的测试。

以下是我的datamaker

https://github.com/login256/BUAAOO-homework11-datamaker

心得

关于这三次作业的结构

OO的目的是什么?这是我经常思考的问题。除了结构上的容易理解、好看,我觉得,或许在最初提出的时候,还有一个重要的目的,就是代码的封装和复用

对,代码复用。仔细想想之前我每次的设计架构,除了符合面向对象的标准,我考虑的最多的就是:这样好不好写,或者说,这样的代码会不会写出大量的冗杂

在这次OO作业中,我渐渐明白了,人们为什么要提出一个又一个新的设计方法,从面向过程,到面向对象,再到函数式...人们其实就是想让代码“好看”、“美妙”。所谓好看,就是美观,大家容易读懂,容易配合,所谓美妙,就是简洁,就是没有冗杂的代码。

我也希望自已以后能写出NB的代码!

关于JML

在写隔壁那门OS课的时候,我们有时也需要根据每个函数的注释的规格(写了前置条件,后置条件等等),来补全每个函数。然而,我们经常遇见这样一种情况:这个注释写的太模糊了!根本读不懂!

当时,我就在想,有没有办法,让规格可以少一些歧义。

终于,在OO这门课中,我学到了JML这门语言!

形式化->可以准确描述/没有歧义。

形式化->可以被程序读取!

这样,不仅写代码的人可以准确读懂需求,测试人员还可以直接根据JML自动生成测试数据!

这是多么厉害的一件事情啊。

因此,我在这次作业中,明白了什么叫做实现细节和行为描述分隔开来,明白了这样的好处,也明白了形式化的语言的好处。在使用JML工具的时候,我也进行了各种探索感受到了探索的乐趣!

最后,祝OO这门课越来越好,祝计算机学院的学生们得到更好的锻炼!

转载于:https://www.cnblogs.com/login256/p/10903443.html

OO第三单元——规格化设计与地铁系统——总结相关推荐

  1. BUAA OO 第三单元 规格化设计

    黑箱测试 黑箱测试将被测软件看做一个打不开的黑盒,主要根据功能需求设计测试用例进行测试. 可以检测软件功能能否按照需求规格说明书的规定正常工作,是否有功能遗漏,行为.性能是否满足要求等. (个人感觉像 ...

  2. OO--第三单元规格化设计 博客作业

    OO--第三单元规格化设计 博客作业 前言 第三单元,我们以JML为基础,先后完成了 PathContainer -> Graph -> RailwaySystem 这是一个递进的过程,代 ...

  3. OO第三单元JML规格总结分析

    OO 第三单元博客作业 1. JML语言概述 1.1 理论基础 综述 Java建模语言(Java Modeling Language,JML)是一种进行详细设计的符号语言,使人们用一种全新的方式来看待 ...

  4. OO第三单元总结性博客

    OO第三单元总结性博客 JML理论基础与工具链 JML理论基础 JML是一种将java程序规格化表达的一种语言,其描述的是行为的规格,而非具体的代码实现. 通过对程序开展规格化设计,当然前提是使用JM ...

  5. OO第三单元单元总结

    OO第三单元单元总结 测试过程 黑箱操作和白箱操作 黑箱操作我认为就是通过随机构造合法数据对代码进行测试,在测试过程中应当着重对边界条件.前置条件.结果正确性等方面进行判断.不需要具体到代码的逻辑,通 ...

  6. OO第三单元作业总结

    OO第三次作业总结 一.JML (一)JML语言理论基础 (1)JML表达式: JML表达式包括以下几种: 原子表达式如\result(方法执行后的返回值).\old(表达式在相应方法执行前的取值): ...

  7. 菜鸡谈OO 第三单元总结

    JML语言梳理 JML理论基础 JML是一种契约式设计,一种形式化java建模语言.契约式设计的核心是将代码实现和设计本身分离.设计者只考虑设计层面的问题. 注释结构 行注释  //@ annotat ...

  8. OO——第三单元JML规格编程总结

    一.JML理论基础及应用工具链 JML存在的意义 1. 开展规格化设计,能够实现设计与实现分离,实现进行提前测试. 2. 方便程序代码的阅读和维护. JML方法规格 requires -- pre-c ...

  9. JML规格编程——BUAA OO第三单元作业总结

    整体概述 这个单元整体围绕Java Model Language(JML)展开,通过学习JML规格了解契约式编程的过程,课上实验中进行了JML规格的简要编写,课下实验主要通过阅读规格并按照规格的要求正 ...

最新文章

  1. pyspark 学习 Tips
  2. python自带gui_一个极简易上手的 Python GUI 库
  3. Synchronize锁对象
  4. python27文件夹_为什么python27.dll不是python安装文件夹的一部分,而是在Windows系统文件夹中...
  5. Problem D: 分数减法——结构体
  6. Linux上SQL Server 2019和Ubuntu上的Docker容器
  7. Unity3D实现按钮切换Panel的功能
  8. STM32从设置IO输入上下拉到寄存器GPIOx_BSRR、GPIOx_BRR
  9. 基于RV1126平台imx291分析 --- media注册
  10. 酒店管理系统c语言课程设计,基于C语言的酒店管理系统课程设计.doc
  11. Android 9.0的One UI系统,三星S9/S9+更新One UI 安卓9.0已正式推送
  12. 删除服务列表中的Tomcat服务?(或删除服务列表中的任意服务)
  13. 计算机组装与维护启发式教学,电工技能与电子工艺技术实训
  14. 已知函数ex可以展开为幂级数。现给定一个实数x,要求利用此幂级数部分和求ex的近似值,求和一直继续到最后一项的绝对值小于0.00001。
  15. Axure8.0AxureRP8实战手册
  16. 高精度乘法+刘汝佳BigNumber高精度结构体
  17. 分享一个更高效的数据清理方法,建议收藏
  18. 转载:虚拟机安装centos6.5出现 unsupported hardware detected 解决方法
  19. 关于kernels启动报错的问题
  20. 月薪8万!这尼姑,你当不?

热门文章

  1. \u202E与\u202D的RLO与LRO (QQ消息后缀 喵!)
  2. 关于软考中级数据库的一些讨论
  3. 对角矩阵的性质(diagonal matrix)
  4. 计算机中的数据是一个广义的概念,广义数据结构
  5. linux mate中文输入法,树莓派3b基于UbuntuMate下载中文输入法(示例代码)
  6. 数据库----------唯一约束、默认约束、零填充约束
  7. STM32普中F103抢答器与抢答器的延时控制
  8. (转载)【笨木头Lua专栏】基础补充07:协同程序初探
  9. python音乐可视化效果_Python 一个漂亮的音乐节奏可视化方案!我觉得可行!
  10. [翻译] 在 LaTeX 中对齐公式