[如何提升系統品質-Day27]設計 - Aspect-oriented programming(AOP)
系統品質要好,還有一大部分需仰賴於系統架構的設計。在架構與設計面上,前面幾篇文章提到了『Layer』的觀念,請見: [如何提升系統品質-Day2]重構– UI, Business logic, Data access概念分開 。還有提到了『IoC』的設計,讓類別與服務之間,都能透過Interface來溝通與設計,請見: [如何提升系統品質-Day6]重構-簡單使用interface之『你也會IoC』 這篇文章要來介紹另一個設計概念:Aspect-oriented programming(AOP),wiki中文翻成『面向方面的程式設計』,很抽象,不是嗎?這篇文章期望用比較簡單的方式,來說明AOP的設計原理,藉著AOP的設計方式,來降低一些橫切面(垂直層)的程式,散落在各個Layer之間,而造成了重複、關注點混淆的缺點。並以Spring.Net為AOP framework來當範例。 [如何提升系統品質]系列文章連結 前言 設計系統時,大家一定有碰到幾種情況: 1.在執行某些功能前,要加上權限的檢查 (授權稽核) 2.想瞭解某些功能執行的時間花了多久 (效能分析) 3.想知道某個Entity的狀態或是資料面,再經過某些功能後的改變 (軌跡稽核) 4.在執行某些功能前記錄log (用以提供偵錯資訊,以便儘速修復bug) 諸如此類的狀況,請大家回頭想想,這些『功能』,其實與實際類別提供的『服務』並無直接關連。這些功能有很明確的『關注點』,也就是他們自己的職責。但,若沒有AOP的設計方式,這些程式將充斥在系統的各個服務之中,也有可能導致當修改原本服務的方法簽章或其他部分時,上述的那幾種與服務本身無關的功能,會被連帶影響。 所以,這一些功能會被設計在『垂直層』上,而使用AOP的方式,來進行設計。架構圖(資料來源:軟體構築美學)如下: 簡介 在開始介紹Aop之前,我想先介紹一下Proxy Pattern。而Aop的核心部分,就是在Dynamic Proxy的實作。接著我會用個簡單的例子,來說明如何透過Spring.Net來實作,以Aop的方式,來針對橫切面(Aspect)進行執行時間的紀錄。 Proxy Pattern 先來看一下Proxy Pattern的Class diagram: 當Client呼叫ISubject的時候,以Pr...