什麼是AOP程式設計?

lvxiangan發表於2018-11-27

AOP是OOP的延續,是Aspect Oriented Programming的縮寫,直譯意思:面向方面程式設計、面向切面程式設計

AOP通過預編譯方式和執行期動態代理實現在不修改原始碼的情況下給程式動態統一新增功能的一種技術。可以在程式碼階段實現分離關注,實現鬆耦合,然後在執行時將相關動作特徵植入執行,從而改變程式的執行順序,達到攔截或者增加功能的目的

常見框架:VirtualXposed

 

下面先說AOP是什麼樣的思想,我們一步一步慢慢來,先看一下傳統程式的流程,比如銀行系統會有一個取款流程

我們可以把方框裡的流程合為一個,另外系統還會有一個查詢餘額流程,我們先把這兩個流程放到一起:

有沒有發現,這個兩者有一個相同的驗證流程,我們先把它們圈起來再說下一步:

有沒有想過可以把這個驗證使用者的程式碼是提取出來,不放到主流程裡去呢?這就是AOP的作用了。有了AOP,寫程式碼時可以專注業務邏輯而不用考慮驗證使用者步驟,寫完之後,呼叫其他地方已經寫好驗證使用者的程式碼,把這段程式碼加到哪幾個地方,而不要你自己Copy過去。
       這裡還是兩個地方,如果你有多個控制流呢,這個寫程式碼的方法可以大大減少你的時間,不過AOP的目的不是這樣,這只是一個“副作用”,真正目的是:你寫程式碼的時候,事先只需考慮主流程,而不用考慮那些不重要的流程。

懂C的都知道,良好的風格要求在函式起始處驗證引數,如果在C上可以用AOP,就可以先不管校驗引數的問題,事後使用AOP就可以隔山打牛的給所有函式一次性加入校驗程式碼,而你只需要寫一次校驗程式碼。

現在大概明白了AOP了嗎,我們假設上面那個方框是個平面,你可以把它當塊板子,這塊板子插入一些控制流程,這塊板子就可以當成是AOP中的一個切面。所以AOP的本質是在一系列縱向的控制流程中,把那些相同的子流程提取成一個橫向的面,這句話應該好理解吧,我們把縱向流程畫成一條直線,然把相同的部分以綠色突出,如下圖左,而AOP相當於把相同的地方連一條橫線,如下圖右,這個圖沒畫好,大家明白意思就行。

    

這個驗證使用者這個子流程就成了一個條線,也可以理解成一個切面,aspect的意思我認為是方面,你用什麼實物去類比,只要你能理解都可以。這裡的切面只插了兩三個流程,如果其它流程也需要這個子流程,也可以插到其它地方去。

相關文章