跳至內容

計算機程式設計/面向切面程式設計

來自華夏公益教科書,開放書籍,開放世界

面向切面程式設計 (AOP) 是對面向物件程式設計 (OOP) 的後續發展,旨在解決 OOP 的一些實際侷限性。

OOP 旨在透過將資料和方法封裝到離散物件中來管理軟體開發的複雜性,減少不同軟體構造之間的依賴關係,以及多型性,即能夠將不同的程式構造視為特定目的的相同構造的能力。總體而言,定義一組構造良好的物件,這些物件之間具有明確的關係,允許程式設計師將軟體“元件化”,以小規模、簡單、專注的方式工作,建立易於安全地組合成更大構造以實現更大功能的構造。

OOP 的實際困難在於,在任何大型應用程式中,都有一些方面不容易分解成物件/元件,或不容易作為物件/元件使用。“橫切關注點”或 *橫切* 是一個大型軟體專案的組成部分,它們在幾個地方或多個物件中以相同的方式存在,在這些地方,實現程式碼來有效地解決這些關注點會破壞封裝,增加而不是減少依賴關係。AOP 旨在透過將處理這些橫切關注點的程式碼移動到單獨的程式設計構造中來減少依賴關係和複雜性,這些構造然後可以由 *編織器* 以自動方式編織回 OOP 原始碼中。結果是面向物件程式碼,然後可以像平常一樣進行編譯。

AOP 的一個典型應用是日誌記錄。通常,程式設計師會使用日誌記錄來記錄程式的狀態和流程,這既便於在開發期間進行除錯,也便於在部署後進行錯誤修復。在 OOP 程式中,這有幾種可能的實現方式

  • 每個物件都可以訪問全域性日誌記錄物件,並呼叫其方法來記錄事件或狀態。
  • 所有需要日誌記錄的物件都重複相同的程式碼來寫入日誌。
  • 每個物件都儲存自己的日誌,可能寫入檔案。

這裡 AOP 試圖解決的本質問題是,程式碼在幾個地方重複出現,這使得維護變得困難,並且增加了不同構造之間的依賴關係。更改日誌記錄器的行為需要在第二種和第三種情況下在多個檔案中重寫相同的程式碼;更改日誌記錄器的使用需要在所有情況下重寫相同的程式碼。

透過將日誌記錄定義為橫切關注點並使用切面來解決問題,程式設計師編寫切面程式碼來處理日誌記錄,並使用 *編織器* 將程式碼注入 OOP 原始碼,然後像平常一樣編譯 OOP 程式碼。日誌記錄功能已從類的原始碼中移除,放置在一個位置,並被視為另一個可以在本地定義和實現的單一構造,然後可以離散地用於程式的其餘部分。

在理論方面,AOP 是實現 *關注點分離* 的方法。物件經常被要求處理幾個概念上不同的關注點。銷售條目應用程式中的發票包含一些顯而易見的屬性,例如購買者的身份和購買的商品;但發票物件也可能需要知道如何記錄其操作,如何將其持久化到資料庫中,如何驗證購買者的信用額度,以及如何在其到期後發出標誌。因此,發票類可能變得很大、複雜且難以維護。每個關注點對於該類來說都是合法的,但根據 OOP 的原則,必須在內部和不可見地進行處理。如果這些關注點由其他關係不太密切的物件共享,那麼不僅涉及的類具有不必要的複雜性,而且這種複雜性在多個地方重複出現。

一些定義將有所幫助

*橫切關注點* 或 *橫切* 是 OOP 應用程式設計中的任何部分,這些部分同時出現在 OOP 應用程式的幾個不同部分中,而這些部分之間沒有其他關係。日誌記錄是一個明顯的例子,但永續性是另一個例子:在銀行應用程式中,許多不同的物件必須以相同的方式儲存和檢索(例如,關係資料庫)。永續性是應用程式物件的橫切關注點。

*連線點* 是 OOP 程式碼中語義上可定義的點,編織器可以識別這些點。對於我們的日誌記錄示例,程式設計師可能希望記錄呼叫堆疊,因此日誌記錄器應記錄每個函式的入口和出口。

一組連線點由 *切入點* 共同識別:連線點是編織器識別的程式碼中的實際位置;切入點是定義要查詢的連線點的 AOP 程式碼。

切入點不僅識別連線點,還包括對這些點採取行動的程式碼。該程式碼稱為 *通知* 或 *通知*。

那麼,*切面* 是一組切入點,用於定義要由 AOP 模組處理的特定橫切關注點。在實踐中,我們對日誌記錄示例的解決方案是一個切面模組,它定義切入點,以識別程式設計師希望進行日誌記錄的那些連線點。識別了連線點後,程式設計師將在 AOP 模組中編寫通知,編織器將該程式碼注入 OOP 原始碼作為程式碼編譯的預備步驟。

此時,看起來 AOP 無非是將實用程式程式碼從類中提取出來並集中起來;這是 AOP 的優點之一。但是,AOP 可以分離更復雜的關注點。在我們的發票示例中,我們提到發票有到期日。同樣,我們自己的應付款項也可能有一個到期日。這種“到期”關注點可以封裝為一個切面,該切面在發票和應付款物件的構造或初始化時定義切入點。在這些連線點,可以向兩個類新增到期日成員,以及將發票/應付款註冊到到期監控系統中的程式碼,該系統會生成即將到期的日期的每日報告。跟蹤付款期限的程式碼已移至單個模組,降低了發票/應付款物件的複雜性,消除了發票/應付款類與期限監控系統之間的依賴關係,並且使得維護和更改系統變得更容易。

目前,AOP 最流行的平臺是 AspectJ,它是 Java 語言的擴充套件。這裡將使用這種語言作為示例。

華夏公益教科書