摘 要: 對(duì)于MDA橫切于核心業(yè)務(wù)邏輯的關(guān)注點(diǎn)對(duì)封裝的破壞的問(wèn)題,本文給出把AOP引入到MDA的擴(kuò)展策略和主要方法,并對(duì)不同的擴(kuò)展策略進(jìn)行了比較。
關(guān)鍵詞: 模型驅(qū)動(dòng)架構(gòu); 面向方面; 擴(kuò)展; 元模型; 統(tǒng)一建模語(yǔ)言
MDA是一種以模型為中心的軟件開(kāi)發(fā)新方法[1,2]。但是,MDA仍然不能有效地處理橫切“關(guān)注點(diǎn)”問(wèn)題。
近來(lái)MDA和AOSD兩者的融合和相互支持已成為具有重要的理論意義和實(shí)用價(jià)值的研究課題[1]。其中的主要研究方向之一是:采用主流開(kāi)發(fā)框架MDA,在MDA的建模過(guò)程中引入AOP 的概念和思想,建立通用的具有面向方面特性的PIM。
如何把面向方面的概念和思想引入到MDA中,可以采取多種不同的擴(kuò)展策略。
1 MDA引入AOP的擴(kuò)展策略
在MDA的建模過(guò)程中引入面向方面的思想和概念,其中最重要的是如何表示面向方面AOP的概念和思想以及表達(dá)方式。
下面給出兩種有代表性的擴(kuò)展策略及其實(shí)現(xiàn)方法:基于MOF的擴(kuò)展和基于UML 2.0 Profile的擴(kuò)展,這是當(dāng)前的主流。
1.1 基于MOF的擴(kuò)展策略
在MDA中,MOF位于MOF四層模型的最高層。MOF體系是開(kāi)放的,因而可以對(duì)它添加新的描述UML的元類型,以擴(kuò)展新的功能和應(yīng)用。圖1給出了這種擴(kuò)展的示意。 但是,這種擴(kuò)展策略要做的工作較多也較為困難,必須對(duì)UML的核心語(yǔ)義十分熟悉。目前所做的研究還很少?;贛OF的AOP擴(kuò)展也稱為“重量級(jí)”的擴(kuò)展。參考文獻(xiàn)[2]比較全面地介紹了一種通用的支持AOP 的MOF 2.0元模型。
MOF擴(kuò)展策略以MDA作為不同的AOP擴(kuò)充方案之間的集成元素,自動(dòng)或半自動(dòng)地把在某開(kāi)發(fā)階段建立的模型轉(zhuǎn)換成下一階段的模型,直到最終實(shí)現(xiàn)為止。首先建立AO術(shù)語(yǔ)的被廣泛接受的本體,基于這些本體的共同元素和它們之間的關(guān)系建立通用的支持AOP的MOF元模型。其擴(kuò)展方法和過(guò)程可描述如下:
第一步是確定出各種不同的AOP擴(kuò)充方案所共享的概念,并根據(jù)概念的目的把它們分組成包,以提高可理解性。然后,建立包與包之間的關(guān)系。由此,可以建立三個(gè)主要的包:(1)Entities包,描述分解單元和它們之間的關(guān)系的實(shí)體;(2)JoinpointModel包,包含允許注入行為對(duì)應(yīng)用程序的執(zhí)行進(jìn)行干預(yù)的關(guān)注點(diǎn)的包;(3)CompositionRules包,它有兩個(gè)子包,SymmetricRules描述對(duì)稱規(guī)則, AsymmetricRules描述不對(duì)稱規(guī)則。這三個(gè)包可以從UML 2.0元模型的內(nèi)核和CommomBehaviors包的元素進(jìn)行特化。
實(shí)體:UML2.0 BehaviouredClassifiers的特化。
JoinpointModel:連接點(diǎn)是對(duì)應(yīng)用程序的運(yùn)行進(jìn)行干預(yù)以執(zhí)行一個(gè)方面行為(AspectJ中的advice)。所以,每個(gè)實(shí)體由一個(gè)可以隱式附上方面行為的Hook集組成。在UML2.0中,這些Hooks是基本單元的Behaviors。
CompositionRules:SymmetricRules用以通過(guò)若干實(shí)體(也稱為子模塊)的組合產(chǎn)生一個(gè)更大的實(shí)體。AsymmetricRules用于說(shuō)明任何在連接點(diǎn)(hooks)上應(yīng)用aspects。
這樣建立的通用元模型可以精細(xì)化為更加具體的模型,例如CBSD(Component-Based Software Development)與AOSD的集成模型CAM、Theme/UML模型。CAM與Theme/UML模型之間還可以實(shí)現(xiàn)相互轉(zhuǎn)換。
1.2 基于UML 2.0 Profile擴(kuò)展策略
這種擴(kuò)展策略的基礎(chǔ)是: UML2.0 Profile提供了很好的擴(kuò)展機(jī)制。圖2是其示意圖。
1.2.1 擴(kuò)展方法和擴(kuò)展機(jī)制
UML2.0是建模語(yǔ)言的核心,其本身就是可擴(kuò)展的?;赨ML Profile的擴(kuò)展策略實(shí)際上是一種 基于UML 2.0的擴(kuò)展?;赨ML 2.0的擴(kuò)展策略有兩種方法:
(1) First-Class擴(kuò)展。它允許增加、修改具有相應(yīng)功能的元類就能使得UML 2.0具有描述AOP特性的建模能力。這種擴(kuò)展增加了UML 2.0語(yǔ)言的復(fù)雜性和應(yīng)用建模的困難性,還涉及到 MOF的修改,對(duì)已有的標(biāo)準(zhǔn)化造成了破壞,因而其缺點(diǎn)是明顯的。
(2) Profiles方式。它是一種通過(guò)建立面向方面PIM的PIM-AOP Profile的方式。Profiles擴(kuò)展無(wú)需改動(dòng)已有的元模型,也不改變現(xiàn)有的語(yǔ)法和語(yǔ)義,而是通過(guò)UML Profiles的構(gòu)造型、標(biāo)記值和約束等擴(kuò)展機(jī)制來(lái)擴(kuò)展 UML 2.0的建模能力。這種方法易于理解,不破壞現(xiàn)有標(biāo)準(zhǔn),還可以充分利用現(xiàn)有的相關(guān)工具。
因此,通常選擇后一種擴(kuò)展方法。它利用了UML 2.0 Profiles提供的三種擴(kuò)展機(jī)制:
(1) 構(gòu)造型
該機(jī)制利用一個(gè)已存在的模型元素來(lái)定義一種新的模型元素。新模型元素是已有模型元素的子類,通過(guò)泛化繼承已有的元模型類,并添加額外的語(yǔ)義來(lái)實(shí)現(xiàn)擴(kuò)展。
(2) 標(biāo)記值
標(biāo)記值用于指定模型元素的性質(zhì),由標(biāo)記字符串和值字符串組成,是對(duì)特性的顯式定義。任何模型元素都可以應(yīng)用標(biāo)記值來(lái)增加新的語(yǔ)義。標(biāo)記值也可用來(lái)提供附加信息以有效提高模型的質(zhì)量。
(3) 約束
約束用于對(duì)模型元素提供語(yǔ)義條件或限制。它用大括弧內(nèi)的字符串表達(dá)式來(lái)表示。約束可應(yīng)用于一個(gè)或多個(gè)元素上,可以附加在依賴、注釋等元素上以表示約束和關(guān)系。因此可以用來(lái)對(duì)模型元素進(jìn)行語(yǔ)義上的限制。
1.2.2 Profiles擴(kuò)展方式實(shí)例
(1) 方面aspcet的表示。方面是AOP最主要的概念,在建模過(guò)程中應(yīng)該把它作為一個(gè)獨(dú)立的、封閉的并且可以擁有自定義的結(jié)構(gòu)成員的實(shí)體來(lái)定義。Aspect可以通過(guò)UML Profiles的構(gòu)造型的擴(kuò)展來(lái)實(shí)現(xiàn)。如圖3所示。
在定義Aspect構(gòu)造型時(shí)需要:(1)指出新定義的構(gòu)造型是基于哪個(gè)元素的;(2)改變或增加新的語(yǔ)義。
標(biāo)記isPrivileged用于決定aspect是否能訪問(wèn)被其橫切的類的私有屬性。
標(biāo)記aspectInstantiationType用來(lái)決定aspect實(shí)例化的方式。它可定義基于連接點(diǎn)中對(duì)象實(shí)例化的、基于連接點(diǎn)中的控制流的和在整個(gè)應(yīng)用程序中只創(chuàng)建一個(gè)aspect對(duì)象的等幾種方式。
利用方面aspect既可以擴(kuò)展出新的方面aspect或者抽象方面abstractaspect,也可以通過(guò)實(shí)現(xiàn)接口方面Iaspect來(lái)構(gòu)造方面aspect。
(2) 切入點(diǎn)pointcut的表示。切入點(diǎn)、連接點(diǎn)的定義必須包含靜態(tài)語(yǔ)義和動(dòng)態(tài)行為語(yǔ)義兩個(gè)方面。切入點(diǎn)、連接點(diǎn)的AOP動(dòng)態(tài)行為語(yǔ)義是指干預(yù)應(yīng)用的運(yùn)行以執(zhí)行方面aspect的行為。動(dòng)態(tài)行為語(yǔ)義的描述和擴(kuò)展通常選用在AOP中具有代表性的AspectJ中的advice。
切入點(diǎn)的表述可通過(guò)UML Profiles的構(gòu)造型的擴(kuò)展得到構(gòu)造型pointcut。并可(也必須)為pointcut添加約束,使其只能用于構(gòu)造型aspect。
(3) 通知advice、連接點(diǎn)joinpoint。與切入點(diǎn)相關(guān)的通知advice和連接點(diǎn)joinpoint仍然可以通過(guò)UML Profiles的構(gòu)造型的擴(kuò)展來(lái)實(shí)現(xiàn)。
用于描述動(dòng)態(tài)行為語(yǔ)義的AspectJ advice實(shí)際上就是UML 2.0的Behaviors。對(duì)構(gòu)造型advice可以且必須添加約束,使其只能用于構(gòu)造型pointcut。并且可以實(shí)現(xiàn)通知的五種執(zhí)行方式:
?、?before通知:在連接點(diǎn)joinpoint執(zhí)行之前執(zhí)行before advice。但不能阻止連接點(diǎn)前的執(zhí)行;
?、?after通知:在連接點(diǎn)joinpoint執(zhí)行之后執(zhí)行after advice;
③ around通知:包圍一個(gè)連接點(diǎn)的通知,例如方法調(diào)用。Aroud通知在方法調(diào)用前后完成自定義的行為,并負(fù)責(zé)選擇繼續(xù)執(zhí)行連接點(diǎn)或通過(guò)自己的返回值或拋出異常來(lái)中斷執(zhí)行。
④ AfterThrowingAdvice通知:在方法拋出異常時(shí)執(zhí)行的通知。
⑤ AfterReturningAdvice通知:在連接點(diǎn)正常完成后執(zhí)行的通知。
連接點(diǎn)有兩種類型:類連接點(diǎn)和方法連接點(diǎn)。
類連接點(diǎn)構(gòu)造型classjoinpoint的擴(kuò)展實(shí)現(xiàn)可以也需要添加約束,使其只能用于切入點(diǎn)pointcut。并且可以實(shí)現(xiàn)通配符的條件比較。同樣,方法連接點(diǎn)構(gòu)造型methodjoinpoint的擴(kuò)展實(shí)現(xiàn)也需要添加約束,使其只能用于切入點(diǎn)pointcut。
方法連接點(diǎn)methodjoinpoint是專門針對(duì)方法的。方法所具有的修飾符、返回值、方法名、參數(shù)、參數(shù)個(gè)數(shù)以及異常等的表述,都可以在此基礎(chǔ)上,將方法連接點(diǎn)methodjoinpoint分解為修飾符構(gòu)造型modifierJ、返回值構(gòu)造型returnJ、參數(shù)構(gòu)造型argsJ以及異常構(gòu)造型exceptionJ。對(duì)modifierJ、returnJ、argsJ也都可以添加約束,使得它們只能用在方法連接點(diǎn)構(gòu)造型methodjoinpoint和類連接點(diǎn)構(gòu)造型classjoinpoint中。
此外,AOP中對(duì)連接點(diǎn)的動(dòng)態(tài)捕獲(控制流程中類方法執(zhí)行中涉及的連接點(diǎn)以及對(duì)類的字段進(jìn)行處理、類初始化、對(duì)象初始化等涉及的所有連接點(diǎn))和靜態(tài)捕獲(捕獲在指定類或者方面中的程序體中的所有連接點(diǎn)以及滿足一定條件的連接點(diǎn)),以及用于表示橫切關(guān)注點(diǎn)引發(fā)的行為順序等機(jī)制,都可以通過(guò)UML 2.0 Profile的擴(kuò)展來(lái)獲得。
2 擴(kuò)展策略的比較和相關(guān)研究
相對(duì)來(lái)說(shuō),使用UML 2.0 Profile的最大好處是可以獲得大多數(shù)UML2.0工具的支持,建模人員可以容易地使用UML2.0 Profile擴(kuò)展機(jī)制在MDA中引入面向方面的建模[9,13]。從理論上來(lái)說(shuō),可以創(chuàng)建無(wú)限個(gè)特征文件Profile。因而,只要遵循UML 2.0規(guī)范,任何的建模人員都可以創(chuàng)建滿足自己需要的任何特征文件。通過(guò)Profile 的擴(kuò)展機(jī)制建立UML2.0 PIM-AOP Profile模型規(guī)范的方式具有較強(qiáng)的通用性,例如當(dāng)AOP的語(yǔ)法增加或變動(dòng)時(shí),可以容易地在該P(yáng)IM模型規(guī)范中實(shí)現(xiàn)。
但是,在進(jìn)行軟件開(kāi)發(fā)時(shí)使用UML2.0 Profile擴(kuò)展,必須首先利用面向方面技術(shù)將核心業(yè)務(wù)邏輯和橫切關(guān)注點(diǎn)分離,然后建立實(shí)現(xiàn)系統(tǒng)核心關(guān)注點(diǎn)的功能PIM 和橫切關(guān)注點(diǎn)的方面PIM,接下來(lái)還要根據(jù)選定的具體技術(shù)平臺(tái)利用相關(guān)的平臺(tái)變換規(guī)則分別將功能PIM和方面PIM變換為功能PSM和方面PSM。最后還需利用特定方面平臺(tái)的編織技術(shù)將這兩部分編織在一起形成最終代碼[1]。
與UML Profile的擴(kuò)展策略相比較,MOF擴(kuò)展可以充分利用和表達(dá)元模型的語(yǔ)義,其抽象級(jí)更高,因而靈活性也更高。但它工作困難、現(xiàn)有的支持工具較少。
支持AOP的MOF元模型具有更強(qiáng)的表達(dá)能力,而且獨(dú)立于任何的標(biāo)記,同時(shí)還能為除MDA以外的其他建模標(biāo)準(zhǔn)(如XMI、QVT等)所使用。
支持AOP的MOF元模型的優(yōu)點(diǎn)是: (1)有助于不同的AOP擴(kuò)充方案建立元模型; (2)通過(guò)一個(gè)簡(jiǎn)單的元模型能夠方便地確定不同的AOP擴(kuò)充方案的異同; (3)能夠?qū)崿F(xiàn)模型之間的水平變換,即不同的AOP擴(kuò)充方案之間的轉(zhuǎn)換; (4)有利于轉(zhuǎn)換工具的開(kāi)發(fā)。
MOF擴(kuò)展可以遵循MDA方法,使用預(yù)定義的轉(zhuǎn)換,從元模型生成目標(biāo)模型所有可能的元素。另一方面,利用這種方法,可以生成多個(gè)目標(biāo)模型,獲取相同系統(tǒng)的不同實(shí)現(xiàn)方案。
此外,基于各種特定的MOF元模型建立的任何模型,以及任何使用經(jīng)擴(kuò)展的通用的支持AOP的MOF元模型構(gòu)建的任何模型,都可以直接通過(guò)XMI標(biāo)準(zhǔn)序列化為XML。
一些試圖擴(kuò)展UML元模型以支持AOP的相關(guān)工作有:
參考文獻(xiàn)[3]根據(jù)AspectJ 和AspectC++中元素的語(yǔ)義,通過(guò)繼承相應(yīng)UML 中元素的方法擴(kuò)展了UML 的元模型。類圖中的切入點(diǎn)可以從方面中分離出來(lái),這樣可以清晰地表示在這個(gè)切入點(diǎn)處的多個(gè)橫切關(guān)系;順序圖中新添加的通知發(fā)出焦點(diǎn)可以方便地表達(dá)行為橫切。但所采用的方法是非形式化的,而且其實(shí)現(xiàn)和應(yīng)用都較麻煩和困難。
參考文獻(xiàn)[4]基于AspectJ語(yǔ)法語(yǔ)義和XMI擴(kuò)展UML元模型,并實(shí)現(xiàn)了面向方面的重要概念。但該方法缺乏對(duì)基于面向方面的動(dòng)態(tài)行為和特征的支持。
這些基于UML元模型的擴(kuò)展都非常接近于諸如AspectJ的原始AOSD方法,且不支持更高級(jí)的功能,如對(duì)稱組合。
其他的一些對(duì)基于UML Profile擴(kuò)展的研究工作有:參考文獻(xiàn)[5]給出了面向方面設(shè)計(jì)的通用UML Profile的構(gòu)造。提出了用UML 中的collaboration template、 Feature和Association模型元素的擴(kuò)展構(gòu)造型。但是工作并沒(méi)有最終完成,而且寄希望于通過(guò)不同的方案來(lái)完成。此外,它仍然不支持諸如對(duì)稱組合規(guī)則等高級(jí)概念,其實(shí)用性也有待于在不同的方案中進(jìn)行檢驗(yàn)。參考文獻(xiàn)[6]提出了用于AspectJ的設(shè)計(jì)標(biāo)記。參考文獻(xiàn)[7]提出一個(gè)原始的AspectJ profile,其中,advice和pointcut是基于operation的構(gòu)造型,aspect與核心業(yè)務(wù)模塊之間的關(guān)系表達(dá)為依賴關(guān)系。參考文獻(xiàn)[6]、[7]給出的擴(kuò)展策略的共同缺點(diǎn)是過(guò)分依賴于特定的技術(shù)。
還有一些略有不同的擴(kuò)展策略:(1)基于UML profile的擴(kuò)展,同時(shí)又可通過(guò)MOF擴(kuò)展引入新的元模型的方法;(2)在UML模型中引入構(gòu)造型aspect;(3)不需要擴(kuò)展UML,利用狀態(tài)圖和類圖為不同的關(guān)注點(diǎn)進(jìn)行建模。但這些方法均不完善且存在較多的缺點(diǎn)[8]。
以模型為中心的軟件開(kāi)發(fā)新方法MDA有其獨(dú)特的絕對(duì)優(yōu)勢(shì),面向方面技術(shù)可以對(duì)MDA進(jìn)行補(bǔ)充,以解決MDA難以處理的橫切關(guān)注點(diǎn)的問(wèn)題。將面向方面的MDA用于復(fù)雜軟件系統(tǒng)的開(kāi)發(fā)可以大大提高軟件的可重用性和可維護(hù)性,降低開(kāi)發(fā)成本。將這兩種重要的軟件開(kāi)發(fā)方法結(jié)合起來(lái)有望成為未來(lái)軟件開(kāi)發(fā)的發(fā)展趨勢(shì)。但是如何將兩者很好地結(jié)合起來(lái)還有許多問(wèn)題需要進(jìn)一步深入研究和解決。
參考文獻(xiàn)
[1] 劉敬勇,張立臣,陳成.基于面向方面MDA的軟件開(kāi)發(fā)方法[J]. 計(jì)算機(jī)工程與設(shè)計(jì),2009,30(17):4077-4080.
[2] FUENTES L,SANCHEZ P. A generic MOF metamodel for aspect-oriented modeling [C]. Proceedings of the Fourth Workshop on Model-Based Development of Computer-Based Systems and Third International Workshop on Model-Based Methodologies for Pervasive and Embedded Software (MBD/MOMPES’06), Potsdam, IEEE Computer Society, 2006:113-124.
[3] 郭東亮,張立臣.基于擴(kuò)展UML 的面向方面的建模 [J]. 計(jì)算機(jī)工程,2006,32(19):100-102.
[4] 吳剛,郝克剛,葛瑋.基于UML的面向方面建模研究[J]. 計(jì)算機(jī)應(yīng)用與軟件,2007,24(11):95-97.
[5] ALDAWUD O, ELRAD T, BADER A. Uml profile for aspect oriented software development[C]. In Proc.of 3rd Int. Workshop on AOM,AOSD 2003, Boston, USA, 2003(3).
[6] STEIN D, HANENBERG S, UNLAND R. A UML-based aspect-oriented design notation for AspectJ[C]. In Proc. of AOSD’02, Enschede, The Netherlands, 2002(4):106-112.
[7] STEIN D,HANENBERG S, UNLAND R.Designing aspect-oriented crosscutting in UML[C].In Proceedings of the AOM with UML workshop at AOSD 2002.
[8] YAN H, KNIESEL G, CREMERS A. A metamodel and modeling notation for AspectJ[C]. In Proceedings of the AOM workshop at AOSD 2004.