古詩詞大全網 - 藝術簽名 - 面向方面編程的特點

面向方面編程的特點

每個框架使用獨特的相切、通知或方面方法,但其目的和概念是相同的。在這個例子中,包裝器在包裝壹個對象時真正做的是通過系統中的類生成MSIL代碼。Reflection.Emit命名空間,從而可以隨時創建新的聯系人類型。新的Contact類型是從Contact類派生的,該類仍然使用該類型,但是新包裝的對象仍然包含對ContactSave對象的引用,我們在其中加入了該對象。不可救藥。Save方法是在新的Contact對象上實現的,因此在調用Save時,它實際上將調用委托給混合的ContactSave對象。這樣做的好處是,新的Contact對象可以轉換成在任何混合對象上實現的任何接口。

圖二。包裝對象的UML圖。

您可能認為可以通過。NET框架2.0。這是可能的,但本文不采用這種方法,以便使代碼向後兼容其他版本的。NET Framework 1.x由於有壹些語言函數,壹般情況下,前面的例子不需要使用blending。但blending仍然是有價值的,因為通過它,開發者可以混合可重用的對象行為,這些行為可以源自其他不相關的對象層次結構,實現比分部類更多的功能。使用partial關鍵字時,代碼添加在同壹類或類型中,但物理位置不同。下壹個混合示例顯示了添加行為並不特定於Contact類,而是壹個名為FieldUndoer的可重用類。FieldUndoer實現了IUndoable接口,該接口允許將修改後的對象恢復到其原始狀態。

公共接口不可用

只讀屬性將Changes()作為布爾值

子撤消()

Sub AcceptChanges()

終端接口

HasChanges屬性表示如果有更改,Undo會將對象還原到其原始狀態,AcceptChanges會接收對象的當前更改,因此每當再次調用Undo時,都會還原到上次接收更改時的狀態。如果接口是在分部類中實現的,那麽這三個方法必須在每個想要包含該行為的類中重復實現。作為壹個務實的程序員,我盡量堅持“編碼壹次,只編碼壹次”的原則,所以我從來不想重復任何代碼。我復制粘貼的越少越好。通過使用混合,我可以重用實現IUndoable的FieldUndoer對象。我在ServiceManager中混合了這個新功能。所有客戶端代碼仍然不知道新的mix,除非需要使用IUndoable接口,否則不需要更改。在主窗體中更改Contact對象,然後單擊Undo來測試此行為。

公共共享函數GetAllContacts()作為ContactService。聯系人()

Dim服務為ContactService。Service = New ContactService。服務

將聯系人()顯示為聯系人服務。聯系=服務。GetAllContacts

//包裝每個聯系人對象

對於I為整數= 0的聯系人。長度-1

//創建包裝器的新實例

//負責包裝我們的對象

將包裝罩調暗為包裝罩=新包裝罩

//添加ContactSave的mixin實例

Dim saver As ContactSave =新聯系人保存

包裝器。AddMixin(保護程序)

//添加FieldUndoer的mixin實例

dim undoer As field undoer = New field undoer

包裝器。AddMixin(撤銷)

//創建帶有聯系人的新對象

//和ContactSave實現

dim wrapped Object As Object = wrencher。換行(聯系人(I))

//分配我們新包裝的聯系對象

//到上壹個聯系對象

contacts(I)= direct cast(wrapped object,_

聯系服務。聯系人)

//註意被包裝的對象仍然是相同的類型

//將新包裝的聯系對象分配給目標字段

拯救者。目標=聯系人(壹)

undoer。目標=聯系人(壹)

然後

回復聯系人

結束功能

組合行為

混進去只是冰山壹角。真正讓AOP出名的功能是組合混合行為。以新建聯系人對象為例,調用ISavable時。Save方法,客戶端代碼也需要調用IUndoable。AcceptChanges方法,以便在調用IUndoable時還原到上次保存的更改。下次撤銷。在這個小的主窗體中瀏覽和添加對象很容易,但是在任何比用戶界面大得多的系統中編寫規則將是壹項繁重的任務。您需要找到對Save方法的所有調用,然後添加另壹個對AcceptChanges的調用。並且在創建新代碼的過程中,開發人員還需要記住,每次調用Save時都會添加這個新函數。這樣很快就會產生級聯效應,很容易破壞系統穩定的姓,引入壹些難以追蹤的bug。使用面向方面編程可以結合這些方法。指定壹個切入點和通知,調用Save方法時,Contact對象會自動調用後臺AcceptChanges。

為了在應用程序中實現合成,您需要在ServiceManager中添加另壹行代碼。我們在添加FieldUndoer之後添加了這行代碼。

//指定連接點保存,執行AcceptChanges方法

包裝器。AddPointcut(保存,接受更改)

AddPointcut方法用幾個不同的簽名重載,這為指定切點提供了更大的靈活性。我們調用的AddPointcut接收了壹個字符串類型的聯合名,表示為Save方法,然後接收了壹個名為AcceptChanges的方法作為執行通知。要查看這是否有效,可以在FieldUndoer之前設置壹個斷點。AcceptChanges方法和ContactSave。分別保存方法。單擊主窗體上的Save按鈕將截取連接,您將首先中斷通知AcceptChanges方法。Save方法將在通知執行後執行。

這個簡單的例子展示了如何在整個應用程序中添加新的行為,這是非常強大的。盡管有這個特性,但它不僅僅是壹個添加功能的好的新方法。在眾多優勢中,只有少數涉及到代碼復用,通過簡化新需求帶來的系統演化來提高系統的可維護性。同時,誤用AOP會對系統的可維護性產生顯著的負面影響,因此了解使用AOP的時機和方法非常重要。

AOP走了多遠?

AOP在大多數大型系統或者關鍵生產系統中的應用還沒有完全成熟,但是隨著語言支持的完善,AOP的應用會更加容易。此外,提高支持也是壹種新的軟件開發範式,比如使用面向方面編程的軟件工廠。中有幾個可用的AOP框架。NET域,而且每個框架都有自己的方法,正面屬性和負面屬性。

Encase——這個代碼示例中的Encase框架只是壹個幫助妳快速理解和運行AOP以及理解AOP背後的概念的工具。Encase應用可以在運行時單獨添加到對象的方面。

aspect #-壹個面向CLI的AOP聯合兼容框架,提供了用於聲明和配置的內置語言。

rail-rail框架在虛擬機JIT類中的應用。

春天。。。。-流行的Java Spring框架的. NET版本。AOP將在下壹個版本中實現。

EOS-面向方面的C#擴展。