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的優勢在於業務邏輯的橫切分離,使得業務邏輯之間解耦,變得離散松散,讓不同業務的人去關心自己真正的領域問題領域邏輯,公用邏輯的大量重用,代碼整潔減少萬惡的重復。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM