AOP@Work: 用Contract4J进行组件设计-用契约式设计和AspectJ改进软件 - 编程入门网
AOP@Work: 用Contract4J进行组件设计-用契约式设计和AspectJ改进软件时间:2011-09-07 IBM简介:契约式设计(Design by Contract)是切实可行的技术,可以阐明组 件 设计的细节、为客户记录正确的组件用法,并用编程的方式测试组件使用的顺应 性(compliance)。在 AOP@Work 的最后一篇中,Dean Wampler 介绍 了 Contract4J,这是契约式设计的工具,它用 Java ™ 5 标注 (annotation)指定合约,并在运行时用 AspectJ 方面计算合约。在成为 AOP 工具包中新增的一个举足轻重的工具的同时,Contract4J 迎合了面向方面设计 的 新趋势。 假设您刚刚加入一个构建银行应用程序的项目。在浏览代码时,您发现(已 经 简化的)BankAccount 的下面这个接口:
上面这个接口虽然简洁,但遗留了许多问题没有回答。deposit() 或 withdraw() 的 amount 参数可以是负数或零么?允许负余额(透支)么?如果 指 定了错误的 amount,deposit() 或 withdrawal() 中会发生什么情况呢? 显然,对于该接口的实现者和使用公开该接口的组件的人来说,能够回答这 些 问题是重要的。一种隐式地指定行为的方法是使用以 JUnit(请参阅 参考资料 ) 编写的单元测试。使用 JUnit 测试,可以用各种合法和不合法的参数调用这些 方 法,并作出有关预期结果行为发生的断言。另一种方法是契约式设计,这是阐明 组件设计细节的一项切实可行的技术。 在 AOP@Work 系列的最后这篇文章中,我将介绍 Contract4J,这是一个基于 AspectJ 的工具,支持契约式设计。我将介绍如何用 Contract4J 隐式地指定组 件行为,为用户记录组件的正确用法,并用编程的方式测试组件使用的顺应性。 在这篇文章最后,我将讨论 Contract4J 如何迎合面向方面设计中正在出现的趋 势。 契约式设计概述 使用契约式设计,可以用可编程表达式指定对于组件输入和返回结果的要求 。 在开发人员和 QA 测试期间,对表达式进行计算,如果测试失败,程序执行立即 终止。程序的终止带有有用的诊断信息,迫使开发人员立即修复 bug。 强制立即终止看起来可能有点麻烦。为什么要放过错误消息还继续运行呢? 虽 然继续运行看起来可能比较有生产效率,但实际上不是的。首先,如果没被强制 要求立即处理 bug,就会推迟修复 bug,这样 bug 就会累积。其次,失败的测 试 应当代表发生了意料之外的事(例如,引用为空),正常的执行不能继续。虽然 可以放入 “意外处理” 代码,但是这反而可能会把实现复杂化,出现永远不会 发生的情况,从而增加代码的复杂性和更多 bug 的风险。 AOP@Work: 用Contract4J进行组件设计-用契约式设计和AspectJ改进软件(2)时间:2011-09-07 IBM指定组件行为 契约式设计是一种发现和修复代码中逻辑错误的工具。它并不解决其他诸如 性 能、用户输入之类的问题。契约式设计使用三类测试来指定和确保组件的行为: 对组件输入(例如传递给方法的参数)的测试叫做前置条件测试。它们指定 组 件执行请求的操作之前需要满足的条件。客户必须满足这些要求才能使用组件。 后置条件测试 确保组件完成操作的时候结果符合要求,假设前置条件已经满 足。后置条件测试通常用方法返回值的断言来表示。 最后,不变条件测试 断言永远不变的条件。类在方法调用之前和之后必须保 持不变(一旦对象已经构建)。方法在调用之前和之后必须保持不变;字段则在 对象的整个生命周期中保持不变。 注意,在生产部署时可以关闭契约式设计测试,以消除它们的开销。 单元测试和契约式设计 契约式设计比起单元测试有些优势,但是这两种方法是互 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |