天天看点

OOD/OOP面向名词领域,AOP面向动词领域

OOD/OOP面向名词领域,AOP面向动词领域

变这些行为的时候不影响业务逻辑的代码。

同样,对于“权限检查”这一动作片断进行划分,则是AOP的目标领域。而通过OOD/OOP对一个动作进行封装,则有点不伦不类。

换而言之,OOD/OOP面向名词领域,AOP面向动词领域。

很多人在初次接触 AOP 的时候可能会说,AOP 能做到的,一个定义良好的 OOP 的接口也一样能够做到,我想这个观点是值得商榷的。AOP和定义良好的 OOP 的接口可以说都是用来解决并且实现需求中的横切问题的方法。但是对于 OOP 中的接口来说,它仍然需要我们在相应的模块中去调用该接口中相关的方法,这是 OOP 所无法避免的,并且一旦接口不得不进行修改的时候,所有事情会变得一团糟;AOP 则不会这样,你只需要修改相应的 Aspect,再重新编织(weave)即可。 当然,AOP 也绝对不会代替 OOP。核心的需求仍然会由

OOP 来加以实现,而 AOP 将会和 OOP 整合起来,以此之长,补彼之短。

Class,同时,将有多个访问类,专门用于在同一时刻访问这同一个数据对象。

1

2

3

4

5

<code>abstractclassWorker{</code>

<code>abstractvoidlocked();</code>

<code>abstractvoidaccessDataObject();</code>

<code>abstractvoidunlocked();</code>

<code>}</code>

accessDataObject()方法需要有“锁”状态之类的相关代码。

Java只提供了单继承,因此具体访问类只能继承这个父类,如果具体访问类还要继承其它父类,比如另外一个如Worker的父类,将无法方便实现。

重用被打折扣,具体访问类因为也包含“锁”状态之类的相关代码,只能被重用在相关有“锁”的场合,重用范围很窄。

仔细研究这个应用的“锁”,它其实有下列特性:

“锁”功能不是具体访问类的首要或主要功能,访问类主要功能是访问数据对象,例如读取数据或更改动作。

“锁”

OOD/OOP面向名词领域,AOP面向动词领域

“锁”功能其实是这个系统的一个纵向切面,涉及许多类、许多类的方法。如右图:

因此,一个新的程序结构应该是关注系统的纵向切面,例如这个应用的“锁”功能,这个新的程序结构就是aspect(方面)

在这个应用中,“锁”方面(aspect)应该有以下职责:

具体功能如下:

Authentication 权限

Error handling 错误处理

Lazy loading 延时加载

Debugging 调试

logging, tracing, profiling and monitoring 记录跟踪 优化 校准

Persistence 持久化

Synchronization 同步

【AOP有必要吗?】

当然,上述应用范例在没有使用AOP情况下,也得到了解决,例如JBoss 3.XXX也提供了上述应用功能,并且没有使用AOP。

从另外一个方面说,好像不是所有的人都需要关心AOP,它可能是一种架构设计的选择,如果选择J2EE系统,AOP关注的上述通用方面都已经被J2EE容器实现了,J2EE应用系统开发者可能需要更多地关注行业应用方面aspect。

日志记录,跟踪,优化和监控

事务的处理

持久化

性能的优化

系统统一的认证、权限管理等

应用系统的异常捕捉及处理

针对具体行业应用的横切行为

前面几种横切行为都已经得到了密切的关注,也出现了各种有价值的应用,但也许今后几年,AOP 对针对具体行业应用的贡献会成为令人关注的焦点。

AOP是一个概念,并没有设定具体语言的实现,它能克服那些只有单继承特性语言的缺点(如Java),AOP具体实现有以下几个项目:

AspectJ (TM): 创建于Xerox PARC. 有近十年历史,成熟

基于动态代理API的具体项目有:

JBoss 4.0 JBoss 4.0服务器

aspectwerkz ,spring

Programming,AOP)为我们带来了新的想法、新的思想、新的模式。

AOP 是一个概念,一个规范,本身并没有设定具体语言的实现,这实际上提供了非常广阔的发展的空间。AspectJ是AOP的一个很悠久的实现,它能够和 Java 配合起来使用。

介绍 AspectJ 的使用和编码不是本文的目的,你可以在 Google 上找到很多有关它的材料。

这里只是重温 AspectJ 中几个必须要了解的概念:

Aspect: Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。

Advice:Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。

下面要讨论的这些问题,也许正是接触了 AOP 之后所困惑的。

AOP 帮助我们解决了新的问题没有?

这个问题很难回答,其实最好的答案就是尝试,用成功的项目或是产品来回答。Jboss 4.0 就是完全采用 AOP 的思想来设计的 EJB 容器,它已经通过了 J2EE 的认证,并且在工业化应用中证明是一个优秀的产品。相信在不远的将来,会出现更多采用 AOP 思想设计的产品和行业应用。

Description Language)和应用程序框架(Action-oriented Application Framework)。