国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

面向方面的編程:它的好處是什么?

2019-11-18 16:15:07
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
來(lái)自于 Rational Edge:關(guān)于面向方面的編程的大多數(shù)介紹,都是建立在技術(shù)可行的有限環(huán)境的基礎(chǔ)之上,而忽略了AOP的實(shí)際價(jià)值。這篇文章提供了將AOP技術(shù)應(yīng)用于軟件開(kāi)發(fā)項(xiàng)目的一系列實(shí)際的例子。

面向方面的編程:它的好處是什么?(圖一)最近,我被要求領(lǐng)導(dǎo)我們軟件工程研究小組(SERG)開(kāi)一個(gè)關(guān)于面向方面的編程(AOP)的討論。在會(huì)議開(kāi)始前的幾小時(shí),一個(gè)學(xué)生問(wèn)我:“那么,方面的好處是什么?但是不要給我關(guān)于日志的例子。那似乎是我閱讀關(guān)于方面的東西時(shí),唯一看見(jiàn)的東西。”

他的問(wèn)題促使我停下來(lái),并考慮將AOP應(yīng)用于一些正在做的軟件系統(tǒng)的有效方法。他同時(shí)也使我認(rèn)識(shí)到需要如何和什么時(shí)候采用新的方法,尤其是當(dāng)他們需要一個(gè)新的思考方式時(shí)。AOP,我之前在這個(gè)專欄已經(jīng)談?wù)撨^(guò),它似乎代表了一個(gè)新方法。我想談?wù)撘恍┪艺J(rèn)為AOP可以被(或已經(jīng)被)有效使用的方法。同時(shí)我們將看到一些可能有助于AOP推廣的最新進(jìn)展。

我將在討論中使用面向方面的java作為例子。然而,當(dāng)今有很多種面向方面執(zhí)行的可用語(yǔ)言。這些語(yǔ)言包括aspectC++甚至于AspectL,它是一種面向方面的Lisp執(zhí)行語(yǔ)言。1

AOP概念的回顧

如果你不熟悉AOP,有很多關(guān)于它的介紹文章,包括我2004年2月發(fā)表的的文章。2很多,也許不是全部,關(guān)于AOP的介紹使用日志作為一個(gè)例子來(lái)說(shuō)明方面的概念。(日志是很多人都懂的東西,并且它是AOP可以被如何使用的一個(gè)很好的例子。)方面的關(guān)注點(diǎn)是橫切。那就是說(shuō),它們不能被簡(jiǎn)單地歸為一類。但是,如果我們嚴(yán)格按照面向?qū)ο蟮姆独覀冃枰獙⑦@些業(yè)務(wù)重新整合為一個(gè)統(tǒng)一的,可維護(hù)的方式。通常,橫切的責(zé)任被委派給一個(gè)單獨(dú)的幫助者類,并依靠每一類來(lái)要求由方面表達(dá)出的功能性,包括在合適的地點(diǎn)進(jìn)行調(diào)用。保證開(kāi)發(fā)人員始終在編碼的合適點(diǎn)上插入登陸是較難實(shí)施的。方面提供了一個(gè)機(jī)制來(lái)改善這種狀況,盡管它還不完美。

有一些概念你需要知道以便你理解這篇關(guān)于AOP的討論。主要概念就是連接點(diǎn)。這是一個(gè)所有編程人員都熟悉的概念,但我們現(xiàn)在有一個(gè)新名字給它。一個(gè)連接點(diǎn)是:一個(gè)在程序流程中定義明確的點(diǎn)。3連接點(diǎn)有很多類型,正如一個(gè)方法的調(diào)用或一個(gè)方法的返回,都可以是一個(gè)正常的返回或者拋出一個(gè)異常。

使用AOP,我們需要一個(gè)在一個(gè)程序中識(shí)別連接點(diǎn)的方法。AspectJ使用切入點(diǎn)來(lái)描述一個(gè)或更多的連接點(diǎn)。切入點(diǎn)是一個(gè)用來(lái)描述一套連接點(diǎn)的表達(dá)式。你可以把切入點(diǎn)想象成對(duì)你的編碼的一個(gè)查詢,用它來(lái)返回一系列的連接點(diǎn)。

當(dāng)你選擇一系列連接點(diǎn)的時(shí)候,你可以為它們提供參考建議。參考建議是一種可執(zhí)行的編碼,當(dāng)連接點(diǎn)遭遇到程序運(yùn)行時(shí),它就需要運(yùn)行。連接點(diǎn),切入點(diǎn)和參考建議關(guān)注于你的軟件的動(dòng)態(tài)屬性。參考建議改變了程序編碼的運(yùn)行特性。

有一個(gè)可以處理你的系統(tǒng)的靜態(tài)特性。就是類型間聲明。類型間聲明允許你改變一個(gè)程序的動(dòng)態(tài)結(jié)構(gòu)。你可以增加程序和變量,并根據(jù)特殊的規(guī)則改變繼承性層次。

正如類是Java模塊化的單元,方面是AspectJ模塊化的附加單元。方面封裝了一個(gè)橫切關(guān)注點(diǎn)的連接點(diǎn),切入點(diǎn),類型間聲明和參考建議。AOP不是面向?qū)ο蠓治龊驮O(shè)計(jì)的一個(gè)替代。它通過(guò)處理許多面向?qū)ο蠓椒ú荒艹浞痔峁┳詈线m方案的情形,構(gòu)建了面向?qū)ο蟮姆独?/P>

AOP實(shí)例

現(xiàn)在讓我們來(lái)看看AOP可以在何處使用的一個(gè)實(shí)例。一些實(shí)例可以在生產(chǎn)系統(tǒng)中找到,而另外一些可以在生產(chǎn)和開(kāi)發(fā)環(huán)境中找到。讓我們從開(kāi)發(fā)人員的一對(duì)實(shí)例開(kāi)始吧。

執(zhí)行追蹤

我驚訝于如此多的開(kāi)發(fā)人員將某些類型的打印語(yǔ)句放入他們的編碼中,來(lái)調(diào)試或跟蹤一個(gè)程序的執(zhí)行。我發(fā)現(xiàn)調(diào)試程序善于給出信息。但我們不在這里討論了解你的調(diào)試程序的價(jià)值。當(dāng)然,想要生產(chǎn)一些你的程序的文本跟蹤信息,是有一些合理原因的。在Eclipse當(dāng)前的一套AspectJ Development Tools(AJDT)中有一個(gè)關(guān)于方面的很好的實(shí)例,那個(gè)方面實(shí)現(xiàn)了一個(gè)程序執(zhí)行跟蹤的過(guò)程。在Eclipse的幫助中,有關(guān)于這個(gè)實(shí)例的詳細(xì)描述。你可以在AspectJ PRogramming Guide中找到它。

實(shí)例有一個(gè)小Java應(yīng)用程序,它有很多類來(lái)表現(xiàn)二維圖形,就像圓形和方形。同時(shí)它還有一個(gè)主要程序來(lái)創(chuàng)建兩個(gè)圓形和一個(gè)方形,并打印出它們的方面,諸如面積,周長(zhǎng),以及它們中心點(diǎn)間的距離。當(dāng)你運(yùn)行程序時(shí),你將得到如圖1所示的輸出結(jié)果。

面向方面的編程:它的好處是什么?(圖二)

圖1:從形狀程序的輸入

如果我們想看見(jiàn)程序調(diào)用的真實(shí)順序,我們有兩個(gè)選擇。第一種方法是,我們可以在每一個(gè)程序的開(kāi)始插入編碼,那樣可以以程序和類的名字打印一個(gè)信息,并且事實(shí)上程序已經(jīng)被輸入。我們需要為每一個(gè)程序做上述的過(guò)程。第二種方法是,我們要?jiǎng)?chuàng)建一個(gè)方面來(lái)做完全一樣的事情。用這種方法,我們不需要改變應(yīng)用程序的任何編碼。

跟蹤實(shí)例包含使用方面跟蹤解決方法的幾個(gè)版本。我們來(lái)看最終的版本。其他版本的討論請(qǐng)見(jiàn)AspectJ Programming Guide中的討論。

一個(gè)穩(wěn)固的跟蹤機(jī)制的解決方法包含兩個(gè)文件。第一個(gè)是一個(gè)抽象的方面。一個(gè)抽象的類的一些編碼被留給了編程人員,編程人員使用它在一個(gè)導(dǎo)出的類中執(zhí)行,或者在一個(gè)導(dǎo)出的方面中執(zhí)行。這個(gè)抽象的方面,叫做Trace,有幾種標(biāo)準(zhǔn)程序來(lái)打印關(guān)于輸入和退出一個(gè)程序,或構(gòu)造方法的信息以及格式化輸出的結(jié)果。如果我們沒(méi)有使用方面,這些程序?qū)⒃谝粋€(gè)幫助者類中,你可以用它來(lái)輸出跟蹤信息。Trace同時(shí)允許編程人員通過(guò)設(shè)置一個(gè)叫做TRACELEVEL的性質(zhì),來(lái)設(shè)置跟蹤的類型。這里有三個(gè)級(jí)別:沒(méi)有信息,沒(méi)有縮進(jìn)的信息,以及被縮進(jìn)來(lái)表達(dá)被嵌套的調(diào)用的信息。


跟蹤定義了三個(gè)切入點(diǎn);其中的兩個(gè)是具體的,一個(gè)是抽象的,正如圖2所示。抽象的切入點(diǎn)是myClass,它必須通過(guò)可以擴(kuò)展Trace的方面來(lái)提供。切入點(diǎn)的目的是為包含將被建議的連接點(diǎn)的對(duì)象選擇類。這個(gè)讓開(kāi)發(fā)人員決定哪些類將被包括在跟蹤輸出結(jié)果中。

面向方面的編程:它的好處是什么?(圖三)
點(diǎn)擊查看大圖

圖2: 跟蹤方面中的切入點(diǎn)

myConstrUCtor切入點(diǎn)在任何構(gòu)造方法的開(kāi)始,它被myClass選擇為類中的一個(gè)對(duì)象選擇連接點(diǎn)。連接點(diǎn)是實(shí)際的主體。myMethod與myConstructor相似,但它在一個(gè)被選擇的類中選擇任何程序的執(zhí)行。注釋同樣省略了toString程序的執(zhí)行,因?yàn)樗挥迷诹私ㄗh中。

方面提供的建議相當(dāng)簡(jiǎn)單。在每一個(gè)連接點(diǎn)之前被插進(jìn)的建議在連接點(diǎn)之后執(zhí)行。這個(gè)如圖3所示。

面向方面的編程:它的好處是什么?(圖四)
點(diǎn)擊查看大圖

圖3: Trace方面中的建議

為了使用Trace方面,你需要擴(kuò)展它,并為抽象的切入點(diǎn)提供一個(gè)具體的執(zhí)行。圖4所示的是實(shí)例程序TraceMyClasses方面的實(shí)體。切入點(diǎn)只選擇TwoDShape,Circle或Square實(shí)例的對(duì)象。主要程序設(shè)置TRACELEVEL,初始化跟蹤流,以及運(yùn)行實(shí)例的主要程序。

面向方面的編程:它的好處是什么?(圖五)
點(diǎn)擊查看大圖

圖4: 具體的跟蹤方面

圖5所示的是來(lái)自于運(yùn)行實(shí)例部分的輸出結(jié)果。注意:輸出結(jié)果打印關(guān)于每一個(gè)對(duì)象的信息。這是每一個(gè)對(duì)象的toString程序的一部分。既然myClasses切入點(diǎn)公布對(duì)象到建議,那么建議就可以輕易地增加關(guān)于對(duì)象的信息。

面向方面的編程:它的好處是什么?(圖六)
點(diǎn)擊查看大圖

圖5: 跟蹤結(jié)果舉例

