面向方面的程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
火龙果 整理 uml.org.cn
面向方面的程序设计--
兼谈计算科学的创新
1
火龙果 整理 uml.org.cn
面向方面的程序设计

Aspect oriented programming (AOP)
2
火龙果 整理 uml.org.cn

Xerox(施乐)公司PARC研究中心在1997年的欧洲 面向对象编程大会(ECOOP97)上首次提出Aspectoriented programming(AOP)。 自2002年起,每年分别在欧洲和美国轮流召开专门 的面向方面软件开发(AOSD)国际会议。与会者包括 美国、加拿大、荷兰、英国、法国、丹麦、日本、以 色列等。我国一些学校也对AOP给以关注并开展了一些 研究工作。 从AOP概念提出经过了近十年的时间,这种技术 现在已经开始被工业界采用。
aspect语言必须提供生成可运行系统的实现机制。
系统的组合是在编译时静态组装还是运行时动态进行。 对程序单元分别进行编译的模块化编译机制。
对组装结果的验证机制等。
18
AOP的本质
横切关注点
火龙果 整理 uml.org.cn

将横切关注点(如日志、权限验证、并发控制等非功能需 求)单独用aspect实现,而业务功能用现有的软件技术实 现。由AOP机制提供将这些分离的关注点编织为一个可执 行程序。

23
火龙果 整理 uml.org.cn
AOP特性

Aspect的实现和传统开发方法中模块的实现不同。
Aspect的开发彼此独立,是一种松耦合关系。 主代码的开发者甚至可能没有意识到aspect的存在。 只是在最后系统组装时,才将各aspect代码和主代码 编排融合在一起。
主代码和Aspect之间采用“隐式调用”。 某一应用的领域专家,不太可能对分布、认证、访问控制、同步、 加密、冗余等问题的复杂实现机制很熟悉,所以就不能保证他们 在程序中进行正确的调用。 开发人员很难正确预见到未来对程序的新需求。

AspectJ提供了支持“面向Aspect”概念的如下语言结构及定 义:
Joinpoints:预定义好的程序的特定执行点。
例如: 方法的调用和执行 对属性的读写访问 异常处理 对象和类的初始化执行
构造器的调用和执行
26
火龙果 整理 uml.org.cn
Pointcuts:用来指明所需连接点的语言元素。可能包括一系 列的连接点,同时它还可以为在连接点上执行的通知提供上 下文。 例如: pointcut callSetter( ); call (public void HelloWorld.set*(..))。 其中: pointcut说明声明的是一个切入点,命名 callSetter,后面的 空括号表示该切入点不需要上下文信息。 Call表示该切入点捕获的是对指定方法的调用,指定的方法 是在类HelloWorld中声明的共有的、返回值为空、以set开头、 拥有任意参数的方法。
Aspect:上述三者的结合。以类似于类的概念,将 Pointcut和Advice组合在一起,形成一个程序单元。
28
火龙果 整理 uml.org.cn

AspectJ为程序员提供了编译、调试等工具。

Aspect编排器

将不同aspect组装到一起。

3


火龙果 整理 uml.org.cn
AOP产生的背景
计算机软件设计的一个重要原则,就是要清 晰分离各种关注点(separation of concerns),然 后分而治之,各个击破,最后形成统一的解决方案。
业务逻辑 需求 存储
关注点 标识 安全 日志
4
火龙果 整理 uml.org.cn
27
火龙果 整理 uml.org.cn
Advices:要在Pointcuts执行的Aspect的代码。 AspectJ提供了3种把通知关联到连接点的方式:after、 before、around。 after和before分别表示通知在连接 点的前面或者后面运行,around则表示通知在连接点 的外面运行,并可以决定是否运行此连接点。 例如: 在银行信息系统中,实现帐户存取模块、权限验证模 块和日志记录模块。帐户存取模块可用OOP技术来实 现,其他的模块可采用AOP技术。 在around通知中验证权限,只有验证通过才运行该连 接点,在before和after通知中就输出日志记录。

6
火龙果 整理 uml.org.cn

在目前的技术框架下,通常系统级关注点在逻辑上相互之 间彼此正交(相互独立),同时在实现上趋向于和若干核 心模块交织。 例如:信用卡管理系统的每个核心业务关注点都和安全、 日志等系统关注点相联系。
7
火龙果 整理 uml.org.cn

核心级关注点(业务)多数情况下可以 被很好地分解,并通过编程语言模块化 实现(子模块或软构件)。
17
火龙果 整理 uml.org.cn

三、用aspect编织器将所有的单元编排重组在一起,形成最终的可运行 系统。
为组件语言和aspect语言构造相应的语法树;依据aspect中的连接点 定义对语法树进行联结;在连接的语法树上生成中间文件或目标代码。 aspect语言必须提供将aspect代码和基础代码组合编排(weaving) 在一起的机制。 定义编排语言和规则。 解决aspect之间潜在的冲突。 为组装和执行建立外部约束。
关注点:是指一个特定的目标、概念或者兴趣域。

从技术的角度,软件系统分别包括核心级和系统级的关 注点。

核心级关注点是系统要完成的业务功能;
系统级关注点是完成核心级关注点所必须的配套设施,这 些配套设施通常被认为是整个系统的系统特性,或者是业 务功能的功能约束。
例如:信用卡处理系统 核心关注点是处理付款; 系统级关注点包括日志、事务、认证、安全和性 能等等。
AOP的目标,是要将这些横切关注点与业务逻 辑代码相分离,从而得到更好的软件结构、性能以 及稳定性等方面的好处。
AOP被认为是后面向对象时代的一种新的重要 的程序设计技术。
14
火龙果 整理 uml.org.cn
AOP的基本思想

通过分别描述系统的不同关注点及其关系,以一种松耦合的方 式实现单个关注点,然后依靠AOP环境的支撑机制,将这些关 注点组织或编排成最终的可运行程序。

易理解性和易维护性

代码缠结问题的存在,使OOP技术在易理解性和易维护 性方面都难有很大的提高。

统计发现:“如果一个他人写的程序有37处需要改动, 对于一个最优秀的软件开发人员,也大概只能找到35 个”。 对于AOP,对一个Aspect修改可以通过联结器影响到 系统相关的各个部分,从而大大提高系统的易维护性。
系统级关注点(横向关注点),使用当 前的程序设计方法导致在许多构件中要 重复包含(扩散)这些代码。
8

火龙果 整理 uml.org.cn
横切示例(crosscutting)




Authentication 权限 Caching 缓存 Context passing 内容传递 Error handling 错误处理 Lazy loading 懒加载 Debugging 调试 Logging、tracing、profiling and monitoring 日志、跟踪、 优化、校准 Performance optimization 性能优化 Persistence 持久化 Resource pooling 资源池 Synchronization 同步 Transactions 事务

可扩展性:
指软件系统在需求更改时程序的易更改能力。 OOP主要通过提供继承和重载机制来提高软件的可 扩展性。 AOP通过扩展Aspect或增加Aspect,系统相关的 各个部分都随之产生变化。
21
火龙果 整理 uml.org.cn

可重用性:
指某个应用系统中的元素被应用到其他应用系统的能 力。
9
火龙果 整理 uml.org.cn
现有软件技术的不足
安 全 事 务 业务主导维 业 务
目前的实现技术只提供了一维方法学实现系 统的关注点,该单一维度一般是核心需求和关注点 的模块化实现,其他类型的需求也被迫和该主导维 度一致。
问题空间是n维的,而解空间是一维的。这种失配必然导致需求和 实现之间的失配。
提高代码的可理解性、可维护性、可复用性等。
19

火龙果 整理 uml.org.cn
AOP系统的软件开发过程
业务逻辑 需求 编织器 存储
关注点 标识 Aspect分解 安全
日志 Aspect重组
20
火龙果 整理 uml.org.cn
AOP与OOP比较
OOP是AOP的技术基础,AOP是对OOP的继承和发 展。
16
火龙果 整理 uml.org.cn
AOP程序设计的一般步骤

二、对标识出的Aspect分别通过程序机制实现。
利用组件语言实现系统的组件。对于OOP语言,这些组件可以是 类;对于过程化程序设计语言,这些组件可以是各种函数和API。
构造系统的组件。
构造系统的aspect。 利用一种或多种aspect语言实现aspect。 aspect语言必须提供声明aspect的机制。 aspect如何声明 连接点如何定义 aspect代码如何定义 aspect的参数化程度等


设计上讲,是横切系统的一些软件系统级关注点。
实现上讲,它支持将横切系统的关注点封装在单独的模块单 位中,它是AOP将横切关注点局部化和模块化的实现机制。 常见的“方面”: 异常和出错处理 同步和并发控制 内存访问模式 日志、安全

事务、性能
13
火龙果 整理 uml.org.cn
AOP核心内容就是所谓的“横切关注点”,即 “方面”,Aspect是AOP提供的一种程序设计单元。 而在OOP中,这些一般关注点的实现单元叫作类
OOP以类机制作为一种抽象的数据类型,提供了比过 程化更好的重用性。

OOP的重用性对非特定于系统的功能模块有很好的支持, 如堆栈的操作和窗口机制的实现。 对于不能封装成类的元素,如异常处理等,很难实现重 用。
22

AOP使不能封装成类的元素的重用成为可能。
火龙果 整理 uml.org.cn
10
火龙果 整理 uml.org.cn
源程序就会变成一些为不同关注目的而编制的 指令的缠结混乱物。 缠结现象是现有软件系统中许多不必要的复杂性的核心。 它增加了功能构件之间的依赖性, 分散了构件原来假定要做的事情, 提供了许多程序设计出错的机会,
使得一些功能构件难以复用,
源代码难以开发、理解和发展。
普通关注点可以使用传统的结构化方法和面向对象方法体统的机 制。 系统关注点使用Aspect机制。
15
火龙果 整理 uml.org.cn
AOP程序设计的一般步骤

一、对需求规约进行Aspect分解。

确定哪些功能是组件必须实现的,即提取出核心 关注点。

哪些功能可以以aspect的形式动态加入到系统组 件中去,即提取出系统级的横切关注点。
5
火龙果 整理 uml.org.cn

软件系统中,某个行为,例如操作日志的 记录,存在于软件的各个部分中,这个行 为可以看作是横向存在于软件之中,他所 关注的是软件的各个部分的一些共有的行 为。 在很多情况下,这种行为不属于业务逻辑 的一部分。这种操作并不是业务逻辑调用 的必须部分,但是,我们却往往不得在代 码中显式进行调用,并承担由此带来的后 果。
24
火龙果 整理 uml.org.cn
AspectJ

AspectJ是Xerox PARC开发的基于Java语言 的AOP扩展,它既是一种规约语言,也是一 种AOP的实现语言。 AspectJ是一种支持“面向Aspect”概念的语言。

25
火龙果 整理 uml.org.cn
AspectJ
11
wenku.baidu.com
火龙果 整理 uml.org.cn
某一应用的领域专家,不太可能对分布、认证、 访问控制、同步、加密、冗余等问题的复杂实 现机制很熟悉,所以就不能保证他们在程序中 进行正确的调用。 开发人员很难正确预见到未来对程序的新需求。
12
火龙果 整理 uml.org.cn
方面(Aspect)
相关文档
最新文档