快速业务通道

AOP@Work: 用Contract4J进行组件设计-用契约式设计和AspectJ改进软件 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
补的。契约式设计 的 一个主要优势是,它在接口或类本身当中提供了关于预期行为的显式信息。对于 组件开发人员和客户来说,结果实际上就是一种能够用编程方式进行测试的文档 。契约式设计也做了显式的合约定义,而在单元测试中这些更隐式。我喜欢交替 使用这两种技术,特别是在使用难以进行单元测试的技术(例如 EJB2 bean)时 。很快就会看到,Contract4J 添加了强迫使用约束的特性,这比 Junit 测试中 隐式的非正式文档有相当大的优势。

Contract4J 简介

Contract4J 是一个开源的开发人员工具,它用 Java 5 标注(请参阅 参考 资 料)实现契约式设计。在幕后,它用方面在应当执行测试的程序连接点处(例如 ,对方法的调用)插入 “建议”,它还对这些测试的失败进行处理,即终止程 序 执行。

再来看 BankAccount 接口,但是这次使用 Contract4J 标注。注意,我用黑 体把原来的代码突出,并且对有些字符串作了换行,以便更加清晰:

清单 1. 使用 Contract4J 标注的 BankAccount

@Contract @Invar("$this.balance > = 0.0") interface BankAccount {  @Post("$return >= 0.0")  float getBalance ();  @Pre("amount >= 0.0")  @Post("$this.balance == $old ($this.balance)+amount      && $return == $this.balance") float deposit(float amount);  @Pre("amount >= 0.0 &&     $this.balance -- amount >= 0.0")   @Post("$this.balance == $old($this.balance)-amount      && $return == $this.balance")  float withdraw(float amount);  ... }

AOP@Work: 用Contract4J进行组件设计-用契约式设计和AspectJ改进软件(3)

时间:2011-09-07 IBM

表 1 定义了清单 1 中看到的关键字:

表 1. Contract4J 关键字示例

关键字 定义
$this 要测试的对象
$target 目前仅用于字段不变测试的字段(可以用 $this.field_name 来引用 字段)。未来的使用可能会把 $target 扩展到其他上下文。
$return 方法返回的对象(或基本的值)。只在后置条件测试中有效。
$args[n] 传递给方法的第 n 个 参数,从 0 开始计数。也可以用名称引用参 数 。
$old 括号中的内容的 “旧” 值(在实际执行连接点之前)。只在不变条 件测试和后置条件测试中有效。因为 Java 不要求所有的类都支持 “克隆”, 所 以 Contract4J 无法知道是否可克隆特定对象。所以,$old(...) 中的表达式应 当只包含基本的值或不会改变的对象。否则 “旧” 值在连接点执行的时候可能 会变化,从而产生意料之外的结果。示例表达式包含 $old("$this.userName") 和 $old("$this.calcMin(x,y)")。Contract4J 文档详细描述了允许的表达式。

BankAccount 合约

根据前一节学到的内容,清单 1 中的标注应当不再神秘。@Contract 标注表 示拥有合约规范的接口(或类)。@Pre、@Post 和 @Invar 标注分别定义前置条 件测试、后置条件测试和不变条件测试。还会注意到清单 1 中的测试是定义成 字 符串的 Java 表达式,结果为 true 或 false。

如果遗漏了测试表达式,Contract4J 会根据上下文使用合理的默认设置。例 如,字段的默认不变条件要求字段不能为空。类似地,默认的方法前置条件要求 所有非基本

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号