AOP的名称含义

面向方面编程(AOP)是一个热门话题。AOP在国内大致翻译为“面向方面编程”。

“面向方面编程”这个名字不太好理解,很容易被误导。笔者不止一次听到类似“OOP/OOD11即将落伍,AOP是新一代软件开发方法”的演讲。显然,演讲者没有理解AOP的含义。方面,是的,确实是“方面”的意思。而在中国传统语义学中,“体”多指一个事物在不同维度或不同角度上的特征。比如我们常说:“这个事情要从几个方面来看”,往往是指同一件事情需要从不同的角度来看。这里的“态”是指事物的外在特征在不同观察角度的体现。在AOP中,Aspect的含义可能更恰当地理解为“切面”。所以笔者更倾向于“面向节编程”的翻译。

一种可以通过预编译和运行时动态代理,在不修改源代码的情况下,动态统一地向程序添加功能的技术。AOP实际上是GoF设计模式的延续。设计模式孜孜不倦地追求调用者和被调用者之间的解耦,以提高代码的灵活性和可伸缩性。AOP可以说是这个目标的一个实现。

Spring为面向方面的编程提供了丰富的支持,通过将应用程序的业务逻辑与系统级服务(如审计和事务管理)分离,允许内聚开发。应用程序对象只做它们应该做的事情——完成业务逻辑——仅此而已。他们不负责(甚至不知道)其他系统级的问题,比如日志或事务支持。虽然AOP和OOP从字面上看非常相似,但它们是面向不同领域的两种设计思想。OOP (Object-Oriented Programming)对业务流程的实体及其属性和行为进行抽象和封装,从而获得更清晰、更高效的逻辑单元划分。

而AOP则是在业务流程中抽取切面,它面向流程中的某个步骤或阶段,以获得逻辑流程中各部分之间低耦合的隔离效果。这两种设计思路在目标上有本质区别。

以上说法可能过于理论化。举个简单的例子,封装一个业务实体,比如“雇员”,自然是OOP/OOD的任务。我们可以为它建立一个“employee”类,封装与“employee”相关的属性和行为。用AOP设计思想来封装“员工”是不可能的。

同样,“权限检查”动作片段的划分也是AOP的目标字段。但是,通过OOD/OOP封装一个动作有点不伦不类。

换句话说,OOD/OOP面向名词域,AOP面向动词域。很多人刚接触AOP的时候可能会说,AOP能做的事情,一个定义良好的OOP接口就能完成。我觉得这个观点值得商榷。AOP和定义良好的OOP之间的接口可以说是解决和实现需求中横切问题的两种方法。但是对于OOP中的接口,它还是需要我们调用相应模块中的相关方法,这在OOP中是不可避免的,一旦接口不得不修改,一切都会变得一团糟;AOP不是这样的,你只需要修改相应的方面,重新编织就可以了。当然,AOP永远不会取代OOP。核心需求仍将由OOP来实现,AOP将与OOP集成,互为补充。