使用AOP方法進(jìn)行跟蹤比在需要的地方人工的插入跟蹤代碼有以下幾條好處。

  • 你只需要在一個(gè)(兩個(gè)方面)地方放置你所有代碼需要的用于跟蹤的功能。
  • 插入和刪除跟蹤代碼是很容易的。你可以輕易地從構(gòu)建配置中刪除方面。
  • 在任何你需要的地方跟蹤代碼,即使你增加了新的方法到目標(biāo)類。這可以消除人為的錯(cuò)誤。同時(shí)你知道所有跟蹤代碼被刪除了,并且當(dāng)你從構(gòu)建配置中刪除方面時(shí)不會(huì)忽略任何東西。
  • 你有一個(gè)可重復(fù)使用的方面,它可以被應(yīng)用和升級(jí)。

契約式設(shè)計(jì)或防御性編程

Bertrand Meyer介紹了契約式設(shè)計(jì)的概念。4這個(gè)原理聲稱一個(gè)類的設(shè)計(jì)者和這個(gè)類的使用者,共同分享關(guān)于類的實(shí)現(xiàn)的假設(shè)。合同包括不變量,先決條件和后置條件。契約式設(shè)計(jì)讓類的設(shè)計(jì)者專注于實(shí)現(xiàn)了類的功能性的邏輯,而不用擔(dān)心實(shí)參的有效性。當(dāng)然,前提是合同規(guī)定了實(shí)參的先決條件。契約式設(shè)計(jì)避免了額外的編碼并提高了性能,只要所有的客戶都遵守契約。

當(dāng)你為了廣泛的使用而建立程序庫(kù)時(shí),你可能不能做關(guān)于實(shí)參有效性的假設(shè),并且使用于你的程序中。你需要在繼續(xù)進(jìn)行每一個(gè)程序的邏輯之前檢查實(shí)參。這是一個(gè)防御編程的實(shí)例。你假設(shè)任何可以發(fā)生錯(cuò)誤的東西都可能會(huì)發(fā)生錯(cuò)誤,并且你可以完美地解決它。

讓我們說(shuō)你們正要去使用簡(jiǎn)單狀態(tài)程序并使它為公共所用時(shí)。你想要保證所有坐標(biāo)在第一Euclidean象限——也就是說(shuō),x和y坐標(biāo)是非負(fù)的。這是一個(gè)有效的約束,使得所有點(diǎn)都可以在一個(gè)窗口坐標(biāo)中很好地表示出來(lái),因?yàn)榇蠖鄶?shù)視窗系統(tǒng)都將左上角的點(diǎn)作為(0, 0),并且x坐標(biāo)增加是向右,在你向下移時(shí)y坐標(biāo)增加。為了你的內(nèi)部需要,你要使用契約式設(shè)計(jì)進(jìn)而來(lái)使用類,因?yàn)槟阋呀?jīng)在你的組織中控制開(kāi)發(fā)人員。當(dāng)你將它向外界的客戶公布時(shí),你要檢查實(shí)參并且如果實(shí)參無(wú)效,你要給出一個(gè)例外。方面提供了一個(gè)一流的方法來(lái)實(shí)現(xiàn)它,這正是你要求實(shí)現(xiàn)的東西。

我們將建立一個(gè)方面來(lái)檢查公共程序中的所有實(shí)參。我們要做的第一件事就是構(gòu)造切入點(diǎn)。我們將使用來(lái)自于先前實(shí)例的myClass切入點(diǎn),并增加切入點(diǎn)來(lái)選擇需要檢查實(shí)參的構(gòu)造方法,并且距離程序保證了它沒(méi)有調(diào)用無(wú)效值。圖6所示的是我們需要的一套切入點(diǎn)。注意:第二個(gè)切入點(diǎn)規(guī)定了切入點(diǎn)的目標(biāo)是TwoDShape的一個(gè)實(shí)例。這意味著在這樣一個(gè)對(duì)象中這個(gè)切入點(diǎn)只會(huì)選擇對(duì)距離程序的調(diào)用。

面向方面的編程:它的好處是什么?(圖七)
點(diǎn)擊查看大圖

圖6: 用于檢查實(shí)參的切入點(diǎn)

