面向方面編程_第1頁(yè)
面向方面編程_第2頁(yè)
面向方面編程_第3頁(yè)
面向方面編程_第4頁(yè)
面向方面編程_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

編程語(yǔ)言面向方面編程01簡(jiǎn)介比較小結(jié)利弊軟件特點(diǎn)目錄03050204基本信息面向方面的編程(AOP)由來(lái)已久,但是直到最近才開(kāi)始獲得Microsoft.NET開(kāi)發(fā)社區(qū)的青睞。任何一項(xiàng)新技術(shù)的采納往往都會(huì)產(chǎn)生對(duì)該技術(shù)及其使用的誤解,AOP也不例外。為了澄清對(duì)AOP的誤解,本文以及下列代碼示例將舉例說(shuō)明一個(gè)AOP的實(shí)際應(yīng)用程序和一些AOP能夠解決的常見(jiàn)問(wèn)題。以使用Web服務(wù)的應(yīng)用程序?yàn)槔?,我們將擴(kuò)展該Web服務(wù)返回的對(duì)象功能,方法是通過(guò)一個(gè)AOP框架對(duì)返回的對(duì)象應(yīng)用新的方面。這些方面將為此功能獨(dú)立生成對(duì)象模型,從而脫離WSDL。簡(jiǎn)介簡(jiǎn)介在考慮對(duì)象及對(duì)象與其他對(duì)象的關(guān)系時(shí),我們通常會(huì)想到繼承這個(gè)術(shù)語(yǔ)。例如,定義某一個(gè)抽象類(lèi)—Dog類(lèi)。在標(biāo)識(shí)相似的一些類(lèi)但每個(gè)類(lèi)又有各自的獨(dú)特行為時(shí),通常使用繼承來(lái)擴(kuò)展功能。舉例來(lái)說(shuō),如果標(biāo)識(shí)了Poodle,則可以說(shuō)一個(gè)Poodle是一個(gè)Dog,即Poodle繼承了Dog。到此為止都似乎不錯(cuò),但是如果定義另一個(gè)以后標(biāo)識(shí)為ObedientDog的獨(dú)特行為又會(huì)怎樣呢?當(dāng)然,不是所有的Dogs都很馴服,所以Dog類(lèi)不能包含obedience行為。此外,如果要?jiǎng)?chuàng)建從Dog繼承的ObedientDog類(lèi),那么Poodle放在這個(gè)層次結(jié)構(gòu)中的哪個(gè)位置合適呢?Poodle是一個(gè)Dog,但是Poodle不一定obedient;那么Poodle是繼承于Dog還是ObedientDog呢?都不是,我們可以將馴服看作一個(gè)方面,將其應(yīng)用到任何一類(lèi)馴服的Dog,我們反對(duì)以不恰當(dāng)?shù)姆绞綇?qiáng)制將該行為放在Dog層次結(jié)構(gòu)中。在軟件術(shù)語(yǔ)中,面向方面的編程能夠獨(dú)立于任何繼承層次結(jié)構(gòu)而應(yīng)用改變類(lèi)或?qū)ο笮袨榈姆矫妗H缓螅谶\(yùn)行時(shí)或編譯時(shí)應(yīng)用這些方面。舉一個(gè)關(guān)于AOP的示例,然后進(jìn)行描述,說(shuō)明起來(lái)比較容易。首先,定義四個(gè)關(guān)鍵的AOP術(shù)語(yǔ),這很重要,因?yàn)槲覍⒎磸?fù)使用它們:接合點(diǎn)(Joinpoint)—代碼中定義明確的可識(shí)別的點(diǎn)。切點(diǎn)(Pointcut)—通過(guò)配置或編碼指定接合點(diǎn)的一種方法。利弊利弊一種常見(jiàn)的誤解是認(rèn)為AOP是截獲,事實(shí)并非如此。但是,它確實(shí)運(yùn)用了截獲來(lái)應(yīng)用通知以及組合行為。有一些.NET代碼示例通過(guò)ContextBoundObject以一種AOP翻版風(fēng)格說(shuō)明截獲??墒怯肅ontextBoundObject來(lái)說(shuō)明截獲并不合適,因?yàn)槭褂眠@種方法的先決條件是所有需要進(jìn)行截獲的類(lèi)都必須從ContextBoundObject繼承。像ContextBoundObject這樣帶有先決條件的AOP方法會(huì)帶來(lái)需求產(chǎn)生的負(fù)面影響,所以在AOP中被視為重方法,應(yīng)該避免使用。重方法在系統(tǒng)中遺留的大量“足跡”會(huì)潛在地影響每個(gè)類(lèi),阻礙將來(lái)更改或修改系統(tǒng)的功能。我創(chuàng)建了一個(gè)名為Encase的輕量型框架。用“輕量型”這個(gè)術(shù)語(yǔ)的意義是整體上對(duì)系統(tǒng)沒(méi)有影響。系統(tǒng)的不同部分仍然受AOP影響,但是選擇輕量型框架并應(yīng)用良好的編程實(shí)踐可以減輕大部分負(fù)面問(wèn)題。Encase框架的用途是簡(jiǎn)化切點(diǎn)、混入和方面組合。開(kāi)發(fā)人員能夠通過(guò)代碼在Encase中應(yīng)用方面,從而代替大多數(shù)其他輕量型AOP框架使用的配置文件(例如XML)。重量型框架阻礙了AOP的應(yīng)用,但是妨礙AOP廣泛應(yīng)用的罪魁禍?zhǔn)资悄壳翱捎玫腁OP示例幾乎都都包含以下內(nèi)容:執(zhí)行方法前先截獲,并應(yīng)用執(zhí)行Trace.WriteLine("Methodentered.")的方面。與普遍看法相反,除了日志記錄、安全、規(guī)范以及這類(lèi)性質(zhì)的事情外,AOP對(duì)于解決其他問(wèn)題也很有用。比較比較為了說(shuō)明更實(shí)用的使用AOP的方法,我們將創(chuàng)建一個(gè)應(yīng)用程序,從名為ContactService.Service的Web服務(wù)接收people對(duì)象的集合。在.NET開(kāi)發(fā)中使用Web服務(wù)的最常見(jiàn)方法是調(diào)用返回XML的Web服務(wù),該服務(wù)通過(guò)框架自動(dòng)反序列化為一個(gè)對(duì)象。這些對(duì)象僅包含數(shù)據(jù)而不包含任何行為。在.NETFramework2.0中,通過(guò)使用partial關(guān)鍵字并創(chuàng)建行為,能夠?qū)@些自動(dòng)代碼生成的對(duì)象添加功能。但是在一些Web服務(wù)或代理對(duì)象之間重用某個(gè)特定行為時(shí)仍然存在一個(gè)問(wèn)題。如前所述,多數(shù)情況下,共享的公共行為將包含在一個(gè)抽象類(lèi)中,其他所有類(lèi)從該類(lèi)繼承。但是,我們不能使Web服務(wù)對(duì)象繼承功能。借此良機(jī),通過(guò)這個(gè)問(wèn)題說(shuō)明AOP功能如何強(qiáng)大。我們的應(yīng)用程序用于顯示人信息。最初它的用途是顯示信息,但是需要添加某些行為。為了查看代碼示例,我們需要?jiǎng)?chuàng)建一個(gè)稱(chēng)為T(mén)heAgileDeveloper.ContactService的虛擬目錄。該目錄必須指向TheAgileDeveloper.ContactService項(xiàng)目在本地計(jì)算機(jī)上的位置。注通過(guò)localhost/TheAgileDeveloper.ContactService可以訪問(wèn)此項(xiàng)目,這一點(diǎn)很重要。圖1.應(yīng)用程序屏幕快照。應(yīng)用程序有一個(gè)視圖,它是一個(gè)名為MainForm的WinForm,用于顯示左側(cè)ListView中Web服務(wù)返回的人對(duì)象。選定一個(gè)人時(shí),名字、姓氏和Web頁(yè)將顯示在右側(cè)的文本框中。載入MainForm時(shí),它調(diào)用ServiceManager類(lèi)來(lái)獲取人信息。軟件特點(diǎn)軟件特點(diǎn)每個(gè)框架應(yīng)用切點(diǎn)、通知或方面的方法都是獨(dú)特的,但是其目的和概念是相同的。在本文示例中,Encaser包裝一個(gè)對(duì)象時(shí)真正進(jìn)行的操作是,通過(guò)命名空間中的類(lèi)產(chǎn)生MSIL代碼,從而隨時(shí)創(chuàng)建新的Contact類(lèi)型。新Contact類(lèi)型派生于Contact類(lèi),它仍然共享類(lèi)型,但是新包裝的對(duì)象還持有對(duì)ContactSave對(duì)象的引用,后者是我們混入的。ISavable.Save方法在新的Contact對(duì)象上實(shí)現(xiàn),因此在調(diào)用Save時(shí),它實(shí)際上將調(diào)用委托給混入的ContactSave對(duì)象。這樣做的優(yōu)點(diǎn)是能夠?qū)⑿碌腃ontact對(duì)象轉(zhuǎn)換為在任何混入對(duì)象上實(shí)現(xiàn)的任何接口。圖2.包裝對(duì)象的UML圖表圖2.包裝對(duì)象的UML圖表。您或許在想,通過(guò).NETFramework2.0的部分類(lèi)語(yǔ)言功能,可以在另一個(gè)partial類(lèi)中添加Save行為。這是可能實(shí)現(xiàn)的,但是本文沒(méi)有采用這種方法,這是為了使代碼與.NETFramework1.x的其他版本向后兼容。既然有部分語(yǔ)言功能,那么在正常情況下,前面的示例也就不需要使用混入了。但是混入仍然很有價(jià)值,因?yàn)橥ㄟ^(guò)它,開(kāi)發(fā)人員可以混入可重用的對(duì)象行為,這些對(duì)象可以源自其他不相關(guān)的對(duì)象層次結(jié)構(gòu),它實(shí)現(xiàn)的功能比partial類(lèi)更多。在使用partial關(guān)鍵字時(shí),是在同一個(gè)類(lèi)或類(lèi)型中添加代碼,只不過(guò)物理位置不同。下一個(gè)混入示例說(shuō)明的添加行為不只特定于Contact類(lèi),而是一個(gè)名為FieldUndoer的可重用類(lèi)。FieldUndoer實(shí)現(xiàn)了IUndoable接口,允許

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論