面向 AspectJ 的重构与代码异味目录探索
1. 相关工作概述
在面向方面编程(AOP)领域,众多研究者对重构和代码异味进行了深入探索。不同的研究从不同角度出发,为 AOP 的发展提供了丰富的理论和实践基础。
Deursen 等人对方面挖掘和重构的现状进行了简要概述,他们主要关注自动检测方面的工具,但也提出了关于向方面重构的开放性问题,如如何利用现有代码异味识别候选方面,以及如何用新的重构目录描述方面的引入。
Iwamoto 和 Zhao 宣布要构建 AOP 重构目录,他们给出了 24 种重构的名称,但缺乏详细信息。相比之下,我们的重构不仅包含适用情况的描述,还提及了前置条件、详细机制和代码示例。
2. 脆弱切入点问题及应对策略
许多作者关注到了脆弱切入点问题,即现有面向对象(OO)重构不能直接应用于包含方面的代码库。Laddad 提出了一些改善该问题的指导原则:
1.
切入点设计
:先基于逐个枚举感兴趣的连接点创建切入点的初始版本,再用基于通配符的更具语义意义的切入点替换。
2.
验证机制
:利用 AspectJ 的声明错误机制验证两个不同的切入点表达式是否捕获相同的连接点集。
3.
方面开发范围
:方面开发应从受限范围开始,通常只影响单个类的方法,待功能测试通过后再扩大范围。
3. 不同的重构方法
- Hanenberg 等人的方面感知重构 :提出方面感知重构,即考虑方面存在并通过更新可能受转换影响的切入点来保留行为的重构方法。他们还提出了一组保留可观察行为的启用条件,但这些条件需由方面感知工具自动验证。
- Griswold 等人的信息隐藏接口方法 :提出基于信息隐藏接口的新方法,通过跨切面编程接口(XPIs)隐藏代码库的实现细节,防止方面与代码库的直接依赖,有望更对称地解耦基础代码和方面代码,解决脆弱切入点问题。
- Laddad 的重构集合 :为工业从业者,特别是 J2EE 应用开发者提供了一系列重构方法,包括通用重构和特定关注点重构,部分重构基于设计模式。但部分重构仅提及名称和简要动机,缺乏详细的机制说明。
- Tonella 和 Ceccato 的接口实现挖掘 :基于接口实现常与系统主要分解无关的假设,提供了识别潜在方面的指导原则和挖掘、提取方面的工具。
4. 重构对比
| 研究者 | 重构方法 | 特点 |
|---|---|---|
| Hanenberg 等人 | 提取建议、提取引入、分离切入点 | 考虑方面存在,部分与我们的重构有对应关系,但我们的重构更详细 |
| Griswold 等人 | 基于信息隐藏接口 | 解耦基础代码和方面代码,解决脆弱切入点问题 |
| Laddad | 通用和特定关注点重构 | 适用于工业实践,但部分重构缺乏详细机制 |
| Tonella 和 Ceccato | 接口实现挖掘 | 提供识别潜在方面的准则和工具 |
5. 与其他重构的相似性
Hannemann 等人的部分重构与我们的重构存在相似之处:
- 他们的添加内部接口被我们的使用标记接口泛化目标类型所包含。
- 替换对象方法为方面方法与我们的替换内部类型方法为方面方法相似。
- 替换方法调用为切入点和建议对应我们的提取片段为建议。
- 替换方法为内部类型方法声明和替换字段为内部类型字段声明分别对应我们的将字段从类移动到内部类型和将方法从类移动到内部类型。
6. 编程定律推导重构
Cole 和 Borba 提出编程定律来推导 AspectJ 的重构,他们的定律主要用于推导现有重构,并通过两个案例研究进行测试。虽然部分定律与我们的提取重构有重叠,但他们更注重证明转换的行为保留性,而我们更关注拓展重构空间。
mermaid 流程图如下:
graph LR
A[相关工作] --> B[脆弱切入点问题]
B --> C[Laddad 应对策略]
A --> D[不同重构方法]
D --> E[Hanenberg 方面感知重构]
D --> F[Griswold 信息隐藏接口方法]
D --> G[Laddad 重构集合]
D --> H[Tonella 和 Ceccato 接口实现挖掘]
E --> I[与我们重构对比]
F --> I
G --> I
H --> I
A --> J[编程定律推导重构]
面向 AspectJ 的重构与代码异味目录探索
7. 未来工作展望
未来在 AOP 重构和代码异味领域还有许多值得探索的方向。
-
重构的成熟化
:需要更多案例研究来测试现有的重构方法,尤其是更大、更复杂的案例。同时,在其他语言上进行重构实验,以评估这些重构方法在 Java/AspectJ 之外的有效性。
-
重构空间的扩展
-
覆盖其他语言特性
:目前的重构方法基于特定案例研究,未涵盖所有方面构造及其组合。未来研究应探索剩余的方面构造,以及它们与现有 Java 构造的交互。例如,研究非单例方面关联,以明确其优缺点和适用的重构方法;深入研究切入点,探索切入点设计器的合理使用和切入点表达式的演变。
-
相反重构
:目前未提供现有重构的相反操作,但相反重构对于开发者回溯错误操作很重要,同时自身也有实用价值。
-
处理发布接口和剩余代码库
:研究提取横切关注点对剩余代码库的影响,以及后续的重构操作。Griswold 等人提出的 XPI 概念和相关设计规则为扩展和发展 AOP 重构空间提供了新机会。
-
其他代码异味
:许多 AOP 代码异味有待发现。例如,特权方面的使用是一个潜在的代码异味,需要研究其用例,寻找常见模式并确定相应的重构方法。
8. 总结
AOP 重构和代码异味目录是表达 AOP 源代码风格的有效方式。提出了特定于 AOP 的代码异味,包括检测现有 OO 代码中横切关注点的异味和改善提取方面结构的异味,并结合 AOP 重新审视了现有的 OO 代码异味。
简单移动与横切关注点相关的成员不能得到结构良好的方面,提取的方面会暴露横切问题,如代码重复。可以利用新的模块化特性,通过进一步重构来整理方面的内部结构。
提供了一系列 AOP 重构方法,可分为以下几类:
| 重构类别 | 数量 | 作用 |
| ---- | ---- | ---- |
| 从现有 OO 代码中移除与横切关注点相关异味的重构 | 10 个 | 处理常见成员,如字段、方法、内部类和接口 |
| 移除提取方面中问题的重构 | 6 个 | 处理重复代码和方面惰性等问题 |
| 处理方面泛化的重构 | 11 个 | 将公共代码提取到超方面 |
这些重构方法可以从源代码中移除代码异味,提高代码的质量和可维护性。
mermaid 流程图如下:
graph LR
A[未来工作] --> B[重构成熟化]
A --> C[重构空间扩展]
C --> D[覆盖其他语言特性]
D --> D1[非单例方面关联]
D --> D2[切入点研究]
C --> E[相反重构]
C --> F[处理发布接口和剩余代码库]
A --> G[其他代码异味]
H[总结] --> I[AOP 代码异味]
H --> J[重构方法分类]
J --> J1[移除 OO 代码异味重构]
J --> J2[移除提取方面问题重构]
J --> J3[方面泛化重构]
超级会员免费看
74

被折叠的 条评论
为什么被折叠?



