AOP(Aspect oriented programming)面向切面編程。說成切面不容易理解,代碼哪裏有切面?又不是三維物體。概念無論,咱們從其思想來理解這個名詞吧。 AOP的主要思想是把相同、類似的而且零散的邏輯抽離出來,統一處理;這樣不只維護起來方便,也讓代碼更加關注本身自己,清晰明瞭。程序員
好比咱們常見的權限檢查、日誌記錄、異常處理等都是散亂在系統各個地方,好比發表一篇文章的代碼:編程
原本一句話ArticleManager.Save就能搞定的事情,如今要加上if else 還要處理異常,代碼顯得異常難看也難以維護。假如換成框架
用AuthroizeAttribute來處理權限問題,這樣代碼清晰不少,並且能夠複用這個Attribute,這麼好的思想就是AOP思想。
固然Attribute只是一種實現方式,Attribute也是調用Post方法前,經過反射獲得Attribute,而後執行其代碼,
平時咱們用的最多的AOP就在ASP.NET MVC框架裏,這個AuthorizeAttribute就是MVC自帶的。咱們能夠重寫他的一些方法達到本身想要的功能(好比權限等級等)。ide
再舉一個處理異常的例子,若是咱們有一個統一的處理異常的邏輯,那麼就能夠在邏輯代碼裏不用try/catch,而是直接throw exception,這會讓代碼更加整潔。
(PS:比不是說有了統一處理就不再用try/catch了,有些異常該吃掉的仍是要吃掉,這要看具體的業務需求。另外捕獲不到的異常好比線程裏的要注意catch。)
好比例子:spa
而只要重寫MVC提供好的OnException方法就能處理全部的異常,或者是展示給用戶友好的錯誤界面,或者是發送異常日誌都很方便,而不用在每一個地方都寫處理的代碼。
延伸考慮一下,若是統一處理異常信息,那麼對異常的善後處理的把握就要看異常類的設計和運用了。線程
另外,再看上面的代碼,若是有多個地方須要Post(Article),但又徹底不一致,但是字段檢查是一致的,那就會形成字段檢查的代碼重複,這種狀況要麼用一個單獨的方法來驗證Article的有效性,而後各個地方調用,要麼就用MVC提供的ModelBinder,這也是經過參數的Attribute來實現的AOP方法;MVC考慮的太周到了,不得不讚。設計
運用框架提供的AOP很簡單也很愜意,但咱們在用別人的框架時不能只作應用級程序員,咱們要領會其思想,掌握其本質,明白其實現。
所幸,MVC是開源的,咱們能夠看他的源代碼,關注提供AOP的地方。日誌
代碼的設計或者說框架的設計,老是想讓代碼寫起來乾淨利落,鬆耦合,不拖泥帶水。
因此清晰的設計就是從程序的開始,一步步規劃其運行步驟,並在適當的地方提供一些供用戶處理方法。框架就是把用戶框在本身設定的圈子裏,但又儘量的給用戶自由。
咱們看MVC的大體流程,
一、從輸入Url回車那一刻起,先是經過UrlRouting路由,來判斷用戶訪問哪一個Controller/Action;
二、經過controllerfactory獲取具體的controller實例,用戶可自定義factory。
三、經過actioninvoke調用action,在調用以前須要先獲取action的filter,這些filter就是AOP的攔截器。用戶均可以自定義各類filter(就是自定義的attribute)。
四、根據執行順序執行action和filter,onactionexecuting、onactionexecuted等。
五、找到action對應的view,用戶可自定義viewenginer。
六、呈現頁面結束。blog
當出錯的時候invoke的catch調用onexception的用戶的實現。路由
我本想羅列一些MVC的源碼,但感受不必,有心人本身去下載看吧。若是不清楚的能夠加羣交流。
就是這樣簡單,AOP的思想是想把和當前邏輯不相干的代碼抽離的一種實現,咱們若是追求代碼的美感,就會更加在乎總體代碼的設計,AOP一般用於一個系統的外圍搭建處。只有咱們把架子、外圍都搭建的漂亮,代碼寫起來才更美。