面向方面(aspect)的程序设计方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面向方面(aspect)的程序设计方法
程虎
摘要 面向方面的程序设计(Aspect—Oriented Programming, AOP)是一种很有前途的新型程序设计方法,它是面向过程、面向对象方法的进一步发展。
通过引入方面概念,改进关注点的分离(separation of concerns),减少代码缠结(code tangling)解决横切关注点(cross cutting concerns)的问题,提高软件质量和效率。
自1997年AOP以来的7年间,全球已开展大量有关研究与开发工作,并自2002年起每年召开专门的国际学术会议(International conf .on Aspect-Oriented Software Development,AOSD)探讨问题,交流取得的成果。
关键词 方面,面向方面的程序设计(AOP),关注点,横切关注点,面向方面的软件开发(AOSD)。
1引言
计算机软件包括程序及其文档。
程序设计包括设计、编制和调试程序的方法与过程。
程序设计方法涉及用于指导程序设计工作的原理和原则,以及基于这些原理和原则的设计方法和技术。
数十年来,经历公式翻译、过程式程序设计、结构化程序设计、逻辑式程序设计、函数式程序设计以及面向对象程序设计等。
程序设计方法学可以对程序设计人员选用具体的程序设计方法起指导作用,而具体的程序设计方法对象程序设计工作的质量以及所设计出来的程序(即软件)的质量影响巨大。
世间事物总是在不断发展变化,螺旋式上升。
程序设计方法也如此,近年来流行面向对象程序设计方法。
面向对象的方法起源于面向对象的编程语言,可以追溯到20世纪60年代后期的Simula67语言。
到20世纪末,面向对象方法已逐步发展成为一类完整的方法学和系统化的技术体系。
它不仅指导编程设计,还指导开发操作系统、数据库、网络和编译系统等。
使用面向对象语言来实现面向对象设计相对而言比较容易,用非面向对象语言也可实现面向对象设计。
也有这种情况,即使用了面向对象语言,但由于未掌握面向对象的思维方法,开发出来的软件也未必是面向对象的。
所以说,掌握面向对象的编程思想方法,如同获得练气功的真谛,它的重要性往往胜过了对编程语言的选择。
面向对象方法有诸多优点,如使软件体系结构良好,便于软件构件化、软件复用和软件维护等。
但经过这么多年实践摸索,人们也发现面向对象方法有其不足,如许多软件系统不完全都能按系统的功能来划分构件,要完成的业务功能只是核心级关注点(concerns),此外,还有不少系统级关注点,它们是完成核心级关注点所必须的配套设施,如日志记录、跟踪、出错处理和安全检测等。
这些系统级关注点与核心功能级关注点有交叉(cut-cross)。
当系统级关注点能相对分割地在基本功能中考虑和分析时,使用当前的面向对象语言导致在许多构件中要重复包含(扩散)这些代码,源程序就要变成一些为不同目的而编制的指令的缠结(tangling)混乱物。
缠结现象是现有软件系统中许多不必要的复杂性的核心。
它增加了功能构件之间的依赖性,分散了构件原来假定要做的事情,提供了许多程序设计出错的机会,使得一些功能构件难以复用,源代码难以开发、理解和发展。
按软件生命周期的阶段来说,在设计阶段,以类(class)为单位组织建模不全面;在编码阶段,把数据和方法都封装成类,不灵活、不便复用;在维护阶段,由于缠结原因造成难理解、难维护。
因此,人们就想到面向方面(aspects)的方法。
这一概念最早是由施乐(Xerox)公司在美国加州硅谷PaloAlto研究中心(PARC)的首席科学家、加拿大大不列颠哥伦比亚大学教授Gregor Kicgales等人首次在1997年的欧洲面向对象编程大会(ECOOP 97)上提出。
2基本概念
2.1 方面(aspect)
从抽象意义上讲,是对软件系统构件的性能和语法产生一定影响的一些属性;从设计上讲是横切系统的一些软件系统级关注点;从实现上讲,是一种程序设计单元,它支持将横切系统的关注点封装在单独的模块单位中,是AOP将横切关注点局部化和模块化的实现机制。
通过将横切关注点集中到aspect中,AOP就取得一种单一的结构化行为,该行为在传统程序中分布于整个代码里。
在AOP中,aspect是一阶实体,aspect 之于AOP,正如class 之于 oop。
2.2 面向方面的程序设计(AOP)
AOP是一种关注点分离技术,通过运用aspect这种程序设计单元,允许开发者使用结构化的设计和代码,反映其对系统的认识方式。
要使设计和代码更加模块化、更具结构化,使关注点局部化而不是分散于整个系统中。
同时,需使关注点和系统其他部分保持良好定义的接口,从而真正达到“分离关注点,分而治之”的目的。
类似于传统语言的语言编译器,aspect语言有相应的编织器(weaver),它能像编织地毯、壁毯那样,把各式彩线经纬纵横地编织出美丽的图案。
2.3 关注点(concern)
关注点就是一个特定的目标、概念或者兴趣域。
从过程的角度,典型的开发关注点包括:需求分析、设计、编码、测试和维护。
从技术的角度,一个典型的软件系统分别包含若干个核心级和系统级的关注点。
核心级关注点是系统要完成的业务功能;系统级关注点是完成核心级关注点所必须的配套设施,这些配套设施通常就认为是整个系统的系统特性,或者是业务功能的功能约束。
2.4 横切关注点(crosscutting concern)
理解横切关注点的好途径是用例子来说明。
考虑把统一建模语言(UML)用于简单的图编辑器(Figure Editor)。
如下图所示。
图1. 在图编辑器中方面模块、模块类模块示意图
其中有两个具体的图元素:点和线。
在面向对象方法中,用类表示点和线,这些显露好的模块性,每个类的源代码是紧密相关(内聚),并且类之间有清楚和良好定义的接口。
但是如果再考虑这样一个关注点:图元素移动时要通知屏幕管理器Display,这就要求移动图元素的每个方法(method)要做通知。
图中每个方法必须实现这个关注点,即点和线框中每个方法要实现那些关注点。
注意,显示修改的框既不适合在其它框内也不适合环绕其它框,我们称这为横切关注点。
如果只使用面向对象程序设计方法,实现横切关注点就趋向于分散在系统各处,如图中所示。
但是,如果使用AOP机制,我们就可以在一个单个方面中,模块化显示修改行为的实现。
我们可以用一个单个模块单位实现这个显示修改行为,它使得我们容易把它作为一个单个程序设计单元来思考。
有了面向方面的程序设计语言机制,我们可以在设计级用方面来思考构建软件系统。
3需求规约(specification)与设计
开发软件的重要原则之一是要分离各种关注点,这种关注点的分离,首先要体现在需求分析,对需求进行规约,然后针对需求规约进行设计。
前面已经提到,面向对象的分析与设计有局限性,引入aspect概念后,相应的规约和设计也要重新考虑。
Xerox 公司PARC 已设计开发Aspect J语言,它是基于Java语言的AOP扩展,既是一种规约语言,也是一种AOP的实现语言。
Aspect J使用Java语言实现单个关注点,并通过对Java进行扩展,提供了编织(weaving)规则。
4实现
以扩充Java的实现方式为例,编织方式有3种:
1.静态织入(编译时织入):借助预编译器对源代码进行增强,代表是Aspect J。
2.装载时织入:修改class loader,在加载class时对其进行二进制增强,代表是J Boss
AOP。
3.动态织入(运行时织入):利用Java动态代理(dynamic proxy)在运行时拦截方
法调用,织入方面逻辑。
大多数AOP框架均以这种方式实现,灵活性强,且对
被织入模块的侵入性较小。
代表有Nanning、Spring AOP等。
5展望
自1997年首次在欧洲面向对象会议上提出AOP以来的7年间,全球已开展大量有关研究与开发工作,并自2002年起,每年春天分别在欧洲和美国轮流召开专门的面向方面软件开发(AOSD)国际学术会议。
第1届是2002年4月在荷兰Enschede召开,第2届是2003年3月在美国波士顿召开,第3届是2004年3 月在英国Lancaster召开,第4届将于2005年3月在美国芝加哥召开。
前三届的与会者包括美国、加拿大、荷兰、英国、法国、德国、比利时、瑞士、西班牙、爱尔兰、丹麦和日本、以色列等。
除了Xerox公司,美国IBM公司的纽约Watson研究中心,德国西门子公司和日本东芝公司等都投入研发,欧美和日本的许多大学也在进行研究,我国北京大学和西安电子科技大学的软件研究所也对AOP给以关注并开展了一些研究开发工作。
从近年的发展来看,研究开发AOP的角度很多,有的研究语言,有的研究规约和设计,有的研究实现,应用还比较少,只是为研究而做些实例试验。
但从各种刊物和会议上的报告交流来看,提出了许多问题,并对不少问题进行了深入的分析研究,有的已提出解决方案,并取得了初步成果。
面向对象方法技术从语言角度提出后,已在软件技术方面取得突破,并独树一帜,影响操作系统、数据库、编译和网络软件的研发。
现在AOP也有类似情况,已有人在研究其对操作系统、中间件等的研发作用,并已有一些文章发表。
预计AOP也会对软件技术发展产生影响,希望我国软件工作者能适当投入力量,关注和进行AOP的研发工作。
[1]Kicgales G,et al Aspect-Oriented Programming, In:Proc.of the European Conf .on
Object-Oriented Programming (ECOOP),June 1997
[2]曹东刚,梅宏.面向Aspect的程序设计——一种新的编程范型,计算机科学,
2003 ,30(9),5—10
[3]高海洋,陈平. AOP综述,计算机科学,2002,29(10),133—135
[4]Elrad T等编,面向方面的程序设计专集,(共12篇文章),CACM,2001,44
(10),28—97
[5]1997年以来ECOOP会议录中有关AOP文章,参见LNCS,第1241,1445,1743,
1964,2072,2374,2743,3086等卷,Springer,1997—2004
[6]2002年以来AOSD会议录,可见ACM或AOSD网站:www. 或。
作者简介:
程 虎男,1938年生,中国科学院软件所研究员,博士生导师,现任软件所总体部顾问及《中国计算机学会通讯》编委。
主要方向为计算机语言和编译系统的研究与开发和人工智能与神经网络的研究,还关注软件工程与信息技。