面向切面的程序设计
面向切面的程序设计(Aspect-oriented programming,AOP,又译作面向方面的程序设计、剖面導向程式設計)是计算机科学中的一种程序设计范型,旨在将横切关注点与业务主体进行进一步分离,以提高程序代码的模块化程度。通过在现有代码基础上增加额外的通知(Advice)机制,能够对被声明为“切点(Pointcut)”的代码块进行统一管理与装饰,如“对所有方法名以‘set*’开头的方法添加后台日志”。该思想使得开发人员能够将与代码核心业务逻辑关系不那么密切的功能(如日志功能)添加至程序中,同时又不降低业务代码的可读性。面向切面的程序设计思想也是面向切面软件开发的基础。
编程范型 |
---|
面向切面的程序设计将代码逻辑切分为不同的模块(即关注点(Concern),一段特定的逻辑功能)。几乎所有的编程思想都涉及代码功能的分类,将各个关注点封装成独立的抽象模块(如函数、过程、模块、类以及方法等),后者又可供进一步实现、封装和重写。部分关注点“横切”程序代码中的数个模块,即在多个模块中都有出现,它们即被称作横切关注点(Cross-cutting concerns, Horizontal concerns)。
日志功能即是横切关注点的一个典型案例,因为日志功能往往横跨系统中的每个业务模块,即“横切”所有有日志需求的类及方法体。而对于一个信用卡应用程序来说,存款、取款、帐单管理是它的核心关注点,日志和持久化将成为横切整个对象结构的横切关注点。
切面的概念源于对面向对象的程序设计和計算反射的融合,但并不只限于此,它还可以用来改进传统的函数。与切面相关的编程概念还包括元对象协议、主题(Subject)、混入(Mixin)和委托(Delegate)。
基本概念与指导思想
从核心关注点中分离出横切关注点是面向切面的程序设计的核心概念。分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中不再含有针对特定领域问题代码的调用,业务逻辑同特定领域问题的关系通过切面来封装、维护,这样原本分散在在整个应用程序中的变动就可以很好的管理起来。
- 关注点(Concern):对软件工程有意义的小的、可管理的、可描述的软件组成部分,一个关注点通常只同一个特定概念或目标相关联。
- 主关注点(Core concern):一个软件最主要的关注点。
- 关注点分离(Separation of concerns,SOC):标识、封装和操纵只与特定概念、目标相关联的软件组成部分的能力,即标识、封装和操纵关注点的能力。
- 方法(Method):用来描述、设计、实现一个给定关注点的软件构造单位。
- 横切(Crosscut):两个关注点相互横切,如果实现它们的方法存在交集。
- 支配性分解(Dominant decomposition):将软件分解成模块的主要方式。传统的程序设计语言是以一种线性的文本来描述软件的,只采用一种方式(比如:类)将软件分解成模块;这导致某些关注点比较好的被捕捉,容易进一步组合、扩展;但还有一些关注点没有被捕捉,弥散在整个软件内部。支配性分解一般是按主关注点进行模块分解的。
- 横切关注点(Crosscutting concerns):在传统的程序设计语言中,除了主关注点可以被支配性分解方式捕捉以外,还有许多没有被支配性分解方式捕捉到的关注点,这些关注点的实现会弥散在整个软件内部,这时这些关注点同主关注点是横切的。
- 切面(Aspect):在支配性分解的基础上,提供的一种辅助的模块化机制,这种新的模块化机制可以捕捉横切关注点。
连接点模型
AspectJ的连接点模型
面向切面程序设计的各种实现
最广为人知的面向切面的编程库是由施乐帕洛阿尔托研究中心开发的AspectJ,该语言可以和Java编程语言结合在一起使用。
在.NET Framework的環境,則有透過MSIL動態注入來實現AOP的PostSharp函式庫,但是到3.0版為為止,官方文件中只註明適用於C#與VB.NET[1],不適用於C++/CLI。
历史
“面向切面的程序设计”这一术语出现的具体时间已经不可考证了,但该词是由施乐帕洛阿尔托研究中心的Chris Maeda首先提出的。术语“横切”是由Gregor Kiczales提出的。
同许多重大的技术创新一样,面向切面的程序设计也是在不同的地方被独立发展出来。面向切面编程的早期工作主要是由下面几个机构和人员作出的。
施乐帕洛阿尔托研究中心
- 参与人员:Gregor Kiczales, John Lamping, Cristina Videira Lopes
- 研究经历:早期的工作是关于反省机制和元对象协议的;1997年Gregor Kiczales发表了论文《面向侧面的程序设计》(Aspect Oriented Programming)。
- 代表系统:基于元对象协议的面向侧面程序设计系统 、AspectJ
国际商用机器公司托马斯·J·沃森研究中心
- 参与人员: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
荷兰特温特大学
- 参与人员:Mehmet Aksit
- 代表系统:Composition filters
站外链接
- Aspect-Oriented Software Development
- Aspect-Oriented Software Development(AOP年會)
- AOSD Wiki 页面存档备份,存于(英文維基給AOP的專欄)
- AspectJ Archived 2011-08-25 at WebCite(Java的實現)
- 关于面向侧面的程序设计和AspectJ的系列文章
- The AspectBench Compiler for AspectJ(另一個Java實現)
- 一篇深度討論AOP與AspectJ的系列文章
- 利用RemObject Taco實現AOP的文章
- Constraint-Specification Aspect Weaver 页面存档备份,存于
- 面向側面對物件導向:該用哪個?何時使用?
- 給Python用的AOP輕量實現
- LOOM.NET 页面存档备份,存于
- 剖面導向程式設計(AOP/AOSD)簡介