《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 設(shè)計(jì)應(yīng)用 > MDA模型轉(zhuǎn)換的同步技術(shù)
MDA模型轉(zhuǎn)換的同步技術(shù)
來源:微型機(jī)與應(yīng)用2011年第9期
楊 磊,,余金山
(華僑大學(xué) 計(jì)算機(jī)學(xué)院,福建 泉州 362011)
摘要: 給出一種源模型和目標(biāo)模型間的鏈接技術(shù)及其實(shí)現(xiàn)方法,,該方法能很好地實(shí)現(xiàn)源模型和目標(biāo)模型間的雙向可追蹤,。既可以對源模型的更新執(zhí)行正向轉(zhuǎn)換,還可以實(shí)現(xiàn)目標(biāo)模型向源模型的逆向轉(zhuǎn)換,。
Abstract:
Key words :

摘  要: 給出一種源模型和目標(biāo)模型間的鏈接技術(shù)及其實(shí)現(xiàn)方法,,該方法能很好地實(shí)現(xiàn)源模型和目標(biāo)模型間的雙向可追蹤。既可以對源模型的更新執(zhí)行正向轉(zhuǎn)換,,還可以實(shí)現(xiàn)目標(biāo)模型向源模型的逆向轉(zhuǎn)換,。
關(guān)鍵詞: 模型驅(qū)動(dòng)模型轉(zhuǎn)換,;同步,;可追蹤性

 模型驅(qū)動(dòng)架構(gòu)(MDA)是繼CORBA、UML之后由OMG推出的重要的軟件開發(fā)方法學(xué)[1-3],。MDA對軟件開發(fā),、異構(gòu)平臺的集成、互操作以及對不斷涌現(xiàn)出的軟件新技術(shù)和新平臺的自洽性等方面都有著巨大的影響[1-2],。
 MDA的核心問題是模型轉(zhuǎn)換,。其基本方法是:先抽象出與實(shí)現(xiàn)技術(shù)無關(guān),完整描述業(yè)務(wù)的平臺無關(guān)模型(PIM),,并針對不同的實(shí)現(xiàn)制定多個(gè)映射規(guī)則,,再將平臺無關(guān)模型轉(zhuǎn)換成與具體實(shí)現(xiàn)技術(shù)相關(guān)的應(yīng)用模型(PSM)。由于建模過程和用戶業(yè)務(wù)邏輯固有的變動(dòng)性,,在模型轉(zhuǎn)換過程中必須保持源模型和目標(biāo)模型的同步,,這對MDA的模型轉(zhuǎn)換的同步性研究具有重要意義。
 本文提出一種創(chuàng)建中間轉(zhuǎn)換對象的方法,,將模型轉(zhuǎn)換信息保存在中間對象中,,使模型轉(zhuǎn)換具有正、反向可追溯性,,以較好實(shí)現(xiàn)源模型和目標(biāo)模型轉(zhuǎn)換的同步,。并從通用性和模型轉(zhuǎn)換的同步性的角度對MOF元模型和OCL進(jìn)行了改進(jìn)。
1 模型轉(zhuǎn)換同步性的中間轉(zhuǎn)換對象技術(shù)
 模型轉(zhuǎn)換過程中,,由于建模過程和用戶業(yè)務(wù)邏輯固有的變動(dòng)性,,一項(xiàng)重要的實(shí)際工作是必須實(shí)現(xiàn)源模型和目標(biāo)模型之間的正向和反向的完全同步,。通常的做法是為源模型和目標(biāo)模型中相應(yīng)元素之間的所有關(guān)系建立元素鏈接,并把鏈接信息添加到源模型或目標(biāo)模型中,。這樣做不但破壞了模型的純潔性,,而且當(dāng)源模型和目標(biāo)模型之間不是一對一時(shí)容易引起混亂。
 方法(1)是在源模型中創(chuàng)建一系列標(biāo)記(tag),,這些標(biāo)記記錄了轉(zhuǎn)換的信息,。圖1所示的轉(zhuǎn)換必須建立表1所示的兩個(gè)標(biāo)記。

 

 

 這些標(biāo)記是轉(zhuǎn)換信息,,并不屬于源模型,。把它們加入到源模型中不但破壞了源模型的純潔性,,而且當(dāng)一個(gè)PIM要轉(zhuǎn)換成幾個(gè)PSM時(shí),,大量的標(biāo)記將給PIM帶來很多額外的負(fù)擔(dān)。
方法(2)把標(biāo)記信息保存在目標(biāo)模型中,。NetBeans開發(fā)平臺就使用這種方法,。但該方法的缺點(diǎn)與方法(1)類似,而且在執(zhí)行第一次轉(zhuǎn)換之前,,因?yàn)槟繕?biāo)模型還沒有生成,,所以只有在執(zhí)行過一次系統(tǒng)的默認(rèn)轉(zhuǎn)換之后,才能在生成的目標(biāo)模型中保存標(biāo)記信息,。
 而較好的解決方法是:(1)讓每條被執(zhí)行的轉(zhuǎn)換規(guī)則創(chuàng)建一個(gè)轉(zhuǎn)換實(shí)例,,每個(gè)轉(zhuǎn)換實(shí)例包含一個(gè)或多個(gè)轉(zhuǎn)換對象;(2)在每個(gè)轉(zhuǎn)換對象中存儲一條轉(zhuǎn)換信息,,即源模型元素和目標(biāo)模型元素的鏈接信息,;(3)建立一個(gè)中間對象模型,把轉(zhuǎn)換實(shí)例及轉(zhuǎn)換對象保存在這個(gè)模型中,。如圖1所示,,設(shè)要把源模型Customer轉(zhuǎn)換到SQL模型C_CUSTOMER,attribute_to_attribute是負(fù)責(zé)把源模型中的String類型屬性轉(zhuǎn)換到SQL模型的VARCHAR類型屬性的轉(zhuǎn)換規(guī)則,。則當(dāng)對Customer的description屬性應(yīng)用規(guī)則attribute_to_attribute時(shí),,生成轉(zhuǎn)換實(shí)例①,實(shí)例①包含一個(gè)轉(zhuǎn)換對象信息③,,在信息③中保存轉(zhuǎn)換信息“Customer的String類型的description轉(zhuǎn)換成C_CUSTOMER的VARCHAR(255)類型的description”,。同理,對Customer的name屬性應(yīng)用這條轉(zhuǎn)換規(guī)則時(shí),,生成轉(zhuǎn)換實(shí)例②,,②包含一個(gè)轉(zhuǎn)換對象信息④,而轉(zhuǎn)換對象信息④中保存了轉(zhuǎn)換信息“Customer的String類型的name轉(zhuǎn)換成C_CUSTOMER的VARCHAR(255)類型的name”,。并把轉(zhuǎn)換實(shí)例及轉(zhuǎn)換對象保存在另外的既不屬于源,,也不屬于目標(biāo)的模型中,。這樣不僅能保留完整清晰的轉(zhuǎn)換信息又不破壞源模型和目標(biāo)模型的純潔性。

 為了實(shí)現(xiàn)以上方法,,需要對MOF進(jìn)行擴(kuò)展,,建立一個(gè)雙向圖結(jié)構(gòu)的元模型。如圖2所示,,ModelElement是一個(gè)最通用的模型元素,;一個(gè)Link引用兩個(gè)ModelElement,分別為源對象和目標(biāo)對象,;一個(gè)Step包含一個(gè)或多個(gè)Link,,則一個(gè)Step就可以保存一次模型轉(zhuǎn)換的追溯信息。如果考慮到支持一個(gè)鏈?zhǔn)降霓D(zhuǎn)換,,那么整個(gè)的轉(zhuǎn)換過程相當(dāng)于有多個(gè)Step,,因此,為了支持鏈?zhǔn)睫D(zhuǎn)換,,用一個(gè)包含了Step的有序集合的Trace來實(shí)現(xiàn),。
在MOF元模型層次中增加兩個(gè)新的元素TransformationTraceClass和Relation,并定義兩個(gè)操作setRelation()和getRelation(),,用于讀寫Relation的值,,如圖3所示。


 在源模型第一次發(fā)生模型轉(zhuǎn)換并需要保存相關(guān)信息時(shí),,調(diào)用TransformationTraceClass,,并把本次轉(zhuǎn)換的相關(guān)信息用setRelation()操作寫入到Relation的一個(gè)元組,此后每進(jìn)行一個(gè)模型元素的轉(zhuǎn)換,,就首先到Relation中查找有沒有相同模型轉(zhuǎn)換的元組,。若有,則把目標(biāo)元素追加到該元組中,;若沒有,,則在Relation中再創(chuàng)建一個(gè)新的元組。即可實(shí)現(xiàn)對轉(zhuǎn)換的完全同步支持,,同時(shí)可將轉(zhuǎn)換關(guān)系的信息和模型本身分隔開,,實(shí)現(xiàn)了關(guān)注點(diǎn)的分離,保證了PIM和PSM的清晰性和單純性,。
2 支持模型轉(zhuǎn)換同步的OCL擴(kuò)展
 在MDA中,,用UML結(jié)合OCL已被認(rèn)為是開發(fā)符合MDA規(guī)范的PIM的最佳方案[1,3],。研究指出:OCL對于模型轉(zhuǎn)換可以發(fā)揮重要的作用[3-4],。但是,如何把OCL應(yīng)用于模型轉(zhuǎn)換的實(shí)際工作卻做得較少。由于模型轉(zhuǎn)換的關(guān)系信息的復(fù)雜性,,所以難以用現(xiàn)有OCL來表示,。對于用中間轉(zhuǎn)換對象技術(shù)保留模型轉(zhuǎn)換的關(guān)系信息的OCL實(shí)現(xiàn),對OCL進(jìn)行如下的擴(kuò)展:
 將圖3看成是TransformationTraceClass的圖語法,。TransformationTraceClass是以由Tuple組成的并以Relation作為其組成元素的,。作為一個(gè)類,其創(chuàng)建操作必須由創(chuàng)建原語實(shí)現(xiàn),,具體格式為:
 createElement(TransformationTraceClassName:TransformationTraceClass)
 創(chuàng)建原語實(shí)際生成的是對TransformationTraceClass的引用,,每個(gè)模型轉(zhuǎn)換中的源模型對應(yīng)生成一個(gè)TransformationTraceClass,它在第一次進(jìn)行模型元素轉(zhuǎn)換時(shí)被創(chuàng)建,,且調(diào)用setRelation()操作保存轉(zhuǎn)換信息,調(diào)用getRelation()操作查詢轉(zhuǎn)換信息,。下面是setRelation()和getRe1ation()的語法,。
setRelation(newValue,Relation.Tuple.sourceName)
 setRelation操作類似普通類中對于屬性的set操作,,但該原語的操作對象是Relation中的元組,。其含義是:把轉(zhuǎn)換關(guān)系信息newValue寫入到以sourceName為source的元組中,。
getRelation(Relation.Tuple.sourceName)
getRelation操作類似普通類中對于屬性的get操作,,但其操作對象和返回值均是Relation中的元組。由于元組只是將一組值集合在一起的一種途徑,,所以具體使用時(shí)元組必須被賦給一個(gè)變量,。
 此外,在模型轉(zhuǎn)換中,,對任何模型元素的操作都定義其必須查詢相應(yīng)的TransformationTraceClass來確定與被修改元素的相關(guān)轉(zhuǎn)換信息,,從而實(shí)現(xiàn)源模型和目標(biāo)模型的同步。
MDA堪稱是一種革命性的新方法,。MDA的核心問題是模型轉(zhuǎn)換,。本文給出一種能對模型轉(zhuǎn)換的向前和向后可追溯性的方法,較好地實(shí)現(xiàn)了源模型和目標(biāo)模型轉(zhuǎn)換的同步,。由于OCL具有形式化且簡潔易懂等眾多顯著特征,,因而用它來描述MDA中的模型具有突出的優(yōu)點(diǎn)。但OCL作為模型轉(zhuǎn)換語言必須進(jìn)行一定的擴(kuò)展[3-4],。本文所做的保存模型同步信息的擴(kuò)展僅是其中之一,。
參考文獻(xiàn)
[1] SENDALL S, KOZACZYNSKI W. Model transformation: The heart and soul of model-driven software development [J]. IEEE Software,, 2003(9):42-45.
[2] 王學(xué)斌,,王懷民,等.一種模型轉(zhuǎn)換的編織框架[J].軟件學(xué)報(bào),2006,,17(6):1423-1435.
[3] 陳婧,,趙建華,張康康.處理動(dòng)態(tài)行為描述的MDA模型轉(zhuǎn)換技術(shù)[J].計(jì)算機(jī)應(yīng)用與軟件,,2010,,27(4):162-166.
[4] CARIOU E, MARVIE R,, SEINTURIER L,, et al. OCL for the specification of model transformation contracts In: Octavian Patrascoiu[R]. OCL and model driven engineering UML 2004 workshop. Lisbon, Portuga1,, 2004.

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載。