快速业务通道

AOP@Work: 设计切入点来避免模式密集 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
向下强制转换成实际的类型,从而获得了类型安全的一般性。(下面 我将介绍一种不损失一般性而获得类型安全的方法。)

通知提供了和 Template Method 相同的保证但没有 Java 实现的约束。在 JUnit 中,TestCase 必须控制命令方法来实现模板方法,然后为实现真正的测试 还要委派给另一个方法,为 command 代码创建 TestCase 专用的协议。因此,虽 然 Command 使得测试很容易操纵,command 契约对开发人员而言实际上从 Test 到 TestCase 是不同的,因而使得 API 的职责更难以理解。

使用 Collecting Parameter 还是使用 ThreadLocal?

Cook''s Tour 继续它的漫步:“如果 TestCase 在森林中运行,那么谁还关心 它的结果呢?”当然,Gamma 和 Beck 的回答是:需要记录失败和总结经验。为 此,他们使用了 Collecting Parameter 模式:

如果需要收集多个方法的结果,应该在方法中添加一个参数传递收集结果的对 象。

JUnit 将结果处理封装在一个 TestResult 中。从这里,订阅者可以找到所有 测试的结果,测试装置可以在这里管理需要的结果集合。为了完成采集工作, Template Method TestResult.runProtected(..) 将测试执行放在 start 和 end 辅助调用(housekeeping call)之间,把抛出的异常解释为负的测试结果。

结合性

现在有了 N>1 个模式,模式实现之间的交互如何呢?如果对象可以很好地 协作,则称为可结合的。类似地,模式实现可能直接冲突(比如两者需要不同的 超类)、并存但不交互,或者并存且以或多或少富有成效的方式进行交互。

在 JUnit 中,装置关注点和结果收集关注点的相互作用形成了 TestCase 和 TestResult 共享的调用顺序协议,如下所示:

Test.runTest(TestResult) calls...  TestResult.run(TestCase) calls...   TestResult.runProtected(Test, Protectable) calls...    Protectable.protect() calls...     TestCase.runBare() calls...      Test.runTest() ...       (TestCase.runTest() invokes test method...)

这表明模式密集使得代码很难修改。如果要修改装置模板方法或者收集参数, 就必须在 TestResult 或 TestCase (或者子类)中同时修改二者。另外,因为 测试装置的 setUp() 和 cleanUp() 方法在结果处理(result handling)的受保 护上下文中运行,该调用序列包含了设计决策:装置代码中抛出的任何异常都视 作测试错误。如果希望单独报告装置错误,那么不但要同时修改两个组件,还必 须修改它们相互调用的方式。AspectJ 能否做得更好一点呢?

在 AspectJ 中,可以使用通知提供同样的保证但避免了锁定调用的顺序:

/** Record test start and end, failure or error */ void around (): testCase() {  startTest(thisJoinPoint);  try {    proceed();   endTest(thisJoinPoint);  } catch (Error e) {   error(thisJoinPoint, e);  } catch (Exception e) {    failure(thisJoinPoint, e);  } }

与上述的装置处理通知一样,这可以用于任何类型的测试或者结果收集,但实 现该方法需要向下类型转换。这一点将在后面进行修正。那么该通知如何与装置 通知交互呢?这依赖于首先运行的是什么。

AOP@Work: 设计切入点来避免模式密集(6)

时间:2011-09-04 IBM Wes Isberg

谁先开始?

在 JUnit 中,结果收集和装置管理的模板方法必须(永远?)按照固定的调 用顺序。在 AspectJ 中,大量通知可以在一个连接点上运行,而无需知道该连接 点上的其他通知。如果不需要交互,那么可以(应该)忽略它们运行的顺序。但 是,如果知道其中一个可能影响另一个,则可使用优先级控制运行的顺序。本例 中,如果赋予结果处理通知更高的优先级,那么连接点

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