快速业务通道

用AOP增强契约:用AspectJ为Java软件开发加入契约式设计 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
是实现了特定接口的 Java 类,“桥梁” 是 AspectJ 方面。这个方面 指 定了应用契约的特定点和应用契约所需要的逻辑,如图 2 所示。

图 2. 以操作图表示的契约式设计逻辑

用AOP增强契约:用AspectJ为Java软件开发加入契约式设计 - 编程入门网

图 2 中的逻辑图对于所有契约都是相同的,所以可以开发一个指定它的公共 抽象方面。图 3 显示了这个解决方案的类和方面图:

图 3. 契约检查器系统的基本组件

用AOP增强契约:用AspectJ为Java软件开发加入契约式设计 - 编程入门网

AbstractContract 方面指定在 图 2 中的操作图中声明的控制逻辑。它在程 序的执行中留下了未表示的(即抽象的)点,(由 ContractManager 接口的实 现 定义的)契约将应用到这里。 ConcreteContract 方面(扩展 AbstractContract 方面) 负责:

通过 targetPointcut pointcut 指定进行契约检查的准确位置。

通过 getContractManager() 方法指定负责检查契约的类。

用AOP增强契约:用AspectJ为Java软件开发加入契约式设计(4)

时间:2011-09-07 ibm Filippo Diotalevi

包含检查应用程序与外部模块之间契约的代码的类是 ContractManager 接口 的一个实现。清单 1 所示的 ContractManager 是一个定义契约检查类的基本行 为的简单 Java 接口:

清单 1. ContractManager 接口

public interface ContractManager {   /**   * Check the preconditions   */   public void checkPreConditions(Object thisObject, Object[] args)    throws ContractBrokeException;   /**   * Check the postconditions   */       public void checkPostConditions(Object thisObject, Object returnValue, Object [] args)    throws ContractBrokeException;   /**   * Check the invariants   */   public void checkInvariants(Object thisObject) throws ContractBrokeException; }

ContractManager 接口为要检查的每一种断言定义了不同的方法。每一个方 法 可以通过 thisObject 参数访问 Java 对象,该对象调用要保证其契约的函数。 前置条件和后置条件方法可以看到作为函数参数 ( args ) 传递的值。只有后 置条件方法可以通过 returnValue 参数接收最终的返回值。通过结合使用这三 种 方法,可以检查几乎所有常见的条件。

AbstractContract 方面执行进行契约检查所需要的控制逻辑。这个逻辑是在 around():targetPointcut() advice 中表述的。清单 2 显示了 AbstractContract 方面:

清单 2. AbstractContract 方面

public abstract aspect AbstractContract {   /**   * Define the pointcut to apply the contract checking   * MUST CONTAIN A METHOD CALL   */       public abstract pointcut targetPointcut();   /**   * Define the ContractManager interface implementor to be used   */       public abstract ContractManager getContractManager();   /**   * Perform the logic necessary to perform contract checking   */       Object around(): targetPointcut()   {     ContractManager cManager = getContractManager();     System.out.println("Checking contract using:" + cManager.getClass ().getName());    if (cManager!=null)    {      System.out.println("Performing initial invariants check");      cManager.checkInvariants(thisJoinPoint.getTarget());    }      if (cManager!=null)    {      System.out.println ("Performing pre-conditions check");      cManager.checkPreConditions(thisJoinPoint.getTarget(), thisJoinPoint.getArgs());    }    Object obj = proceed ();    if (cManager!=null

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号