至今Aspect Oriented Programming已經被開發人員所熟知,其簡寫AOP,譯爲面向方面編程(也有稱面向切面編程)。其產生於90年代Xerox PARC實驗室編程範式。被稱爲oop的延續,oop主要針對業務處理過程的領域問題抽象封裝,造成領域對象,更好的描述天然領域問題。而aop主要處理業務處理過程當中處理邏輯步驟分離,減小業務邏輯的耦合性,是的咱們的開發人員在開發過程當中只需關心領域的核心實際邏輯。在結構化編程(SP)中提出了SOC(分離關注點),並一直被稱爲是面對複雜軟件最行之有效的方法之一,並被努力應用於不一樣的軟件實踐,好比表現層模式MVC,MVP,PM,面向服務編程SOA,面呈抽象編程等;一樣AOP是SOC的應用,針對領域業務邏輯步驟流程的分離,是的咱們可以只關心咱們真真的領域核心業務。我的認爲AOP是OOP的彌補,並不是革新。javascript
AOP的實如今鄙人隨筆IOC/AOP隨筆目錄中提起過,主要分爲靜態植入和動態注入兩種方式,主要區別在於不一樣的代碼時期,編譯期和運行時。其實還有第3中實現方式一些常見框架帶來的AOP,好比asp.net mvc中的ActionFilter,Handler,一般以模板方法固定流程處理,放出主要邏輯待實現。html
AOP 主要包含兩個重要部分構成:1匹配規則,在常見AOP框架實現中,有按照方法,類,程序集,包的名稱或者固定特徵來精確匹配或模糊匹配,最經常使用簡便的標註java的Annocaton,.net的Attribute。2hack邏輯。對於AOP是針對方法邊界的hack,一個方法對於咱們來講有3個可見的邊界,進入、結束,異常。AOP就是在位於這3個邊界中插入hack邏輯,實現公用廣泛業務的分離。java
AOP的應用場景:在緩存,日誌,異常處理,複雜權限、事務,性能計數等有共同廣泛流程順序是邏輯爲其主要大顯身手的場景。python
下面將介紹在我所熟知的集中語言中的AOP實現:angularjs
1:Pythonspring
在Python中實現AOP將是最簡單的,覺得在Python中裝潢函數便是自然的AOP,編程
def aopLogic(f):
def warp():
print("befor....")
f();
print("after...")
return warp c#
@aopLogic
def myMethod():
print("my method pass!") 設計模式
def myMethod1():
print("my method pass!") 緩存
myMethod()
print("---------------------")
aopLogic(myMethod1)()
print("---------------------")
input("finish..")
輸出:
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();?
輸出:
在上面的代碼和實際的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的優點在於業務邏輯的橫切分離,使得業務邏輯之間解耦,變得離散鬆散,讓不一樣業務的人去關心本身真正的領域問題領域邏輯,公用邏輯的大量重用,代碼整潔減小萬惡的重複。