最后,我們需要合適的通知。為了簡(jiǎn)單,當(dāng)遇到一個(gè)無(wú)效的實(shí)參時(shí),我們要打印一個(gè)信息并將實(shí)際值變?yōu)?,在構(gòu)造方法方面,當(dāng)一個(gè)無(wú)效值被通過(guò)時(shí),忽略對(duì)距離的調(diào)用。圖7所示的是這兩個(gè)通知條目。

面向方面的編程:它的好處是什么?(圖八)
點(diǎn)擊查看大圖

圖7: 實(shí)參檢查建議

當(dāng)我們?cè)噲D執(zhí)行下列語(yǔ)句時(shí):

Circle c3 = new Circle(3.0,2.0,-2.0);

c1.distance(null>);

在我們的程序中,我們得到如下的輸出結(jié)果:

Negative argument encountered at: execution(tracing.Circle(double, double, 	double)) All arguments changed to 0.0Null value given to distance at: 	call(double tracing.Circle.distance(TwoDShape))


我們可以通過(guò)顯示準(zhǔn)確的行數(shù)值和原始文件名稱來(lái)做更多的有關(guān)錯(cuò)誤信息的工作,但是這個(gè)實(shí)例顯示的是基本的技術(shù)。

在一個(gè)大的項(xiàng)目中,你有很多類并暴露少數(shù)的一些接口,你可以使用用于方面的一個(gè)單獨(dú)的目錄來(lái)組織你的編碼,進(jìn)而實(shí)現(xiàn)實(shí)參的檢查。我可以想象組織方面的幾種方法,它們可以被很容易地識(shí)別和維護(hù)。當(dāng)你為內(nèi)部使用而構(gòu)建系統(tǒng)時(shí),你將使用一個(gè)內(nèi)部的構(gòu)建配置,并且當(dāng)你為外部使用而構(gòu)建它時(shí),你將使用一個(gè)包含方面的配置。Eclipse AJDT使得新構(gòu)建配置的創(chuàng)建變得簡(jiǎn)單。

方面和設(shè)計(jì)模式

對(duì)于好的編程來(lái)說(shuō),設(shè)計(jì)模式已經(jīng)變成了 常用的方式。AOP可以給我們一種改進(jìn)已經(jīng)存在的模式和發(fā)現(xiàn)新模式的方法。實(shí)際上,橫切關(guān)注點(diǎn)代碼的注入,就是一種類型的模式。當(dāng)前,一些研究人員正在評(píng)價(jià)使用AOP方法的設(shè)計(jì)模式的實(shí)現(xiàn)。英國(guó)哥倫比亞大學(xué)的Jan Hannemann一直在研究這個(gè)主題來(lái)作為他的哲學(xué)博士研究的一部分。他的主頁(yè),還有實(shí)現(xiàn)“四人幫”模式的代碼下載位于:http://www.cs.ubc.ca/~jan/AODPs/上。5同樣,Nicholas Lesiecki為IBM developerWorks寫(xiě)了關(guān)于方面和設(shè)計(jì)模式的文章。6查閱他的文章能得到比我這里提供的更詳細(xì)的討論。

讓我們來(lái)看一個(gè)非常簡(jiǎn)單的關(guān)于如何實(shí)現(xiàn)一個(gè)標(biāo)準(zhǔn)設(shè)計(jì)模式的實(shí)例,它就是用AspectJ語(yǔ)言寫(xiě)的Adapter模式。

圖8顯示的是Adapter模式的一個(gè)Unified Modeling Language(UML)圖。在這個(gè)模式中,客戶需要一個(gè)服務(wù)并要為它設(shè)置一個(gè)請(qǐng)求。可能有很多服務(wù)的提供者,并且他們中的每一個(gè)可能對(duì)于服務(wù)有一個(gè)不同的名稱,或者另外一些非標(biāo)準(zhǔn)要求是服務(wù)請(qǐng)求者所必須遵守的。好的面向?qū)ο蟮脑O(shè)計(jì)建議我們要將服務(wù)請(qǐng)求整合到一個(gè)目標(biāo)接口中,在這個(gè)接口上編程,并建立一個(gè)適配器。要作為一個(gè)媒介在客戶和服務(wù)之間工作(圖表中的Adaptee),這就是必需的。

