优缺点
使用 AJDT 的 cross-references 视图检查横切规范有三个主要的好处。首 先 ,cross-references 视图可以在开发方面时马上给出反馈。其次,它使您可以 容 易地发现难于测试的结果。(要编写验证 getWebsite() 没有 突出显示的测试 , 需要猜出 getWebsite() 可能会出错,或者检查 SearchResult 中每一个 String getter。越不容易出的错误,越难很好地测试。)第三,自动生成的视图可以 验证正确情况,在代码中验证它们是很麻烦的。例如,如果搜索 highlighter 需 要影响 20 个联结点,那么检查 cross-references 视图比为每一个联结点编写 测试更容易。
使用视图验证的主要缺点是不能自动检查。它需要程序员的自律。匆忙的程 序 员可能看过图 2,却没有发现问题。(下一个模式展示了对这个问题的部分解决 方案。)另一个问题是横切视图只显示了基于静态联结点 shadow 的匹配。换句 话说,如果有依赖于运行时检查的切点,如 cflow() 或者 if(),那么 cross- references 视图不能肯定地说联结点会在运行时匹配,只能说看来如此。
模式 2. 检查随横切比较工具改变
针对 :横切规范
概述 :利用 AJDT 的横切比较功能在重构之前或者其他代码改变前保存项目 的横切图。在完成改变后保存另一个图。(还可以每晚保存一个图以便比较。) 在横切比较工具中比较这些图,以发现受方面影响的联结点所出现的不希望的改 变。注意在撰写本文时,只有 AJDT 提供横切比较工具。
例子:改写一个切点
假定要改正上一个例子中表现出的问题,决定修改切点以使用 Java 5 注释 , 如下所示:
public pointcut highlightedTextProperties() :
execution (@Highlighted public String Highlightable+.*())
然后在源代码中适当位置上添加注释,例如:
@Highlighted
public String getTitle() {
return title;
}
下一步是比较在改变前后所抓取的项目快照,并得到如图 3 所示的结果。如 您所见,重构消除了 getWebsite() 的建议匹配,但是也消除了 getSummary() 的匹配。(它看上去像没有添加上注释。)
图 3. 在横切比较工具中显示的改变结果
优缺点
这项技术实际上是对上一项技术的优化。通过只显示改变,横切比较工具可 以 帮助防止信息盲点。同时,cross-references 视图要求选择需要分析的建议或 者 类,而横切比较工具使您可以检查整个项目的改变。
缺点是横切比较工具在方面影响多个联结点时会不好用。考虑一个记录所有 公 共方法的日志。这样一个方面在哪怕的开发后也会增加十来个新改变,使得 查看其他更重要的改变变得困难了。在真实世界中,横切比较工具可以有很多配 置,对某些方面的改变发出警报,而忽略与其他方面有关的改变。
III. 使用委派
方面可以并且通常用普通对象实现横切行为。可以利用这种关注点的分离分 别 测试横切规范及它们的行为。下面两个模式展示如何使用委派和 mock 对象检查 方面的这两个部分。
模式 1. 测试委派的建议逻辑
针对 :横切功能
概述 :如果还没有做的话,可以将一些或者全部建议逻辑委派给其他可以直 接测试的类。(如果愿意的话,还可以将行为委派给方面的公共方法。)
例子:将突出显示逻辑转移到其他类
要更好地在隔离状态下测试突出显示逻辑,可以将它转移到一个专门的工具 类 中:
private HighlightUtil highlightUtil = new CssHighlightUtil ();
public void setHighlightUtil(HighlightUtil highlightUtil) {
this.highlightUtil = highlightUtil;
}
String around(Highlightable highlightable) :
highlightedTextProperties() && this(highlightable)
{
String result = proceed(highlightable);
return highlightUtil.highlight(result, highlightable.getHighlightedWords ());
}
通过抽取突出显示逻辑,可以编写调用 HighlightUtil 类的方法的单元测试 。
优缺点
这项技术使得在域逻辑中产生边缘用例更容易了。它还有助于隔离问题,如 果 helper 类的测试失败,会知道是它而不是方面有问题。后,委派逻辑通常 会 得到更干净的关注点分离。在这个例子中,通过将文字突出显示逻辑抽取到其它 类,它变成系统其他部分可以独立于这个方面使用的一项操作。从而使方面获得 了使用不同的突出显示策略的灵活性(HTML 的 CSS 突出显示、纯文本的全部大 写突出显示等等)。