摘 要:用传统的方法(如面向对象方法,面向过程方法等)设计和编写软件时,有些设计方案只能通过散乱地分布在各个相关模块中加以实现。从而导致软件的开发过程变得复杂,同时也使得代码变得难理解,难维护。面向方面编程技术是为较好地解决这一问题而提出的一种新技术。对面向方面编程技术的产生背景、发展过程、编程思想,编程语言,关键技术及其优点等方面作了综述的详细,最后分析了面向方面编程技术的研究应用热点及它的发展前景。
关键词:软件设计方法;AOP;设计方案
一、 引言
随着软件技术的不断发展,人们对软件体系架构有了许多新的要求,如适应性、可靠性、安全性、可用性和可维护性等。面向对象方法是软件体系架构上的一次重大变革,在传统的面向过程基础上,面向对象增强了软件抽象、模块封装和代码重用。面向对象程序设计能够有效地将功能实现分配到对象的基础单元“类”上,即能有效抽象到分离关注点的一个方向一类及其接口,但是在方法内部的执行序列上,面向对象与传统的过程式程序设计没有实质改变。如何在程序内部的执行序列实现分离,达到不同业务功能的代码松耦合的连接,成为软件体系结构及其应用的重要发展方向。代码缠结和代码分散就是执行序列分离需求的有效实例:代码纠缠指在实现某一功能的函数中加入很多其他的与核心功能无关的公共代码;代码分散是指在系统中处理权限验证和日志记录等公共行为的代码分散到了多个核心模块里。如果还使用面向对象或是结构化编程技术来解决这类问题,会造成业务代码和非功能需求代码强耦合,使得系统难以理解、实现和维护。
面向对象基础上发展起来的面向方面编程AOP(Aspect—Oriented Programming)能通过剖解开封装对象的内部,在各方法和模块的链接处设置关注点,并插入横切关注代码,将影响多个类的行为封装到一个可重用的模块。这样既有利于减少系统的代码重复,又降低模块间的耦合度,有利于未来的可扩展性和可维护性。
二、 AOP的关键技术
AOP 程序通常包括组件和方面两部分。组件通常可以用现有的任何程序模块来描述,因此AOP的关键技术之一就在于方面描述模块的定义及其实现。完美的方面描述模块的定义及其实现应具有以下特性:1.方面描述模块应具有通用性。描述方面的模块不能只适用于特殊的关注,或者特殊的领域;2.方面描述模块应与现行程序模块具有兼容性。描述方面的模块应实现与某种现行程序模块的无缝连接,即用这种程序模块描述的方面和现有的程序模块能进行完美的结合,而不会产生对原有模块的修改,从而提高模块的可复用性;3. 方面描述模块应具有可扩展性。方面描述模块应具有一定的语言要素,用户可以使用这些语言要素来定义方面模块,也可以按照一定的规则扩展语言要素。
关键技术之二在于方面描述模块的编译器或解释器的实现。方面模块经过编译器进行编译得到可执行形式,或由解释器进行解释执行。因此方面模块的编译器或解释器在AOP的实现中具有重要作用,正如用面向对象设计系统而没有面向对象编程语言的编译器或解释器无法实现系统一样,没有方面描述模块的编译器或解释器将无法实现AOP 设计。
关键技术之三在于组织器的设计与实现。方面模块和组件模块经编译或解释后最终要靠组织器把它组织起来变成最终的可执行形式。它相当于面向对象编程语言C++的连接器,但又不同于连接器,它连接的是两种不同的模块。因此它实现的是一种条件连接,各种条件检测更多,算法更复杂。
三、 AOP的技术优势
由上述分析可以看出,AOP 技术具有以下优点。
1. 不同的关注可以在不同的方面模块中实现,从形式上完全实现了执行级的关注划分,提高了程序的可读性和可维护性。以下是用OOP来实现从某服务器获取数据的功能模块的Java代码。
2. 通过引入方面(相当于面向对象中的类的概念),提供了一种通用的表达关注的方法,提高了软件的可复用性。上面的代码中,Sync 和Log 都是用Java语言(AspectJ)实现的方面模块。由上面的代码可以看出,AOP 的方面模块和OOP的类模块都是编程时对某种客体的封装体,只不过两种模块所封装的客体的性质不尽相同。方面模块封装的是横断关系,而OOP 的类则是对某种事物的特性抽象和操作那些特性的方法的封装。利用方面模块可以简化类的实现,提高了类代码的可读性,同时由于方面代码封装了横断关系,也使得原来分散在类代码中的方面代码以方面模块的形式提高了它们的可复用性;
3.提供了合成关注的机制,引入合流点等概念,实现了组件与方面的完美结合。面向方面的应用程序构成要素包含了一般应用程序的构成要素,实际上AOP 应用程序是一般应用程序的超集,若在面向方面的应用程序中不使用方面的内容,就变成一般的应用程序。正因为如此,AOP 方法对编程技术和平台有一定的要求。如上述代码中类Client和方面Sync 和Log要通过组织器才能组合成可执行形式;
四、 结束语
AOP以其能有效地处理关注间的横断现象的特有功能,较好地解决了用传统的方法设计和实现软件的过程中,对某些设计思想,只能通过散乱地分布在各个相关模块中实现使得软件的开发过程变得复杂,软件代码难理解,难维护的问题,从而使软件工程师能够容易地开发和维护系统。在应用方面,由于当今的软件正朝着以正面功能为核心向兼顾侧面约束的方向发展,AOP必将得到更广泛的应用。虽然目前AOP程序语言还不多,但正如用C 语言来实现面向对象的设计一样,应用现有的程序语言来实现AOP 技术的软件设计在实际中是完全可行的。
参考文献:
[1] 张海藩. 软件工程导论[M]. 北京:清华大学出版社,1992
[2] 张英捷,刘万军.SpringAOP技术在J2EE系统安全性验证中的应用研究[J].计算机工程与科学,2008(8):137一138.
[3] 李淼,白勇,张波.基于领域特征的AOP编织实现方法 [J].计算机科学,2009(2):299—302.
[4] 郑汉雄,郑汉英,周晓聪.在AOP中使用标注改进日志功能的实现[J].计算机工程,2009(17):71—73.