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


作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2012/10/28/2743715.html


相关文章
|
29天前
|
缓存 监控 Java
|
3月前
|
Python
类与面向对象编程(Object-Oriented Programming, OOP)
类与面向对象编程(Object-Oriented Programming, OOP)
25 0
|
6月前
|
Java Spring
实现AOP(Aspect-Oriented Programming)以及其他功能
实现AOP(Aspect-Oriented Programming)以及其他功能
25 1
|
5月前
|
C++ 开发者
C++一分钟之-概念(concepts):C++20的类型约束
【7月更文挑战第6天】C++20引入了Concepts,提升模板编程的精确性和可读性。概念允许设定模板参数的编译时约束。常见问题包括过度约束、不完整约束及重载决议复杂性。要避免这些问题,需适度约束、全面覆盖约束条件并理解重载决议。示例展示了如何定义和使用`Incrementable`概念约束函数模板。概念是C++模板编程的强大力量,但也需谨慎使用以优化效率和代码质量。
113 0
|
6月前
|
算法 程序员 编译器
C++一分钟之概念(concepts):C++20的类型约束
【6月更文挑战第30天】C++20的Concepts革新了模板编程,允许更清晰地表达类型要求,提升代码可读性和编译错误反馈。本文探讨Concepts基础、应用场景、易错点及避免策略,展示如何通过概念定义如Iterable、Addable,创建更健壮的泛型代码,强调了理解和利用编译器错误信息的重要性,以及概念与类型别名的区别。Concepts现已成为现代C++程序员的关键技能。
155 0
|
设计模式 Java
20 面向对象编程[OOP(Object Oriented Programming)]
OOP编程 类包含五大成员:属性、方法、构造器、代码块、内部类
92 0
|
Java 开发者 Windows
OOP面向对象编程(Object-Oriented Programming)概述
Java的编程语言是面向对象的,采用这种语言进行编程称为面向对象编程(Object-Oriented Programming, OOP)。
|
算法 Java C#
编程范式 (Programming paradigm)
编程范式 Programming paradigm 范,模范、典范也。范式即模式、方法。常见的编程范式有:函数式编程、程序编程、面向对象编程、指令式编程等。
1576 0