首页 / 软件开发 / JAVA / AOP@Work: 用Contract4J进行组件设计-用契约式设计和AspectJ改进软件
AOP@Work: 用Contract4J进行组件设计-用契约式设计和AspectJ改进软件2011-09-07IBM简介:契约式设计(Design by Contract)是切实可行的技术,可以阐明组 件 设计的细节、为客户记录正确的组件用法,并用编程的方式测试组件使用的顺应 性(compliance)。在 AOP@Work 的最后一篇中,Dean Wampler 介绍 了 Contract4J,这是契约式设计的工具,它用 Java ™ 5 标注 (annotation)指定合约,并在运行时用 AspectJ 方面计算合约。在成为 AOP 工具包中新增的一个举足轻重的工具的同时,Contract4J 迎合了面向方面设计 的 新趋势。假设您刚刚加入一个构建银行应用程序的项目。在浏览代码时,您发现(已 经 简化的)BankAccount 的下面这个接口:interface BankAccount {
float getBalance();
float deposit(float amount);
float withdraw(float amount);
...
}上面这个接口虽然简洁,但遗留了许多问题没有回答。deposit() 或 withdraw() 的 amount 参数可以是负数或零么?允许负余额(透支)么?如果 指 定了错误的 amount,deposit() 或 withdrawal() 中会发生什么情况呢?显然,对于该接口的实现者和使用公开该接口的组件的人来说,能够回答这 些 问题是重要的。一种隐式地指定行为的方法是使用以 JUnit(请参阅 参考资料 ) 编写的单元测试。使用 JUnit 测试,可以用各种合法和不合法的参数调用这些 方 法,并作出有关预期结果行为发生的断言。另一种方法是契约式设计,这是阐明 组件设计细节的一项切实可行的技术。在 AOP@Work 系列的最后这篇文章中,我将介绍 Contract4J,这是一个基于 AspectJ 的工具,支持契约式设计。我将介绍如何用 Contract4J 隐式地指定组 件行为,为用户记录组件的正确用法,并用编程的方式测试组件使用的顺应性。 在这篇文章最后,我将讨论 Contract4J 如何迎合面向方面设计中正在出现的趋 势。契约式设计概述使用契约式设计,可以用可编程表达式指定对于组件输入和返回结果的要求 。 在开发人员和 QA 测试期间,对表达式进行计算,如果测试失败,程序执行立即 终止。程序的终止带有有用的诊断信息,迫使开发人员立即修复 bug。强制立即终止看起来可能有点麻烦。为什么要放过错误消息还继续运行呢? 虽 然继续运行看起来可能比较有生产效率,但实际上不是的。首先,如果没被强制 要求立即处理 bug,就会推迟修复 bug,这样 bug 就会累积。其次,失败的测 试 应当代表发生了意料之外的事(例如,引用为空),正常的执行不能继续。虽然 可以放入 “意外处理” 代码,但是这反而可能会把实现复杂化,出现永远不会 发生的情况,从而增加代码的复杂性和更多 bug 的风险。