用AOP增强契约:用AspectJ为Java软件开发加入契约式设计 - 编程入门网
用AOP增强契约:用AspectJ为Java软件开发加入契约式设计时间:2011-09-07 ibm Filippo Diotalevi简介:在开发企业软件时,Java 代码经常需要与外部组件交互。不管应用程 序必须与遗留应用程序、外部系统还是第三方库通信,使用不能控制的组件会引 入非预期结果的风险。IBM 的 IT 专家 Filippo Diotalevi 展示了,面向方面 的 编程 (AOP) 如何通过帮助您在保持代码的干净和灵活性的同时,设计和定义 组 件之间的明确契约,从而降低这种风险。 契约式设计(Design by Contract)(DBC) 是面向对象的软件设计中的一 种 技术,它的目的是保证软件质量、可靠性和可重用性。DBC 中的关键考虑是可以 通过以下做法实现这个目标: 尽可能准确地规定组件之间的通信。 定义通信过程中的相互责任和预期的结果。 这些相互责任称为 契约,用 断言检查应用程序是否满足契约。简单地说, 断 言是插入到程序执行中的特定点的布尔表达式,它必须为真。失败的断言通常是 软件 bug 的症兆,所以必须将它报告给使用者。 在处理外部组件或者库,并需要保证应用程序传递给它们的数据和从它们那 里 接收的数据是正确的时候,DBC 特别有用。本文将展示一个抽象的基础设施和一 个示例应用程序,前者使用面向方面的编程(AOP)实现 DBC,后者与外部组件 建 立契约。 断言和 Java 语言 DBC 识别三种基本的断言类型: 前置条件: 客户为了正确调用外部组件而必须满足的责任。 后置条件: 执行外部组件后的预期结果。 不变量: 在执行了外部组件后维持不变的条件。 Java 语言原来没有提供对断言的天然支持。 assert 语句是在版本 1.4 中 加 入的。不过,在日常编码中使用 DBC 会是一种挑战。事实上,大多数常用的方 法 ── 在应用程序代码中直接加入前置和后置断言 ── 在代码模块化和可重用 性 方面有严重的缺点。这种方法是 纠缠的代码 的一个活生生的例子:它混合了业 务逻辑代码与断言所需的非功能代码。这种代码是不灵活的,因为不能在不改变 应用程序代码的情况下改变或者删除断言。 对这个问题的理想解决方案要满足四个要求: 透明性: 前置和后置条件代码不与业务逻辑混合。 可重用性: 解决方案的大多数部件是可重用的。 灵活性: 可以用简单的方式增加、删除和修改断言模块。 简单性: 可以用简单的语法指定断言。 用AOP增强契约:用AspectJ为Java软件开发加入契约式设计(2)时间:2011-09-07 ibm Filippo Diotalevi用 AOP 进行透明的契约式设计 如果目的是分离关注点、透明性和灵活性,那么面向方面的编程 (AOP) 通常 就是正确的答案。前置条件、后置条件和不变量是 横切关注点 (crosscutting concern)── 常用于应用程序的各种模块中常常包含的功能中,在某种程度上 与应用程序代码相混合。AOP 的目标是让开发人员可以在单独的模块中编写这些 功能并以灵活和声明式的方式应用它们。 本文假定您对 AspectJ 中的 AOP 有一般性的了解,并且不准备介绍 AOP。 有 关这个主题的介绍文章清单请参阅 参考资料。 实现基础设施 满足我在前面列出的四项条件的解决方案包含三部分,如图 1 所示: 应用程序代码(不包含与 DBC 有关的元素)。 契约实现(有前置条件、后置条件和不变量检查)。 一个作为代码与契约之间 桥梁的对象,可以将契约应用到代码中正确的部分 中并有正确的逻辑。 图 1. 契约式设计的一个模块化得很好的解决方案 图 1 所展示的设计保证了高度灵活的解决方案,它使您可以不用改变契约实 现或者应用程序代码就可以应用或者删除契约。并且它对于应用程序是完全透明 的。 用AOP增强契约:用AspectJ为Java软件开发加入契约式设计(3)时间:2011-09-07 ibm Filippo Diotalevi实现细节 契约 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |