面向切面的程序设计
外观
面向侧面的程序设计(aspect-oriented programming,AOP,又译作面向方面的程序设计、觀點導向編程)是计算机科学中的一个术语,指一种程序设计范型。该范型以一种称为侧面(aspect,又译作方面)的语言构造为基础,侧面是一种新的模块化机制,用来描述分散在对象、类或函数中的横切关注点(crosscutting concern)。
侧面的概念源于对面向对象的程序设计的改进,但并不只限于此,它还可以用来改进传统的函数。与侧面相关的编程概念还包括元对象协议、主题(subject)、mixin和委托。
基本概念
- 关注点(concern):对软件工程有意义的小的、可管理的、可描述的软件组成部分,一个关注点通常只同一个特定概念或目标相关联。
- 主关注点(core concern):一个软件最主要的关注点。
- 关注点分离(separation of concerns,SOC):标识、封装和操纵只与特定概念、目标相关联的软件组成部分的能力,即标识、封装和操纵关注点的能力。
- 方法(method):用来描述、设计、实现一个给定关注点的软件构造单位。
- 横切(crosscut):两个关注点相互横切,如果实现它们的方法存在交集。
- 支配性分解(dominant decomposition):将软件分解成模块的主要方式。传统的程序设计语言是以一种线性的文本来描述软件的,只采用一种方式(比如:类)将软件分解成模块;这导致某些关注点比较好的被捕捉,容易进一步组合、扩展;但还有一些关注点没有被捕捉,弥散在整个软件内部。支配性分解一般是按主关注点进行模块分解的。
- 横切关注点(crosscutting concerns):在传统的程序设计语言中,除了主关注点可以被支配性分解方式捕捉以外,还有许多没有被支配性分解方式捕捉到的关注点,这些关注点的实现会弥散在整个软件内部,这时这些关注点同主关注点是横切的。
- 侧面(aspect):在支配性分解的基础上,提供的一种辅助的模块化机制,这种新的模块化机制可以捕捉横切关注点。
从主关注点中分离出横切关注点是面向侧面的程序设计的核心概念。分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中不再含有针对特定领域问题代码的调用,业务逻辑同特定领域问题的关系通过侧面来封装、维护,这样原本分散在在整个应用程序中的变动就可以很好的管理起来。
“面向侧面的程序设计”(aspect-oriented programming)这一术语出现的具体时间已经不可考证了,但该词是由施乐帕洛阿尔托研究中心的Chris Maeda首先提出的。术语“横切”(crosscutting)是由Gregor Kiczales提出的。
例子
对于一个信用卡应用程序来说,存款、取款、帐单管理是它的主关注点,日志和持久化将成为横切整个对象结构的横切关注点。
早期工作
同许多重大的技术创新一样,面向侧面的程序设计也是在不同的地方被独立发展出来。面向侧面的程序设计的早期工作主要是由下面几个机构和人员作出的。
- 参与人员:Gregor Kiczales, John Lamping, Cristina Videira Lopes
- 研究经历:早期的工作是关于反省机制和元对象协议的;1997年Gregor Kiczales发表了论文《面向侧面的程序设计》(Aspect Oriented Programming)。
- 代表系统:基于元对象协议的面向侧面程序设计系统 、AspectJ
- 参与人员:William Harrison, Harold Ossher, Peri Tarr
- 研究经历:1980年代末的早期工作是关于软件开发环境与工具集成的;后来提出多维分离关注点(MDSOC, Multidimensional Separation of Concerns)
- 代表系统:Hyper/J
- 参与人员:Karl Lieberherr
- 研究经历:早期工作研究软件演化,提出了得墨忒耳定律(the law of Demeter)、传播模式(propagation pattern)、适应性程序设计(adaptive programming)
- 代表系统:Demeter/C++, Demeter/Java
荷兰Twente大学
- 参与人员:Mehmet Aksit
- 代表系统:Composition filters
语言实现
最广为人知的面向侧面的程序设计语言是由施乐帕洛阿尔托研究中心开发的AspectJ,该语言可以和Java编程语言结合在一起使用。