Aspect Oriented Programming杂谈

      至今Aspect Oriented Programming已经被开发人员所熟知,其简写AOP,译为面向方面编程(也有称面向切面编程)。其产生于90年代Xerox PARC实验室编程范式。被称为oop的延续,oop主要针对业务处理过程的领域问题抽象封装,形成领域对象,更好的描述自然领域问题。而aop主要处理业务处理过程中处理逻辑步骤分离,减少业务逻辑的耦合性,是的我们的开发人员在开发过程中只需关心领域的核心实际逻辑。在结构化编程(SP)中提出了SOC(分离关注点),并一直被称为是面对复杂软件最行之有效的方法之一,并被努力应用于不同的软件实践,比如表现层模式MVC,MVP,PM,面向服务编程SOA,面呈抽象编程等;同样AOP是SOC的应用,针对领域业务逻辑步骤流程的分离,是的我们能够只关心我们真真的领域核心业务。个人认为AOP是OOP的弥补,并非革新。

     AOP的实现在鄙人随笔IOC/AOP随笔目录中提起过,主要分为静态植入和动态注入两种方式,主要区别在于不同的代码时期,编译期和运行时。其实还有第3中实现方式一些常见框架带来的AOP,比如asp.net mvc中的ActionFilter,Handler,通常以模板方法固定流程处理,放出主要逻辑待实现。

    AOP 主要包含两个重要部分构成:1匹配规则,在常见AOP框架实现中,有按照方法,类,程序集,包的名称或者固定特征来精确匹配或模糊匹配,最常用简便的标注java的Annocaton,.net的Attribute。2hack逻辑。对于AOP是针对方法边界的hack,一个方法对于我们来说有3个可见的边界,进入、结束,异常。AOP就是在位于这3个边界中插入hack逻辑,实现公用普遍业务的分离。

    AOP的应用场景:在缓存,日志,异常处理,复杂权限、事务,性能计数等有共同普遍流程顺序是逻辑为其主要大显身手的场景。

下面将介绍在我所熟知的集中语言中的AOP实现:

1:Python

   在Python中实现AOP将是最简单的,以为在Python中装潢函数即是天然的AOP,

def aopLogic(f): 
     def warp(): 
         print( " befor.... "
        f(); 
         print( " after... "
     return warp 

@aopLogic 
def myMethod(): 
     print( " my method pass! "

def myMethod1(): 
     print( " my method pass! "

myMethod() 
print( " --------------------- "
aopLogic(myMethod1)() 
print( " --------------------- "
input( " finish.. ")

 

输出:

SNAGHTMLf06e3

       python装潢函数以@开头,后边紧跟任意函数。上面是一个无参aop demo,我们可以看出加装潢的myMethod = aopLogic(myMethod(无装潢))。如果针对有参的装潢函数则为,aopLogic(args..)(myMethod(无装潢)).

 

2:javascript

     对于javascript这类动态解释性脚本语言有动态特性对于方法的定义定时一定替换策略replace。

function aopTest(obj, func) { 
     var old = obj[func]; 
    obj[func] =  function() { 
        console.log("before...."); 
        old(); 
        conso le.log("after...."); 
    } 


var obj = { 
    "test":  function() { 
        console.log("body......"); 
    } 
}; 

aopTest(obj, "test"); 

obj.test();​

 

输出:

SNAGHTML2c4559

在上面的代码和实际的aop感觉总是缺失写什么,对缺失的是框架或者原生的AOP自动匹配,我们只得用aopTest(obj, "test"); 这类方式来手动匹配,或许你会说它只是一个动态语言的简单replace,AOP有点牵强。目前的情形我也觉得存在性,原理却缺失自动。但是如果我们基于一些js框架去做这些事情,那么一切都那么顺其自然了。比如angularjs提供的ioc注入机制(再谈angularjs DI(Dependency Injection)),利用其实现服务创建aop自动匹配包装。

3:java和c#强类型语言

     关于这一类语言的AOP在我的随便中已经提及很多IOC/AOP随笔目录。主要分为两类静态植入和动态注入。

     静态植入针对存在中间语言的语言机制,java的字节码,c#的MSIL,它们引入特定的语法创建“方面”,并在静态编译时期插入一些特定逻辑到匹配方法,如java aspectJ,.net的PostSharp。利用PostSharp基于mono.cicel IL解析开源框架加上MSBuild编译机制,植入特定逻辑,具体参见IOC/AOP随笔目录中PostSharp篇。

     动态注入一句设计模式动态代理模式重写父类(原类)方法hack逻辑,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行。在市面上的常见AOP框架都会依托IOC框架来处理引用。比如spring,spring.net ,Castle,EL PIAB。

      这类代码是我们见到最多的,所以也不在这里演示张贴了。

  

    AOP的优势在于业务逻辑的横切分离,使得业务逻辑之间解耦,变得离散松散,让不同业务的人去关心自己真正的领域问题领域逻辑,公用逻辑的大量重用,代码整洁减少万恶的重复。

你可能感兴趣的:(programming)