剖面導向程式設計
此條目缺少有關連接點模型的資訊。 (2019年8月3日) |
此條目需要補充更多來源。 (2019年8月3日) |
面向切面的程式設計(Aspect-oriented programming,AOP,又譯作面向方面的程式設計、剖面導向程式設計)是電腦科學中的一種程式設計范型,旨在將橫切關注點與業務主體進行進一步分離,以提高程式碼的模組化程度。通過在現有代碼基礎上增加額外的通知(Advice)機制,能夠對被聲明為「切點(Pointcut)」的代碼塊進行統一管理與裝飾,如「對所有方法名以『set*』開頭的方法添加後台紀錄檔」。該范型使得開發人員能夠將與代碼核心業務邏輯關係不那麼密切的功能(如紀錄檔功能)添加至程式中,同時又不降低業務代碼的可讀性。面向切面的程式設計范型也是面向切面軟體開發的基礎。
面向切面的程式設計將代碼邏輯切分為不同的模組(即關注點(Concern),一段特定的邏輯功能)。幾乎所有的編程范型都涉及代碼功能的分類,將各個關注點封裝成獨立的抽象模組(如函式、過程、模組、類以及方法等),後者又可供進一步實現、封裝和重寫。部分關注點「橫切」程式碼中的數個模組,即在多個模組中都有出現,它們即被稱作橫切關注點(Cross-cutting concerns, Horizontal concerns)。
紀錄檔功能即是橫切關注點的一個典型案例,因為紀錄檔功能往往橫跨系統中的每個業務模組,即「橫切」所有有紀錄檔需求的類及方法體。而對於一個信用卡應用程式來說,存款、取款、帳單管理是它的核心關注點,紀錄檔和持久化將成為橫切整個物件結構的橫切關注點。
切面的概念源於對物件導向的程式設計和計算反射的融合,但並不只限於此,它還可以用來改進傳統的函式。與切面相關的編程概念還包括元物件協定、主題(Subject)、混入(Mixin)和委託(Delegate)。
基本概念與指導范型編輯
從核心關注點中分離出橫切關注點是面向切面的程式設計的核心概念。分離關注點使得解決特定領域問題的代碼從業務邏輯中獨立出來,業務邏輯的代碼中不再含有針對特定領域問題代碼的呼叫,業務邏輯同特定領域問題的關係通過切面來封裝、維護,這樣原本分散在在整個應用程式中的變動就可以很好的管理起來。
- 關注點(Concern):對軟體工程有意義的小的、可管理的、可描述的軟體組成部分,一個關注點通常只同一個特定概念或目標相關聯。
- 主關注點(Core concern):一個軟體最主要的關注點。
- 關注點分離(Separation of concerns,SOC):標識、封裝和操縱只與特定概念、目標相關聯的軟體組成部分的能力,即標識、封裝和操縱關注點的能力。
- 方法(Method):用來描述、設計、實現一個給定關注點的軟體構造單位。
- 橫切(Crosscut):兩個關注點相互橫切,如果實現它們的方法存在交集。
- 支配性分解(Dominant decomposition):將軟體分解成模組的主要方式。傳統的程式設計語言是以一種線性的文字來描述軟體的,只採用一種方式(比如:類)將軟體分解成模組;這導致某些關注點比較好的被捕捉,容易進一步組合、擴充;但還有一些關注點沒有被捕捉,彌散在整個軟體內部。支配性分解一般是按主關注點進行模組分解的。
- 橫切關注點(Crosscutting concerns):在傳統的程式設計語言中,除了主關注點可以被支配性分解方式捕捉以外,還有許多沒有被支配性分解方式捕捉到的關注點,這些關注點的實現會彌散在整個軟體內部,這時這些關注點同主關注點是橫切的。
- 切面(Aspect):在支配性分解的基礎上,提供的一種輔助的模組化機制,這種新的模組化機制可以捕捉橫切關注點。
連接點模型編輯
AspectJ的連接點模型編輯
面向切面程式設計的各種實現編輯
最廣為人知的面向切面的編程庫是由全錄帕洛阿爾托研究中心開發的AspectJ,該語言可以和Java程式語言結合在一起使用。
在.NET Framework的環境,則有透過MSIL動態注入來實現AOP的PostSharp函式庫,但是到3.0版為為止,官方檔案中只註明適用於C#與VB.NET[1],不適用於C++/CLI。
歷史編輯
「面向切面的程式設計」這一術語出現的具體時間已經不可考證了,但該詞是由全錄帕洛阿爾托研究中心的Chris Maeda首先提出的。術語「橫切」是由Gregor Kiczales提出的。
同許多重大的技術創新一樣,面向切面的程式設計也是在不同的地方被獨立發展出來。面向切面編程的早期工作主要是由下面幾個機構和人員作出的。
全錄帕洛阿爾托研究中心編輯
- 參與人員:Gregor Kiczales, John Lamping, Cristina Videira Lopes
- 研究經歷:早期的工作是關於反省機制和元物件協定的;1997年Gregor Kiczales發表了論文《面向側面的程式設計》(Aspect Oriented Programming)。
- 代表系統:基於元物件協定的面向側面程式設計系統 、AspectJ
國際商用機器公司托馬斯·J·華生研究中心編輯
- 參與人員:William Harrison, Harold Ossher, Peri Tarr
- 研究經歷:1980年代末的早期工作是關於軟體開發環境與工具整合的;後來提出多維分離關注點(MDSOC, Multidimensional Separation of Concerns)
- 代表系統:Hyper/J
美國東北大學編輯
- 參與人員:Karl Lieberherr
- 研究經歷:早期工作研究軟體演化,提出了得墨忒耳定律(the law of Demeter)、傳播模式(propagation pattern)、適應性程式設計(adaptive programming)
- 代表系統:Demeter/C++, Demeter/Java
荷蘭特溫特大學編輯
- 參與人員:Mehmet Aksit
- 代表系統:Composition filters
參考文獻編輯
站外部連結接編輯
- Aspect-Oriented Software Development
- Aspect-Oriented Software Development(AOP年會)
- AOSD Wiki 頁面存檔備份,存於網際網路檔案館(英文維基給AOP的專欄)
- AspectJ Archived 2011-08-25 at WebCite(Java的實現)
- [1] 更多有關於型態間成員宣告的資料
- 關於面向側面的程式設計和AspectJ的系列文章
- The AspectBench Compiler for AspectJ(另一個Java實現)
- 一篇深度討論AOP與AspectJ的系列文章
- 利用RemObject Taco實現AOP的文章
- Constraint-Specification Aspect Weaver 頁面存檔備份,存於網際網路檔案館
- 面向側面對物件導向:該用哪個?何時使用?
- 給Python用的AOP輕量實現
- LOOM.NET 頁面存檔備份,存於網際網路檔案館
- 剖面導向程式設計(AOP/AOSD)簡介