《高级软件架构师讲义》学习笔记六-AOP开发实践

第六章     AOP开发实践

一、什么是AOP?

AOPAspect Oriented Programming的简写,中文通常译作面向方面编程,其核心内容就是所谓的“横切关注点”。

1.         OO是纵向结构的

使用面向对象方法构建软件系统,我们可以利用OO的特性,很好的解决纵向的问题,因为,OO的核心概念,如继承等,都是纵向结构的。

2.         AOP的目标

􀁺 但是,在软件系统中,往往有很多模块,或者很多类共享某个行为,或者说,某个行为存在于软件的各个部分中,这个行为可以看作是“横向”存在于软件之中,他所关注的是软件的各个部分的一些共有的行为,而且,在很多情况下,这种行为不属于业务逻辑的一部分。

􀁺 例如,操作日志的记录,这种操作并不是业务逻辑调用的必须部分,但是,我们却往往不得在代码中显式进行调用,并承担由此带来的后果(例如,当日志记录的接口发生变化时,不得不对调用代码进行修改)。

􀁺 这种问题,使用传统的OO方法是很难解决的。AOP的目标,便是要将这些“横切关注点”与业务逻辑代码相分离,从而得到更好的软件结构以及性能、稳定性等方面的好处。

二、使用AOP实现松散耦合

1.         AOP的自动耦合

AOP,给我们的软件设计带来了一个新的视角和软件架构方法。使用AOP,我们可以专注于

业务逻辑代码的编写,而将诸如日志记录、安全检测等系统功能交由AOP框架,在运行时刻自动耦合进来。

2.         使用AOP技术的情景

通常,我们可以在如下情景中使用AOP技术:

Authentication 权限

Caching 缓存

Context passing 内容传递

Error handling 错误处理

Lazy loading 懒加载

Debugging 调试

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

Performance optimization 性能优化

Persistence 持久化

Resource pooling 资源池

Synchronization 同步

Transactions 事务

3.         OO设计的问题

对于应用软件系统来说,权限控制是一个常见的例子。为了得到好的程序结构,通常使用OO的方法,将权限校验过程封装在一个类中,这个类包含了一个校验权限的代码,例如然后,在业务逻辑过程中进行如下调用:这种做法在OO设计中,是常见的做法。但是这种做法会带来以下的问题:

Code
public class Security
{
public bool CheckRight(User currentUser , Model accessModel ,
OperationType operation)
{
……
//校验权限
}
}

 

Code
public class BusinessClass
{
public void BusinessMethod()
{
Security s 
= new Security();
if (!s. CheckRight(……))
{
return ;
}
……
//执行业务逻辑
}
}

  不清晰的业务逻辑:从某种意义上来说,权限校验过程并不是业务逻辑执行

的一部分,这个工作是属于系统的,但是,在这种情况下,我们不得不把系

统的权限校验过程和业务逻辑执行过程掺杂在一起,造成代码的混乱。

代码浪费:使用这种方法,我们必须所有的业务逻辑代码中用Security类,使

得同样校验的代码充斥在整个软件中,显然不是很好的现象。

紧耦合:使用这种方法,我们必须在业务逻辑代码中显式引用Security类,这

就造成了业务逻辑代码同Security类的紧耦合,这意味着,当Security发生变

化时,例如,当系统进化时,需要对CheckRight的方法进行改动时,可能会

影响到所有引用代码。下面所有的问题都是因此而来。

不易扩展:在这里,我们只是在业务逻辑中添加了权限校验,哪一天,当我

们需要添加额外的功能,例如日志记录功能的时候,我们不得不同样在所有

的业务逻辑代码中添加这个功能。

不灵活:有的时候,由于某些特定的需要,我们需要暂时禁止,或者添加某

项功能,采用传统的如上述的做法,我们不得不采用修改源代码的方式来实

现。

4.         使用AOP组合两个业务逻辑

使用AOP,我们不仅仅可以用来分离系统功能和业务逻辑,也可以用来耦合不同的业务逻辑,得到更加灵活的软件结构。下面,我们通过一个具体的案例,来看看怎么通过AOP,组合两个业务逻辑过程。使用AOP,我们可以通过一种更加自然的方式来实现这个

目标。基本方法如下:

首先,编写相关的库存商品报废业务逻辑,不需要添加任何其他

的内容,并且,把这个逻辑的代码设置为可AOP的。

其次,按照正常的方式,编写财务处理逻辑。

添加一个把库存商品报废业务逻辑和财务处理逻辑组合起来的

Aspect,这个Aspect可以拦截库存商品报废业务逻辑的执行,动

态的加入财务处理逻辑的过程,并且,在配置文件中进行配置。

这样,我们就通过一个Aspect,组合了这两个业务逻辑。并且,

我们随时可以通过修改配置文件的方式把财务处理从库存商品报

废业务逻辑中去除,而不用修改任何代码。

三、对象代理和过滤器

1.         应该认识到,完全的AOP实现,需要开发语言的支持。因为对于AOP的研究,还正在进行之中,目前的开发语言,都还没有完全支持AOP的,但是,我们可以利用现有的一些语言功能,来实现AOP的部分功能。

2.         上面所举的例子,在实现上,是利用了对象代理(Proxy)机制。所谓Proxy,就是“为其他对象提供一种代理以控制对这个对象的访问”

四、结论

AOP给了我们一个新的视角来看待软件的架构,有的时候,即使不使用AOP技术,只使用AOP的某些观念和现有的技术来搭建系统架构,分离某些本来是紧耦合的关注点,对我们也是非常有益的。

 

文中介绍了一个.NetAOP框架Websharp Aspect,不过在AOP框架这方面.Net好像没有Java阵营成熟。

原教程大家可以到豆丁网下载http://www.docin.com/p-1138875.html

posted @ 2009-01-19 10:19  湘西小刁民  阅读(895)  评论(0编辑  收藏  举报