浅析软件设计方法之面向切面编程

时间:2022-09-10 04:03:47

浅析软件设计方法之面向切面编程

摘要:随着当今软件的发展,其复杂性越来越高,软件设计变得越来越重要,软件项目中软件重用性加剧,随之模块间的依赖程度也更紧密。软件工程中利用低耦合的基本原则难以明晰的实现。因此,合理的解耦变成了软件设计中一个困难问题。针对此问题,提出面向切面编程(AOP)正是其中一种比较实用的解耦方式,阐述面向切面编程方式的产生以及其实现方式,详细说明其实际应用和基本应用。

关键词:软件设计;面向切面编程;AOP

中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)03-0595-02

An Analysis of Aspect Oriented Programming in Software Design

DENG Fang-lin

(Guangzhou maritime college,Guangzhou 510725,China)

Abstract: As the complexity of software increases nowadays, software design gains more and more importance. With the increasing soft? ware reuse in current software projects, the dependency between different modules deepens. The fundamental principle of low coupling in software projects is hard to be clearly realized. Reasonable decoupling becomes a difficult problem in software design. Aspect oriented pro? gramming is one of relatively more practical decoupling methods.

Key words: software design; aspect oriented programming; AOP

面向切面编程(也叫面向方面),英文简称AOP(Aspect Oriented Programming)。是通过预编译方式、代码级扩展或运行期动态实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。利用AOP可以对业务逻辑的各个部分进行横向隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性。

1面向切面编程方式的产生

在开发软件系统中,经常会遇到功能比较单一,在系统中分布广泛但是与具体业务逻辑无关的功能逻辑。例如日志,缓存等功能。这些功能比较独立,和业务逻辑的相关性不高,但系统的各层次都需要对其进行关注。

以往系统开发,更注重把系统纵向分层,相邻的层次间存在单向引用关系,不相邻的层次间相互透明,这是传统OOP开发方式带给系统架构方式。但这种开发方式只是将纵向的功能隔离,无法和各层次通用性的功能消除耦合关系,导致通用性的模块维护比较困难,因此引入横向切面的概念,将日志,缓存等这些通用各作为一种横向切面,将需要进行这些功能处理的地方叫做切面关注点,将切面和其关注点的耦合关系剥离出来组成新的模块对切面及其关注点进行编织,这样使业务逻辑的开发人员不必关注于具体的切面逻辑,消除了切面功能和业务逻辑的耦合。这种开发模式就叫做面向切面编程(AOP)。

2面向切面编程的实现方式

2.1提取横向切面

一般提取切面的条件:1)功能逻辑相对独立;2)功能逻辑不属于核心业务逻辑;3)功能逻辑在系统中多次使用,通用性较强。

2.2确定切面关注点

业务逻辑中需要调用切面逻辑的地方即为切面关注点。此步骤可以根据业务需求确定使用切面逻辑的相关点。

2.3对切面及其关注点进行代码编织

定义切面逻辑在切面关注点得位置运行。

3面向切面编程的实际应用

下面代码以日志系统为例简单对AOP使用进行描述,示例代码为java使用AOP之前,原系统需求:

//服务层的业务实现类

public class Service {

public void updateUserInfo(User user){

//业务逻辑代码实现,此处省略

//添加日志

Log.Info(new Date().toString() +“:“操作”+“Service . updateUserInfo ()”);}

public void setUserDisable(int userId){

//业务逻辑代码实现,此处省略

//添加日志

Log.Info(new Date().toString() +“:“操作”+“Service . setUserDisable ()”);

Service使用

下面使用AOP对此进行重构:

1)提取日志切面

切面类

public class LogAspect{

//日志记录方式

public static void Log(string methodName){

Log.Info(new Date().toString() +“:“操作”+ methodName);

2)切面关注点

这里Service类的所有方法都需要日志,所以关注日志切面的点为Service类的所有方法。

3)对切面及其关注点进行编织

这里使用java内置的动态的方式来实现代码编织

//为Service类实现动态类ServiceHandler

public class ServiceHandler implements InvocationHandler {

//要的原始对象,这里为Service类

private Object objOriginal;

public ServiceHandler (Object obj) {

this.objOriginal = obj ;

}

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

Object result ;

//调用原始对象的方法

result = method.invoke(this.objOriginal ,args);

//调用日志切面功能,组装到Service类的每个函数调用后

LogAspect. Log (method.toString());

return result ;

}}

4)执行调用方法

初始化关注点对象

Service service = new Service ();

InvocationHandler handler = new ServiceHandler (service);

Service proxy = (service) Proxy.newProxyInstance(

service.getClass().getClassLoader(),

service.getClass().getInterfaces(),

handler);

具体调用

proxy.省略平台还没有权威的框架支持,也于.net从语言级别不支持动态有关。

5结束语

AOP作为一种有效的软件设计方式,对原有的软件设计体系是一个有效的补充。它很好地体现了软件设计的基本思想――高聚合,低耦合,为软件设计中相关的问题提供了合理的解决方案。虽然在现有通用的解决方案中还没有将其列为必要的一项,但相信随着软件系统的整体升级,对相关问题日益凸显后,AOP终将被人们愈发重视。

参考文献:

[1]林信良.spring2.0技术手册[M].北京:电子工业出版社,2007(4).

[2]程杰.大话设计模式[M].北京:清华大学出版社,2007(12).

[3]李刚.spring2.1权威指南[M].北京:电子工业出版社,2009(5).

[4]幸俊.AOP开发过程研究及应用[J].成都:成都理工大学,2007.

上一篇:基于vb2005的连连看模拟程序 下一篇:计算机网络技术在现代物流中应用探究