面向方面的編程:它的好處是什么?(圖九)

圖8: 適配器模式

適配器的方法似乎是十分合理的。但如果你有一個(gè)傳統(tǒng)的系統(tǒng),但是它不是使用像適配器這樣的模式設(shè)計(jì)的。最初的設(shè)計(jì)人員沒(méi)有意識(shí)到將來(lái)變化的可能性。同時(shí),對(duì)于服務(wù)的調(diào)用可能貫穿于整個(gè)應(yīng)用程序。你將如何實(shí)現(xiàn)一個(gè)新的,改進(jìn)的服務(wù)?沒(méi)有方面,你將可能重新生成系統(tǒng),將每一個(gè)調(diào)用定位于服務(wù),設(shè)計(jì)一個(gè)適配器,并執(zhí)行Adapter模式。這取決于舊服務(wù)被調(diào)用地點(diǎn)的數(shù)量,這個(gè)可能是一個(gè)十分使人畏懼的任務(wù)。重新改進(jìn)編碼是一個(gè)有價(jià)值的目標(biāo);然而,我們不會(huì)總那么奢侈。我們必須在時(shí)間的限制之下盡最大努力來(lái)滿足于改進(jìn)編碼。

在這種情況下,我們可以建立Adapter模式的一個(gè)版本來(lái)解決即時(shí)的問(wèn)題和為一個(gè)更有組織的,更好設(shè)計(jì)的系統(tǒng)提供一個(gè)步驟。

使用一個(gè)服務(wù)的簡(jiǎn)單客戶顯示在圖9中。服務(wù)將返回從一個(gè)點(diǎn)到當(dāng)前Client對(duì)象的距離。

面向方面的編程:它的好處是什么?(圖十)
點(diǎn)擊查看大圖

圖9: 簡(jiǎn)單客戶

對(duì)于服務(wù)的接口描述了一個(gè)簡(jiǎn)單的方法:

double useService(Client clt, double x, double y);

新改進(jìn)的服務(wù)提供者有一個(gè)使用不同參數(shù)命名的方法,它的接口是:

double useNewService(double x0, double x1, double y0, double y1);

我們要建立一個(gè)適配器,它將位于舊服務(wù)的調(diào)用之間,為新服務(wù)得到合適的實(shí)參,調(diào)用新服務(wù),然后將結(jié)果返回到客戶——不必改變客戶。如圖10所示:

面向方面的編程:它的好處是什么?(圖十)
點(diǎn)擊查看大圖

圖10: 調(diào)用新服務(wù)的適配器方面

注意方面是多么簡(jiǎn)單。我們說(shuō)明一個(gè)切入點(diǎn)來(lái)識(shí)別對(duì)原始服務(wù)的useService方法的每一個(gè)調(diào)用。然后在從調(diào)用客戶中抽取需要的信息之后,我們使用around通知,用新服務(wù)的一個(gè)調(diào)用來(lái)替代那個(gè)調(diào)用。

這個(gè)方法有不少好處和優(yōu)勢(shì)。第一,我們可以用一個(gè)簡(jiǎn)單的方面來(lái)改變貫穿于應(yīng)用程序中的所有編碼。我們還將業(yè)務(wù)整合成在一個(gè)地點(diǎn)調(diào)用服務(wù)。現(xiàn)在,如果一個(gè)新服務(wù)被一個(gè)更新的服務(wù)所替代,我們只需要改變這個(gè)方面的編碼。這些對(duì)于一個(gè)更加穩(wěn)固的系統(tǒng)當(dāng)然是有好處的。

主要優(yōu)勢(shì)是舊客戶仍然在系統(tǒng)中,即使它不被使用。如果我們有時(shí)間(我們似乎從來(lái)都沒(méi)有),我們將最有可能返回并重新生成系統(tǒng),來(lái)使用一個(gè)更加標(biāo)準(zhǔn)的Adapter模式。最起碼,我們可以使用編碼修改原始服務(wù)的useService程序來(lái)返回一個(gè)如0.0的啞值,因?yàn)樗鼜膩?lái)不被調(diào)用。

