权威的面向方面软件开发参考书:针对软件复杂性挑战的实践性解决之道
当前,软件工程师们必须构建这样的系统,它们要处理在技术、商业和性能等领域范围中不断增长的关注点。如果使用常规的面向对象技术完成这项任务,软件工程师们常常发现他们自身会生成大量混杂、不正确和难以维护的代码。面向方面的软件开发(AOSD)通过允许他们分离地描述关注点,然后将模块化的表达形式组合到可靠的高效系统之中,从而解决了这个问题!
在本书中,AOSD开发领域的四位领袖人物为我们带来了当前最为重要的前沿进展。基于该领域多位领先研究者的贡献,他们在本书中描述了基本的AOSD概念,介绍了AOSD工程和编程的崭新技术,以及早期采用AOSD方法的详细应用经验。
面向方面开发已经产生了一段时间。如果您是一位富有经验的软件工程师或体系架构师,本书包含了您在真实世界系统开始应用它的全部所需!
无
软件开发是不断变化的。互联网的出现、商业计算、了解计算机的消费群体、计算和通信成本的指数级下降,以及长生命周期系统日益增多的动态环境,这些都迫使软件开发者必须使用更好的方法来建立和发展系统。一股热潮席卷了软件开发过程、系统结构、编程、质量保证以及维护等领域。
软件的目标是要对这个世界的部分元素或信息流建立计算模型。即使是最微不足道的软件系统,实现该系统的工程都需要(有可能是反复地)将系统分解成可以独立创建和管理的模块。20世纪90年代关于系统模块化特性的面向对象观点呈现上升趋势(并且可能成为主流)。面向对象方法的焦点在于选择对象作为模块的主要单元,并将这些对象与系统的所有行为联系起来。对象成为问题领域或者计算过程的主要元素。
面向对象方法正面临它的局限性。在创建软件系统时人们所关心的东西(称为关注点)并不能清晰地定位于某个特殊“东西”的行为上。建立不同的系统需要同时管理许多关注点。关注点的案例范围包括从非功能概念,如安全、可靠性、可控性等,扩展到精确的实现技术,如并发控制、缓存、错误恢复。由于传统的编程技术着眼于产生直接的指令序列,因此要求程序员全面掌握编程过程中的所有关注点。程序员必须清楚地将实现这些关注点的命令与实现主要应用功能的代码混合在一起。这会导致产生包含混乱代码、大量错误并难以维护的系统。
新技术的产生,允许包含更丰富的程序规范和关于这些规范的更好的模块化特性。除了这些新技术之外,还出现了使用这些新技术的崭新的软件工程方法论。在这些技术中,最令人激动的是面向方面的软件开发(AOSD)技术。AOSD编程技术(面向方面的编程,或AOP)为独立表示关注点提供了语言机制,并且提供了将这些关注点编织成为一个工作系统的实现技术。面向方面的软件工程(AOSE,Aspectoriented software engineering)技术正是为了管理使用这种新规范的开发系统过程而出现的。
关于本书
本书内容源于2001年10月《Communications of the ACM》中面向方面技术专题的经验。当时提交的论文达到了我们出版篇幅的7倍;它已经成为ACM数字图书馆的热点专题。同时我们还看到有关面向方面主题的学术研讨会越来越多。很明显,在计算机科学团体中涌现出了对有关方面技术的更大的学习热情。这令我们产生了两个想法——一是召开有关面向方面软件开发的国际会议;二是出一本书,向一些先进的软件开发团体介绍本领域出现的不同思想。由面向方面软件组织与ACM联合发起的会议最近已经召开了第3次年会,在ACM数字图书馆有会议论文集。
我们希望本书能够成为一本有关软件工程的专辑,为软件开发中对此有学习兴趣的高级软件工程师介绍软件开发领域内的这一新方向。为了出版此书,我们向本领域的一些研究人员约稿,其中有些文章是有关他们当前工作综述的最新论文,有些则是对一些指定的已有论文的再版。本书就是对所有这些提交论文的编选汇总。
如何阅读本书
本书的第1章介绍了面向方面软件开发的概念,建议所有读者阅读。除此之外,尽管实际的系统开发是依托于一个工程活动的所有过程的,但系统开发的基础却是程序语言和模型。尽管方面技术还没有充分成熟到提供令人信服的实际系统数量,但一种软件技术的最终验证还是其所支持构建的系统。因此,在简介之后,本书按三部分组织:第一部分主要是对实现方面的语言描述,在编程语言领域中对方面的地位给予了关注。第二部分描述了面向方面软件开发过程的技术。第三部分详细介绍了使用方面技术的初始应用经验。每一部分都有一个内容介绍章节,介绍了界定有关主题中方面技术的范围,描述了每一章在此领域中的位置。除此介绍之外,各个章节(有助于成为一本关于研究现状的编选著作)基本上是独立的。除了作者在文中明确引用其他文章之外,几乎所有章节都是独立成篇的。
致谢
我们要感谢Craig Thompson和Tom Poppendieck仔细阅读了本书的手稿,感谢Ryan Van Roode在本书出版上给予的帮助,以及那些撰稿者为使本项目得以实现所付出的努力和耐心。
Robert E.Filman, Tzilia Elrad, Siobhan Clarke, Mehmet Aksit:Robert E.Filman: Robert E. Filman博士是美国国家航空航天局(NASA)阿姆斯研究中心高级计算机科学研究学会的高级科学家。他曾任职于Lockheed Martin导弹和空间研究组织、IntelliCorp公司、HP实验室以及Bloomington印地安那大学计算机科学系。他同时还是《IEEE Internet Computing》杂志的总编以及AOSD 2006国际会议主席。
Tzilia Elrad: Tzilla Elrad博士是芝加哥伊利诺斯理工学院计算机科学系的研究员,目前的研究工作受美国国家科学基金面向方面软件工程课题支持。他还是AOSD 2005国家会议的组委。
Siobhan Clarke: Siobhan Clarke 任教于爱尔兰都柏林大学Trinity学院计算机科学系,是面向aspect软件开发领域的一位学术带头人。本书描述的Theme/UML方法,即基于她的博士论文中分割和合成对称设计模型的相关工作。她目前正在研究将面向aspect设计和编程模型用于移动、可感知环境的计算中。
Mehmet Aksit: Mehmet Aksit教授是一位终身教授,现任纽芬兰Twente大学软件工程系主任和TRESE组织负责人。他曾任职AOSD 2002国际会议组委和AOSD 2003国际会议程序委员。
莫倩 王恺 刘冬梅 袁臻:暂无简介
面向方面的软件开发,是当今最为前沿和热门的一个软件开发技术研究和应用领域,也是一个将很快在我们的经济、生活和工作中产生重大影响的新兴技术领域。
面向对象的编程与传统的结构化编程相比,理论上会使应用程序更易编写、更易维护、更易演化。但这是理论上的优点,真实世界的对象十分复杂,人们需要通过不同的角度来看待和处理它们,也就是面向不同的方面(Aspect)。当面对应用程序中大量传统的编程对象时,如果要实现从不同的角度来看待和处理它们,就需要编写新的代码,这些新的代码会破坏编程对象的模块性,产生所谓的代码混杂。例如Apache Web服务器有43个功能模块,其中有37个模块都包含处理用户登录的代码。
面向方面的编程(AspectOriented Programming,AOP)能够帮助我们解决这类问题。面向方面技术最基本的特性是多量化和不知觉性(第2章)。在上面的例子中,采用面向方面编程技术,只需要定义一个用户登录方面模块,就能同时实现37个模块对用户登录的处理,这就是多量化;而另一方面,这37个模块完全不需要了解任何有关用户登录方面模块的任何信息,也就是程序员并不需要在37个模块中编写和插入任何用户登录的代码,这就是不知觉性。这两个特性所带来的好处是显而易见的:多量化使得原本分散编写的代码集中到一个方面模块中,代码更清晰,编程量更小,程序更易编写、更易维护。不知觉性使得用户登录模块与其他功能模块彼此独立,当修改用户登录功能时,不会影响其他37个模块,这样的系统更易维护、更易演化。
简而言之,AOSD将使软件开发者的工作更轻松!
本书分为三个部分共31章,每章独立成篇,但在逻辑上又彼此前后呼应、一脉相承。所有的作者均为AOSD领域的领袖人物或知名学者。第一部分“语言和基础”讨论了面向方面语言的基础、历史、本质、模型和实现。这一部分使我们能够深入理解面向方面语言的本质,知其所以然。第二部分“软件工程”立足于软件工程的角度,从软件开发生命周期的多个阶段讨论了面向方面软件的开发。编程只是软件开发生命周期中的一小部分,面向方面的编程如果没有面向方面的分析、设计和建模等相关过程的配合,就可能无法为我们带来它理论上的优点和益处。第三部分“应用”讨论了多个AOSD的不同应用领域,其中包括已经在商业应用领域中经受过实践检验的安全性应用,以及必将在未来影响我们的经济和生活的应用感知领域。
本书是目前AOSD领域最为全面、最为权威的论著,无论读者想了解或从事AOSD领域任何一方面的工作,它都是一本必读之书!
本书前16章,由莫倩博士翻译,第17章到第21章由王恺翻译,第22章到第27章由刘冬梅翻译,第28章到第31章由袁臻翻译,全书由莫倩博士组织翻译并负责统稿。
由于译者水平有限,加上AOSD又是一个新兴的领域,文中难免存在不妥之处,敬请读者批评指正。
译者
2005年9月10日于北京关 于 主 编
第1章概览
11本书的组织
12常用术语
13历史背景
第一部分语言和基础
传统工程
软件开发是工程
章节说明
方面语言设计的角度
参考文献
第2章面向方面编程的多量化和不知觉性
21引言
22局部性和单一性语句
23不知觉性
24多量化
241静态多量化
242动态多量化
25实现问题
26面向方面的语言
27相关工作
28结束语
致谢
参考文献
第3章N度分离:关注点的多维分离
31引言
32动机
321第一轮
322进化SEE:环境灾难
323事后分析
324打破统治地位
33关注点的多维分解
331传统软件模型
332多维分解:超切片
333使用超模块组合超切片
334使用模型
34实例化
341映射到单元和模块
342超切片表示
343支持组合
35相关工作
36结论和将来的工作
致谢
参考文献
第4章组合过滤器的原理和设计原理
41引言
42例子:社会安全服务
421应用的概述
422软件系统
43用组合过滤器进行对象内横切
431关注点实例=对象+过滤器
432演化步骤1:保护文档
433组合过滤器解决方案
434消息处理
435对象内部横切
44对象间横切441演化步骤2:添加工作流管理
442演化步骤3:添加日志
45评估
451CF模型的实现
452内置式组合过滤器
46结论
参考文献
第5章从历史视角探讨AOP(名称的由来)
51风格问题
5220世纪90年代早期的研究趋势
521问题的描述
522对问题和专门解决方案的分析
523识别可以被分离的关注点
524分离技术
53AOP在PARC的诞生
531RG
532AML
533ETCML
534DJ
535Djava
536AspectJ
54建立团体
541研究者
542实践者
55回顾
56AOP 的本质
57将来的挑战
致谢
参考文献
第6章AspectJ
61AspectJ的目标
611通用目的
612基于编程语言的直接支持
613易于学习
614增量式应用
615易于集成
616适合真实的应用
62AspectJ语言
621联结点
622切入点
623通知
624类型间声明
625方面
626进一步阅读
63AspectJ工具
631历史
632编译器
633AspectJ的IDE支持
634使用ajdoc生成文档
635Ant任务
64将来的方向
65结束语
致谢
参考文献
第7章耦合面向方面和自适应编程
71概述
711关注点含蓄的编程
712结构含蓄的编程
72含蓄性作为自适应行为的隐喻
721含蓄性怎样关联到AP
722含蓄性怎样关联到AOP
723Demeter法则
724针对关注点的Demeter法则
73使用DJ的反射自适应编程
74使用DAJ的方面自适应编程
741策略图交叉
742访问者类
75相关工作
76结论
参考文献
第8章使用CAESAR解开横切模型 …
81引言
811对语言支持的需求
812本章的贡献和结构
82联结点介入
821缺乏对多抽象方面的支持
822缺乏对复杂映射的支持
823缺乏对可重用方面联编的支持
824缺乏对方面多态的支持
83CAESAR模型
831方面合作接口
832方面实现
833方面联编
834封装器再利用
835最专用的封装器
836切入点和通知
837编织片和部署
838虚类和静态类型
84评估
841问题再现
842显式与隐含方面的实例化/部署
85实现
86相关工作
861开放类
862自适应性即插即用组件
863基于合作的分解
864动态部署的实现
87总结和将来的工作
参考文献
第9章基于跟踪的方面
91引言
92基于跟踪的方面的特征
921可观察的执行跟踪
922方面语言
923编织
93表达性方面和等价推导
94方面交互的检测和消解
941方面交互
942对冲突消解的支持
95安全属性的静态编织
951例子
95 2编织阶段
953即时编织
96结论
参考文献
第10章使用Mixin技术提高模块化特性
101介绍
102MIXIN技术
1021Mixin
1022逐步细化
1023Mixin层
103FIDGET的设计
1031体系结构
1032组件
1033同胞模式
1034JL的隐含的this类型参数
104FIDGET的使用
105MIXIN的编程支持
1051构造器传播
1052深度一致性
106将来的工作
1061语义检测
1062类层次优化
1063Mixin作为类型
1064实现参数化多态
107相关工作
108结论
致谢
参考文献
第11章用首类名字空间分离关注点
111引言
112Piccola
1121Piccola层
1122通用封装器
113例子:Mixin层组合
1131Piccola中的Mixin层
1132使用Mixin层的软件演化
114用形式结构描述组合风格
115结论
致谢
参考文献
第12章使用反射支持AOP
121什么是反射
1211基础级和元级
1212元对象及其协议
1213元链和元对象协作
1214反射编程语言及其MOP的例子
122使用反射的AOP
1221从反射到AOP
1222使用多个方面的应用例子
1223分离方面
1224编织方面
123讨论
1231灵活性
1232性能
1233复杂性
1234工具
1235重用性
124结论
参考文献
第13章通过控制通信插入Ility
131通过控制通信实现Ility
132对象基础框架
1321注入器
1322注解
1323Pragma
133已应用Ility
1331可靠性
1332服务质量
1333可管理性
1334安全
134相关工作
135结论
参考文献
第14章使用字节码转换集成新特征
141方面和转换
142字节码转换概述
1421静态转换
1422动态转换
143编程转换
1431选择
1432在AOSD中的使用
144学到的经验
1441接口设计
1442安全、可靠和正确
1443多个名字空间
1444反射
1445处理转换的功能
1446调试转换代码
145结论
参考文献
第15章JMangler——一个面向方面编程的强大后端平台
151引言
1511方面编织的挑战
1512加载时间分析和转换(LAT)的保证
1513面向方面的LAT和JMangler
152通用拦截
1521Java的类加载体系结构
1522依赖类加载器的拦截
1523依赖JVM的拦截
1524依赖于平台的拦截
1525可移植的通用拦截
153开放式体系结构
154对非本地转换的支持
155BCEL编织器
1551转换和方面
1552转换器
1553转换器的使用
1554非预期的转换器组合
1555转换过程
1556例子
1557接口转换器的创建
1558代码转换器的创建
156使用场景
1561使用JMangler的加载时编织
1562使用JMangler的运行时编织
1563先进特征
157相关工作
158结论和将来的工作
致谢
本章附录:简单的代码覆盖
CodeCoverTransformer的实现
激活
参考文献
第16章使用Java方面组件的面向方面软件开发
161JAC框架和编程模型
162设计符号
1621方面组件类
1622切入点定义
1623第一个简单的例子
1624为分布扩展的设计符号
163分布式的JAC体系结构
1631方面部署和分布
1632分布式应用的例子
164JAC的实现和性能问题
1641JAC的实现
1642性能衡量
165相关技术和工具
1651面向方面的语言和工具
1652方面设计符号对比
166结论
参考文献
第二部分软件工程
关键软件工程术语
章节介绍
参考文献
第17章工程化面向方面系统
171需求工程
172描述
173设计
174实现
175演化
176方面交互
177结论
参考文献
第18章软件生命周期中的面向方面:事实和想像
181引言
182在实现层次的方面
1821示例动机
1822AOP:事实和想像
183在设计层次的方面
1831采用UML的方面
1832基于软件体系结构观点的方面
184结论
致谢
参考文献
第19章采用主题/UML的通用面向方面设计
191引言
192动机
193横切主题:模型
1931描述模板
1932描述横切行为
1933绑定描述的组合
1934组合输出
194作为主题的方面:例子
1941图书馆基本设计
1942例1:同步方面
1943例2:观察者方面
195到Hyper/J的映射
1951Hyper/J编程元素
1952基于Hyper/J的观察者模式
196到AspectJ的映射
1961AspectJ编程元素
1962到AspectJ的映射算法
1963基于AspectJ的观察者模式
197映射到编程模型
198相关工作
199结论
参考文献
第20章使用UML行为图和结构图来表示方面
201引言
202概念、术语和建模语言
2021面向方面编程
2022统一建模语言(UML)
203我们的方法体系规定的处理过程
2031AO建模步骤
2032并发限定缓存问题
2033分析和设计
2034使用类图的结构化描述
2035建模横切关注点(步骤6~8)
204实现我们的方法体系的益处
2041隐含编织
2042松散耦合
2043扩展性
2044可跟踪性
2045CASE工具对我们的方法体系的支持
2046自动代码生成和循环开发
205结论
致谢
参考文献
第21章面向方面软件开发的关注点建模
211引言
212什么是关注点
213关注点的一种视点
214为什么需要关注点建模
2141对贯穿于开发生命周期和构件之中的关注点描述和分析
2142对传统开发任务的增强
2143AOSD的支持
215作为头等事务的关注点建模
2151关注点建模模式的需求
2152处理考虑
216COSMOS:一种关注点空间建模模式
217关注点模型示例
218相关工作
2181传统的(非面向方面)建模
2182面向方面建模
219附加的讨论
2191关注点概念的形式化表示
2192对AOSD贡献的本质
2110结论
致谢
参考文献
第22章关注点描述工具的设计建议
221工具的研究
2211AspectBrowser
2212AMT
2213FEAT
222研究形式
2221Jex示例
2222AMT示例
2223AspectBrowser示例
223数据
2231使用的策略
2232标识出的关注点代码
224结果
2241工具设计建议
2242关注点刻画
2243研究工作的有效性
225相关工作
2251关于程序修改任务的研究
2252特征定位方法
2253影响分析方法
226结论
致谢
参考文献
第23章面向方面编程的初始评估
231AspectJ
232实验
2321通用的形式
2322实验1:调试的易用性
2323形式
2324结果
2325实验2:修改的容易性
233从组合分析中获知的理解
2331方面内核接口事宜
2332方面可能替换任务策略
234实验评价
235相关工作
236总结
致谢
本章附录
参考文献
第24章面向方面的依赖关系管理
241依赖关系管理的原则
2411依赖关系
2412依赖关系的强度
2413原理
242作为通用原则的间接性:从指针到设计模式及更多
2421超越指针概念
2422面向对象间接层
2423设计模式和间接层
2424面向方面间接层
243对于设计模式的面向方面的替代者
2431访问者模式
2432观察者模式
2433扩展对象模式
2434虚拟的构建
244面向方面依赖关系管理的指导方针
2441面向对象间接层
2442面向方面间接层
2443组合面向对象和面向方面间接层
245从面向方面依赖关系管理中得到的建模益处
参考文献
第25章应用方面开发软件组件:某些问题和经验
251引言
252动机
253我们的方法
254采用方面的组件描述和设计
255采用方面的组件实现
256在运行时使用方面
257相关工作
258评估
259未来的研究方向
2510结论
参考文献
第26章智能编织器:一种针对方面组合的知识驱动方法
261知识驱动的编织
2611Smartbooks归档方法
2612在Smartbooks中的编程任务
2613Smartbooks的引擎
262一个工作流应用示例
263应用智能编织器:开发者的视点
2631目标应用的设计
2632与任务管理器的交互
264定义编织知识:设计者视点
2641支持技术的归档卷册
2642加入编织信息
2643方面需求的内部表示
265相关工作
266结论
参考文献
第三部分应用
管理C3
管理多量化
管理不知觉性
章节
第27章通过面向方面编程开发安全应用
271引言
272应用层次安全性领域
273一份实验报告
2731一个个人的信息管理系统
2732一个FTP服务器
2733朝向一个方面框架
274讨论
2741正面的经验
2742AOP环境的需求
275相关工作
276结论
致谢
参考文献
第28章结构化操作系统方面
281AspectC
2811使用AspectC的标准行为预取
2812切入点声明
2813通知声明
2814实现比较
282结论
参考文献
第29章数据库系统的面向方面编程
291引言
292在面向对象数据库系统中横切关注点
2921在DBMS层次横切关注点
2922在数据库层次的横切关注点
293面向对象数据库系统中的AOP
2931DBMS层次的方面
2932数据库层次的方面
294面向方面方法的评价
295模块化数据库中的横切关注点的其他方法
296结束语
参考文献
第30章两层次方面编织,以支持模型驱动合成中的演化
301模型集成计算和AOSD
3011模型集成计算
3012在领域建模中横切关注点
3013模型编织器
302例子:饥饿/懒惰评测约束条件的模型编织
3021在GME中建模Bold Stroke组件
3022饥饿/懒惰评估的策略
303从领域专有模型中产生方面代码
304结论
3041未来工作
3042相关工作
致谢
参考文献
第31章动态面向方面的基础架构
311引言
312应用场景
313使用面向方面的应用感知
314使用PROSE满足应用感知的需求
3141在PROSE中处理应用感知
3142PROSE体系结构
315在节点群中编织方面
3151方面的分布
3152方面的生命周期
3153软件体系结构问题
316在应用感知中的AOP的使用示例
3161为机器人技术实现的位置专有功能
3162其他应用感知的例子
317结论
致谢
参考文献