posts - 188,comments - 176,trackbacks - 0

          AOP 面向方編程(Aspect Oriented Programming)


          在程序員的圈子里面,有一群人數(shù)很少但態(tài)度卻十分堅(jiān)定的開(kāi)發(fā)人員。當(dāng)他們宣稱,真正的程序員會(huì)編寫自己的驅(qū)動(dòng)程序。

          因?yàn)槿绻贿@樣,那么采用任何其他的方式都將會(huì)是瘋狂和缺乏技術(shù)理性的,并且還會(huì)承擔(dān)一些不必要的風(fēng)險(xiǎn)。 
           

          在軟件行業(yè)的另一端,人們卻在為類似于面向方面編程(Aspect Oriented Programming即AOP)的技術(shù)歡呼雀躍。他們以非常嚴(yán)肅的態(tài)度說(shuō)道,真正的程序員希望盡可能的保持多產(chǎn),這樣才能穩(wěn)住自己的飯碗。相對(duì)于對(duì)自己工作方式三天兩頭的革新,這些程序員們更希望能開(kāi)發(fā)更多的程序和更為有效的對(duì)代碼進(jìn)行重用。

           

          AOP是從什么地方來(lái)的?

           

          多年以來(lái),面向?qū)ο螅∣O)時(shí)編程技術(shù)革新的先鋒,但是,即使是針對(duì)不同功能編寫分離代碼片段的面向?qū)ο笏枷胍矡o(wú)法將程序開(kāi)發(fā)人員從一遍遍重寫應(yīng)用程序多個(gè)部分的煩惱中解脫出來(lái)。來(lái)自Xerox Palo Alto Research Lab(即PARC)的研究人員早在1990年開(kāi)始就對(duì)面向?qū)ο笏枷氲木窒扌赃M(jìn)行了分析。他們研究出了一種新的編程思想,借助這一思想或許可以通過(guò)減少代碼重復(fù)模塊從而幫助開(kāi)發(fā)人員提高工作效率。與此同時(shí),美國(guó)Northeastern University的博士生Cristina Lopes和其同事也開(kāi)始了類似的思考。最終,美國(guó)國(guó)防先進(jìn)技術(shù)研究計(jì)劃署(Defense Advanced Research Projects Agency即DARPA)注意到了這項(xiàng)工作,并提供了科研經(jīng)費(fèi),鼓勵(lì)將二者的工作成果結(jié)合起來(lái)。由此,AspectJ誕生了。它作為Java語(yǔ)言的一套擴(kuò)展系統(tǒng)使得當(dāng)今的程序員們現(xiàn)在就可以體驗(yàn)AOP的思想。 Avanade公司的高級(jí)方案構(gòu)架師Adam Magee認(rèn)為,AOP的核心思想就是“將應(yīng)用程序中的商業(yè)邏輯同對(duì)其提供支持的通用服務(wù)進(jìn)行分離。”該公司是一架專注于微軟技術(shù)的集成商。 AOP的創(chuàng)業(yè)者們把這些通用服務(wù)稱之為“橫切關(guān)注點(diǎn)(crosscutting concerns)”,因?yàn)檫@些服務(wù)所提供的功能將橫貫應(yīng)用程序的多個(gè)對(duì)象需求。將AOP應(yīng)用到多個(gè)項(xiàng)目中的Magee也認(rèn)為,“開(kāi)發(fā)人員可以對(duì)橫切關(guān)注點(diǎn)進(jìn)行檢測(cè)、審計(jì)、登陸、安全性檢查或異常處理。編寫這些服務(wù)的接口代碼將會(huì)非常耗費(fèi)時(shí)間,并且開(kāi)發(fā)人員要學(xué)會(huì)如何這樣做本身就已很長(zhǎng)時(shí)間。”“這些事情將開(kāi)發(fā)人員的精力從解決企業(yè)問(wèn)題上面轉(zhuǎn)移開(kāi)來(lái)——而后者才是價(jià)值之所在。這些麻煩將他們引到了鉆研復(fù)雜操作系統(tǒng)的艱難道路上。

           

          優(yōu)勢(shì)

           

          AOP的目標(biāo)就是要避免這些問(wèn)題。它將編寫橫切關(guān)注點(diǎn)代碼的工作進(jìn)行分離——也就是所謂的“方面(aspects)”——把他們從組織為商業(yè)邏輯的對(duì)象的編寫工作中分離出來(lái),然后提供相應(yīng)的功能構(gòu)架。這樣一來(lái),應(yīng)用程序就可以使用各個(gè)方面所提供的功能而無(wú)需重新編譯或重新編寫任何代碼。

          在一個(gè)應(yīng)用程序有很多對(duì)象都需要相同橫切關(guān)注點(diǎn),這一技術(shù)即著眼于通過(guò)幫助開(kāi)發(fā)人員創(chuàng)建所需要的橫切關(guān)注點(diǎn)定義來(lái)為開(kāi)發(fā)人員節(jié)省時(shí)間。如果要對(duì)每一個(gè)對(duì)象編寫一個(gè)登錄系統(tǒng)——AOP中所謂的“散射(scattering)”實(shí)踐——AOP的先行者們建議在項(xiàng)目的設(shè)計(jì)階段,開(kāi)發(fā)人員就應(yīng)當(dāng)定義應(yīng)用程序中每個(gè)對(duì)象的登錄需求,然后創(chuàng)建一個(gè)單獨(dú)的登錄工具執(zhí)行該應(yīng)用程序中任何所需的登錄操作。 AOP的支持者們認(rèn)為,這樣的方式有幾個(gè)優(yōu)點(diǎn)。第一,在定義應(yīng)用程序?qū)δ撤N服務(wù)(例如登錄)的所有需求的時(shí)候,所花費(fèi)的精力將使得該服務(wù)能夠被更好的定義,更好的被編寫代碼,并獲得更多的功能。這種方式還能夠處理在代碼涉及到多個(gè)功能的時(shí)候所出現(xiàn)的問(wèn)題,例如改變某一個(gè)功能可能會(huì)影響到其它的功能,在AOP中把這樣的麻煩稱之為“糾結(jié)(tangling)”。

           

          其次,在創(chuàng)建離散方面所進(jìn)行的分析將有助于為開(kāi)發(fā)團(tuán)隊(duì)指定一位精于該項(xiàng)工作的專家,由此負(fù)責(zé)這項(xiàng)工作的最佳人選將可以有效利用自己的相關(guān)技能和經(jīng)驗(yàn)。第三個(gè)好處則是持久性的。標(biāo)準(zhǔn)的以對(duì)象為導(dǎo)向的項(xiàng)目開(kāi)發(fā)中,不同的開(kāi)發(fā)人員通常會(huì)為某項(xiàng)服務(wù)編寫相同的代碼,例如登錄。隨后他們會(huì)在自己的實(shí)施中進(jìn)開(kāi)發(fā)各自的登錄服務(wù)以滿足不同單個(gè)對(duì)象的需求。而通過(guò)創(chuàng)建一段單獨(dú)的代碼片段,AOP提供了解決這一問(wèn)題的持久簡(jiǎn)單的方案,這一方案強(qiáng)調(diào)了未來(lái)功能的重用性和易維護(hù)性:不需要在整個(gè)應(yīng)用程序中一遍遍重新編寫登錄代碼,AOP使得僅僅編寫登錄方面(logging aspect)成為可能,并且可以在這之上為整個(gè)應(yīng)用程序提供新的功能。所有的這些好處都是的需要編寫的代碼量大大縮減,由此節(jié)省了時(shí)間,控制了開(kāi)發(fā)成本,并且能將資源投入到比編寫登錄程序更為有價(jià)值的活動(dòng)中去。
           

          AOP的工作原理

           

          IBM的客戶經(jīng)理Brad Kasell說(shuō)道:“傳統(tǒng)上當(dāng)你開(kāi)始開(kāi)發(fā)應(yīng)用程序的時(shí)候,你從定義商業(yè)功能開(kāi)始入手,即哪些應(yīng)用程序需要完成的所有功能。”

          “但總是項(xiàng)目涉及的所有開(kāi)發(fā)人員都沒(méi)有編寫規(guī)范,因此開(kāi)發(fā)人員們最終將會(huì)發(fā)現(xiàn)一個(gè)應(yīng)用程序在不同的地方需要不同類型的登錄服務(wù),因此需要在不同的時(shí)候一遍遍的編寫他們。”“AOP則意味開(kāi)發(fā)人員最終能夠獲得這樣的機(jī)會(huì),即提出一個(gè)問(wèn)題:‘如何才能使得你只需編寫一次就可以讓這段代碼服務(wù)于整個(gè)應(yīng)用程序?’” 因此,AOP項(xiàng)目的起點(diǎn)在于開(kāi)發(fā)人員確認(rèn)所有對(duì)象都會(huì)需要的功能。隨著對(duì)象的進(jìn)一步開(kāi)發(fā),開(kāi)發(fā)人員將能夠找出每個(gè)對(duì)象都需要的一個(gè)普遍的功能,即“橫切點(diǎn)”。這時(shí),不同于在對(duì)象內(nèi)部編寫登錄服務(wù),開(kāi)發(fā)人員將編寫一個(gè)“切點(diǎn)(point cut)”,這一“切點(diǎn)”將“織入(weaves)”到對(duì)象的方面(aspect)中。這樣的方式時(shí)的應(yīng)用程序?qū)⒂幸恍?duì)象和一個(gè)單獨(dú)的代碼池所組成,在對(duì)象調(diào)用所需的服務(wù)視,這一代碼池將提供通用的服務(wù)。


          如何進(jìn)行編程


          要把AOP引入到工作中來(lái)是比較簡(jiǎn)單的,現(xiàn)在市面上已經(jīng)有了很多種工具。在這一領(lǐng)域,開(kāi)放源代碼軟件是主打。最初由PARC設(shè)計(jì)的AspectJ在2002年已經(jīng)被轉(zhuǎn)手給Eclipse Foundation,它現(xiàn)在是最為流行的AOP工具。 AspectJ將其自身標(biāo)榜為“同Java編程語(yǔ)言無(wú)縫集成的面向方面擴(kuò)展”,它提供了新的語(yǔ)法來(lái)定義、創(chuàng)建和使用方面。AspectJ可以被引入到多個(gè)編程工具中。最為常見(jiàn)的AOP工具是AspectWerkz,這是兩位BEA員工所開(kāi)發(fā)的,這一軟件在松散的GNU公共許可證下發(fā)布。

          2005年1月,AspectJ和AspectWerkz達(dá)成協(xié)議,同意將二者的成果綜合到一起,取其精華創(chuàng)建一個(gè)單一的工具。像Jboss這樣的商用軟件制造商同樣提供AOP產(chǎn)品。這一企業(yè)所開(kāi)發(fā)的JBoss AOP已經(jīng)在2004年晚期發(fā)布,同樣提供了面向方面的框架和一個(gè)方面庫(kù)。在.NET的陣營(yíng)中,事情的進(jìn)展則要緩慢一些。2005年1月,微軟發(fā)布的Enterprise Library提供了7種不同的“應(yīng)用程序塊(

          application blocks)”。Avanade的Magee認(rèn)為這些組件可以被認(rèn)為是就方面,使用Visual Studio .Net. Loom中的屬性進(jìn)行訪問(wèn)則是另一個(gè)回事。但這些工具所采用的方法決不是統(tǒng)一的。AspectJ是對(duì)Java的擴(kuò)展。反對(duì)陣營(yíng)認(rèn)為,對(duì)語(yǔ)言進(jìn)行擴(kuò)展存在與之俱來(lái)的麻煩,AOP應(yīng)當(dāng)通過(guò)使用XML元數(shù)據(jù)來(lái)進(jìn)行部署,從而定義橫切點(diǎn)和所調(diào)用的對(duì)象。開(kāi)發(fā)工具以及什么地方可以找到這些工具。

           

          有限制條件么?


          這些方法上的不一致和實(shí)際應(yīng)用情況使得沒(méi)有主流IDE制造商將AOP作為產(chǎn)品工具中的“正式”部分。這也讓很多人感覺(jué)到盡管AOP的核心思想非常有用,但它仍然沒(méi)有成熟。“我相信AOP還不足以打入主流編程領(lǐng)域,因此很多人并不能確定如何才能將這一技術(shù)引入到日常的工作中去,” BEA技術(shù)辦公室的技術(shù)經(jīng)理Michael Smith說(shuō)道。“這是在主流和技術(shù)前沿之間的一塊中間地帶。” 這一理念正存在于這一中間地帶中,其真正的潛能在某種程度上仍然是未知的。開(kāi)發(fā)顧問(wèn)ThoughtWorks的咨詢師John Tirsen表示,它已經(jīng)在多個(gè)項(xiàng)目中使用了AOP。但模塊化服務(wù)(modularising

          services)的思想并非是全新的。“以前就有CORBA攔截機(jī)做過(guò)這樣的事情”,他說(shuō)道。“更具爭(zhēng)議的問(wèn)題在于它是否能夠用到橫切商業(yè)邏輯(cross-cutting business logic)上去。”

          BEA的Smith同樣認(rèn)可這一未被觸及的潛力。“沿著技術(shù)發(fā)展的道路我們可以認(rèn)為或許你希望借助AOP來(lái)對(duì)中間件的運(yùn)行方式進(jìn)行調(diào)整,或許希望根據(jù)不同的商業(yè)規(guī)則在不同時(shí)間為不同的功能創(chuàng)建中間件層。盡管這種類型的工作聽(tīng)起來(lái)很刺激,但沒(méi)有人能夠?yàn)檫@一技術(shù)的發(fā)布實(shí)施和廣泛采用提出一份時(shí)間表。 AOP的精靈正躍躍欲試,即將從瓶子里面跑出來(lái)。

          “6個(gè)月以前,沒(méi)有人問(wèn)我AOP,”Smith說(shuō)道。“現(xiàn)在你可以在AOP討論會(huì)之中看到聽(tīng)眾在我甚至沒(méi)有提到這一技術(shù)的情況下問(wèn)到這一問(wèn)題。無(wú)論你是否希望編寫自己的設(shè)備驅(qū)動(dòng)程序,這都是一個(gè)明顯的信號(hào),即AOP在將來(lái)的一段時(shí)間中值得人們?nèi)パ芯俊?/p>

           

          轉(zhuǎn)http://kekesoft.spaces.live.com/blog/

          posted on 2007-05-24 11:35 cheng 閱讀(381) 評(píng)論(0)  編輯  收藏 所屬分類: Spring

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 白城市| 仁化县| 夏邑县| 陕西省| 都江堰市| 澄迈县| 苗栗县| 荣成市| 临洮县| 连山| 淳安县| 黄山市| 呼伦贝尔市| 乌拉特后旗| 城固县| 阳东县| 崇阳县| 二连浩特市| 泸西县| 时尚| 玛纳斯县| 肃北| 吴旗县| 武宁县| 天峻县| 县级市| 长海县| 平武县| 嘉定区| 大新县| 安平县| 广东省| 呼图壁县| 鄂尔多斯市| 阳东县| 永善县| 呈贡县| 视频| 乌兰察布市| 河源市| 会东县|