工業(yè)上的應(yīng)用

到目前為止,我們已經(jīng)了解了一個(gè)十分有限但卻有用的應(yīng)用AOP的實(shí)例。我們可能要問(wèn)技術(shù)上的提高比例會(huì)怎么樣。有一個(gè)很明顯的例子,我將在這里指出并簡(jiǎn)要描述一下。更加詳細(xì)的內(nèi)容請(qǐng)參見(jiàn)這個(gè)專欄的另一篇文章。

你們中的一些人可能熟悉 Spring 框架。7 Spring 框架是一個(gè)應(yīng)用程序框架,它支持開(kāi)發(fā)企業(yè)應(yīng)用程序。它提供了一個(gè)分層的J2EE框架來(lái)建立復(fù)雜的企業(yè)應(yīng)用程序。用于Spring的基礎(chǔ)技術(shù)之一是AOP。Spring已經(jīng)開(kāi)發(fā)了它自己的面向方面的實(shí)現(xiàn),它允許交叉的邏輯在運(yùn)行時(shí)刻被應(yīng)用到編碼中,而不用通過(guò)一個(gè)像AspectJ的編譯程序來(lái)實(shí)現(xiàn)。然而,它提了供集成特性讓你容易地將AspectJ和Spring 框架結(jié)合在一起。

Spring 當(dāng)前正被很多組織使用來(lái)建立更好的企業(yè)應(yīng)用程序,它們被很好地設(shè)計(jì)以及需要很少的開(kāi)發(fā)時(shí)間。據(jù)我估計(jì),它是我們?nèi)绾螌⒎矫鎽?yīng)用于真實(shí)問(wèn)題的一個(gè)極好的例子。8


我們將從這里去向何方?

在我看來(lái),AOP將來(lái)將變成軟件開(kāi)發(fā)人員的工具包的一部分。我不知道是否我們將會(huì)達(dá)到在構(gòu)建系統(tǒng)時(shí)將AOP作為主要設(shè)計(jì)機(jī)制的地步,但是我認(rèn)為我們將會(huì)找到使用方面來(lái)增強(qiáng)我們的面向?qū)ο笤O(shè)計(jì)的方法。需要做許多事情來(lái)幫助加速這個(gè)過(guò)程。

第一,我們需要一些穩(wěn)定的標(biāo)準(zhǔn)AOP實(shí)現(xiàn)。這個(gè)過(guò)程已經(jīng)開(kāi)始了。AspectJ的版本5是兩種最流行的Java AOP語(yǔ)言,AspectJ和AspectWerkz的合并。在如C++的其它語(yǔ)言中的標(biāo)準(zhǔn)實(shí)現(xiàn)也會(huì)有幫助。

第二,我們需要確立一些能夠使我們可以推斷將AOP應(yīng)用到特定系統(tǒng)的有效性的度量。例如,當(dāng)我們使用AOP重新實(shí)現(xiàn)設(shè)計(jì)模式時(shí),它們要比標(biāo)準(zhǔn)的面向?qū)ο竽J胶靡恍﹩幔吭谀男┑胤剿鼈兏枚男┑胤讲皇悄兀课覀儽仨毑扇∈裁创胧﹣?lái)得到信息和開(kāi)發(fā)這些度量呢?天真方法的日子——我們相信如果一個(gè)系統(tǒng)是面向?qū)ο蟮模ɑ蜻x擇你的技術(shù)),那么它是好的——結(jié)束了。我們需要在經(jīng)驗(yàn)數(shù)據(jù)的基礎(chǔ)之上作出設(shè)計(jì)和實(shí)現(xiàn)的決定。9

第三,我們需要繼續(xù)開(kāi)發(fā)支持AOP的工具。我很高興地說(shuō),Eclipse的新AJDT是一套很好的工具。這些工具繼續(xù)改進(jìn)對(duì)我們的支持能力,我們需要高效地并有效率地使用方面。工具也必須支持一個(gè)處理方面的新過(guò)程。

