OO第三单元总结——JML

一、JML

1. 简介

  JML是为Java专门设计的一个行为接口语言,使用了前置条件,后置条件和断言三者来描述方法的功能,并通过这些规范审查程序并差错。JML是为程序员而设计的,它描述方法的代码以注释的方式出现在Java源程序中,与源程序有机的综合在一起,一定程度的增加了代码的模块化,更方便程序员编写精确的高质量代码。

  JML语言实际上是综合了Eiffel和Larch语言的设计优点而加以改进产生的一个语言。Eiffel语言是按照DBC(Design By Contract)这一理念开发的一款语言,注重的是开发软件的高质量(可靠性、重用性、扩展性、移植性、维护性)。DBC作为Eiffel的设计核心理念,就是按契约设计,它以契约为核心建立了Eiffel的整个错误处理系统。Larch语言也是一种形式规范描述语言,它采用二层结构的方法来描述形式规范,包括Larch共享语言和Larch接口语言,这种方式把抽象的底层形式规范从整个状态转换的形式规范中剥离开 来,每个程序模块的形式规范在每一层都有一个组件。

  JML是一种特别为Java订制的建模语言。JML的基本用途就是用来描 述Java模块方法的形式规范。作为一种形式规范语言,JML描述了在一个Java 的模块中描述方法的行为,说明了这个方法是怎样使用的。它以注释的形式出 现在Java源文件中,并没有跟代码分离,形式规范与代码也相对的独立,在Java 文件编译的时候,这些被标记为注释的形式规范并不会影响代码的编译执行‘161。 而且JML不是为描述整个程序范畴的行为而设计,而是用来描述某个行为方法 模块。 应用JML有两个主要的好处,分别是:①准确,无歧义的形式规范描述,较好的文档化管理;②大批工具集的支持。

2. 工具集

  JML作为一门比较新的形式规范描述语言,提供了很多工具来描写,检查、 甚至自动生成形式规范的基奉框架。已经有一系列的工具来支持用户使用JML 语言。下图很好的表示了JML的整个工具集结构:

  

  (1)运行时断言检查和测试

  JML语言描写的形式规范本身也会出错,可以使用JML的工具“运行时断 言检查器”来检查JML形式规范是否正确。这个功能通过使用JML编译器jmlc 完成。

  (2)静态检查和验证

  在运行时检查之外,JML也可以通过形式规范来验证代码实现是否符合规 范约定,比起动态检查限制于只能测试某个用例,静态验证检查了代码的所有 可能情况。当然验证的准确程度是根据形式规范的描述决定的。JML有以下工 具提供静态检查和断言审查:程序检查器ESC/Java可以自动的发现Java 代码里面的一些普通错误和查看一些相对简单断言;ESC/Java2扩展了ESC/Java从而支持JML更多的语法,并增加了其他一些功能;Loop比 起ESC/Java能够处理一些更复杂的语法,但却需要用户更多的操作。

  (3)自动生成形式规范

  在为检查形式规范提供工具之外,JML拥有很多辅助生成形式规范的工具, 以此减少书写形式规范的成本消耗。Daikon这个工具通过观察最可能发生变 化的不变量来观察运行时程序的行为;Houdini工具把标识符转换成代码, 然后使用ESC/Java去检查;Jmlspec工具从Java的源代码生成一个形式规范文件的框架,而且可以通过比较两个不同文件来比较接口的一致性。

  (4)文档化工具

  最后JML像Java一样,可以通过工具以HTML页面的形式把形式规范文档化,就像Java里的Javadoc效果一样。

三、部署JMLUnitNG

  配置过程:https://course.buaaoo.top/assignment/71/discussion/199

  测试样例为一个简单的运算加法的add函数:

  public class Add

          /*@ ensures \result == (num1 + num2);        

         @ */

      public static int add(int num1, int num2) {

 return num1 + num2; } public static void main(String[] args) { add(123, 456);   }
  }

 运行结果:
 
Passed: constructor Add()
Passed: static add(-2147483648, -2147483648)
Passed: static add(0, -2147483648)
Passed: static add(2147483648, -2147483648)
Passed: static add(-2147483648, 0)

 同样对减法运算、乘法运算和除法运算进行测试。
三、心得体会
 对于规模比较大的程序,规格显得尤为重要。能让自己更加理解代码块的功能,在检查代码的时候思路清晰;同时也能让对方理解,特别是较为复杂的函数块,有好的规格才能提高代码的可读性。

 

转载于:https://www.cnblogs.com/mcpeng/p/10908722.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值