方面仍然呆在這里。它們?nèi)匀粵](méi)有成為主流應(yīng)用程序一部分的一個(gè)方法,但它們每一天都變得更加接近。我推薦你多關(guān)注它們并超越這條曲線。

注釋

1 關(guān)于AspectC++的信息可見(jiàn)于http://www.aspectc.org/以及關(guān)于AspectL的信息可參考http://common-lisp.net/project/closer/aspectl.Html

2Rational Edge的2004年2月版:http://www.ibm.com/developerworks/rational/library/2782.html

3 我正在使用的定義取自于優(yōu)秀的AspectJ Programming Guidehttp://www.eclipse.org/aspectj/doc/released/progguide/index.html

4 見(jiàn)Bertrand Meyer的,Object-Oriented Software Construction,第2版。Prentice Hall 1998。

5 四人幫包括 Erich Gamma,Richard Helm,Ralph Johnson和John Vlissides,他們編寫(xiě)了Design Patterns一書(shū)。這是在設(shè)計(jì)模式相關(guān)書(shū)籍中具有重大影響的書(shū)。

6 見(jiàn)http://www-128.ibm.com/developerworks/java/library/j-aopwork5/

7 見(jiàn)http://www.springframework.org/

8 為了得到更多關(guān)于Spring Framework的信息,我推薦此書(shū),Pro Spring,Rob Harrop和Jan Machacek,Apress 2005。

9 如果有讀者正在使用AOP并想與我討論他們的經(jīng)驗(yàn),以及可能為我正在研究的項(xiàng)目提供一些信息,請(qǐng)聯(lián)系我。


面向方面的編程:它的好處是什么?(圖十二)
面向方面的編程:它的好處是什么?(圖十三)面向方面的編程:它的好處是什么?(圖十三)


參考資料

  • 您可以參閱本文在 developerWorks 全球站點(diǎn)上的 英文原文

面向方面的編程:它的好處是什么?(圖十二)
面向方面的編程:它的好處是什么?(圖十三)面向方面的編程:它的好處是什么?(圖十三)


關(guān)于作者

面向方面的編程:它的好處是什么?(圖十三)

面向方面的編程:它的好處是什么?(圖十四)

面向方面的編程:它的好處是什么?(圖十三)


Gary Pollice是位于伍斯特的伍斯特工學(xué)院的一個(gè)實(shí)踐方面的專家,他獲得了碩士學(xué)位。他教授軟件工程,設(shè)計(jì),測(cè)試,和其它計(jì)算機(jī)科學(xué)方面的課程,并且還指導(dǎo)做項(xiàng)目。在進(jìn)入學(xué)術(shù)領(lǐng)域之前,他花費(fèi)了多于三十五年的時(shí)間來(lái)開(kāi)發(fā)各種類型的軟件,從商業(yè)應(yīng)用軟件到編譯器和工具。他的最后一份行業(yè)工作是做IBM Rational軟件,在那里他以"RUP 倔老頭;著稱,并且他是Rational Suite團(tuán)隊(duì)最初的成員之一。他是Software Development for Small Teams:A RUP-Centric Approach,的主要作者,那本書(shū)是由Addison-Wesley于2004年出版的。他取得了數(shù)學(xué)專業(yè)的學(xué)士學(xué)位和計(jì)算機(jī)科學(xué)專業(yè)的碩士學(xué)位。

(出處:http://m.survivalescaperooms.com)



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 桐城市| 临桂县| 栾川县| 永定县| 申扎县| 玉林市| 兰西县| 禹城市| 四平市| 南溪县| 昌宁县| 湄潭县| 昌都县| 盐津县| 息烽县| 遵义市| 芮城县| 融水| 师宗县| 香河县| 仁化县| 宁乡县| 余江县| 新和县| 阜新| 佳木斯市| 泾源县| 镇巴县| 沭阳县| 马关县| 通海县| 海丰县| 吉水县| 酉阳| 天门市| 友谊县| 屏边| 涿州市| 铜梁县| 古交市| 津市市|