《在元模型中定義轉(zhuǎn)換的關(guān)系型方法》讀書筆記
Posted on 2005-03-17 12:03 wxb_nudt 閱讀(1013) 評(píng)論(2) 編輯 收藏 所屬分類: 技術(shù)雜談前言:
本文是模型轉(zhuǎn)換領(lǐng)域的一篇Bible,被無(wú)數(shù)次的引用。幾乎在所有的模型轉(zhuǎn)換領(lǐng)域的論文中都會(huì)把它作為參考文獻(xiàn)。作者在本文中第一次提出了用關(guān)系代數(shù)來(lái)定義模型轉(zhuǎn)換的方法,開(kāi)創(chuàng)了模型轉(zhuǎn)換技術(shù)的一個(gè)流派。
本文中涉及的知識(shí)非常廣泛,讀懂本文需要以下知識(shí):關(guān)系代數(shù)、集合論、UML、OCL以及MDA相關(guān)知識(shí)。特別是OCL,文中大量的使用了OCL來(lái)描述轉(zhuǎn)換的約束和特性。我是第二次讀這篇文章了,第一次因?yàn)椴欢?/SPAN>OCL,所以囫圇吞棗,不能領(lǐng)略其精華。建議所有研究MDA的同仁都讀一下此文。
標(biāo)題:
A Relational Approach to Defining Transformations in a Metamodel
地址:
時(shí)間:
2002以后
閱讀時(shí)間:
第一次2004-10-27
第二次 2005-3-17
摘要:元建模正在成為定義類似UML等語(yǔ)言的標(biāo)準(zhǔn)方法。一個(gè)語(yǔ)言的定義分為三個(gè)部分:具體語(yǔ)法,抽象語(yǔ)法和語(yǔ)義域。使用元建模的方法有可能同時(shí)定義這三個(gè)方面,但是如何定義他們之間的轉(zhuǎn)換還是不清晰的。本文提出了一種方法,它使用元建模模式,并抓住了“數(shù)學(xué)關(guān)系”的本質(zhì)。它展示了這些模式如何被用來(lái)定義具體語(yǔ)法和抽象語(yǔ)法之間的“關(guān)系”,以及抽象語(yǔ)法和語(yǔ)義域的關(guān)系。這種方法的一個(gè)目標(biāo)就是提供一種語(yǔ)言的完整規(guī)范,通過(guò)這種規(guī)范可以生成智能的工具。本方法符合其目標(biāo)的程度也在本文中討論了。
筆記:
1.給出了抽象語(yǔ)法,具體語(yǔ)法,語(yǔ)義域的元模型
元模型在本文中是以UML的子集以及OCL來(lái)表示的;
抽象語(yǔ)法:由package,class,Association,AssociationEnd組成,還定義了他們之間的約束,例如一個(gè)package中不能有重名的Class。
語(yǔ)義域:由snapshot,object,link,linkEnd組成,以及他們之間的約束;注意他們的約束要少一些,因?yàn)闆](méi)有package的嵌套和class的繼承等關(guān)系存在。
具體語(yǔ)法:由diagram,box,line,lineEnd組成,以及約束;注意box有兩種,一種是haveTab(有一個(gè)小標(biāo)簽的)對(duì)應(yīng)package和haveNoTab(沒(méi)有小標(biāo)簽的)對(duì)應(yīng)class。而且具體語(yǔ)法約束很少!
2.模型轉(zhuǎn)換的模式
主要的靈感來(lái)自于關(guān)系代數(shù)。技術(shù)其實(shí)是很簡(jiǎn)單的:采用一種模式,它將“轉(zhuǎn)換的關(guān)系”建模為一個(gè)二元關(guān)系或者一組二元關(guān)系,并將這種模型編碼為對(duì)象模型。在這種思想下,“關(guān)系對(duì)”被建模為對(duì)象,而“關(guān)系”被映射成擁有一組“關(guān)系對(duì)”的對(duì)象。
關(guān)系對(duì)(Pairs):關(guān)系對(duì)由一個(gè)domain對(duì)象x(是Class X的對(duì)象),一個(gè)range對(duì)象(是Class Y的對(duì)象)和它們之間的連接對(duì)象(XY)組成。
關(guān)系(Relation):關(guān)系由一個(gè)domain集合(集合中都是Class X的對(duì)象),一個(gè)range集合(其中都是Class Y的對(duì)象),以及“關(guān)系對(duì)”對(duì)象的集合組成。
關(guān)系中定義了如下性質(zhì):
連接對(duì)象的x端都在domain集合中,連接對(duì)象的y端都在range集合中。
如果關(guān)系中有兩個(gè)關(guān)系對(duì)e和f,其中e.x=f.x,e.y=f.y,那么e=f;(無(wú)冗余特性)
另外文中第6頁(yè)對(duì)關(guān)系的性質(zhì)進(jìn)行了大量的定義,幾乎把集合論中的一套班子都搬過(guò)來(lái)了,例如關(guān)系是“滿射”還是“雙射”等等。
相關(guān)的結(jié)構(gòu):
對(duì)關(guān)系進(jìn)行了嵌套結(jié)構(gòu)的轉(zhuǎn)換關(guān)系定義。
3.模式的應(yīng)用
抽象語(yǔ)法到語(yǔ)義域的轉(zhuǎn)換定義:package對(duì)應(yīng)snapshot;class對(duì)object;Association對(duì)link;AssociationEnd對(duì)linkEnd;另外還有很多約束條件。
約束條件中最復(fù)雜的兩條:第一Association的勢(shì)(cardinality)的上限和下限在link中保持了;第二,linkEnd所連接的object是屬于linkEnd所對(duì)應(yīng)的AssaciationEnd所連接的Class。
具體語(yǔ)法到抽象語(yǔ)法的轉(zhuǎn)換:其中Box(hasTab)對(duì)應(yīng)Package,box(not hasTab)對(duì)應(yīng)Class,line對(duì)應(yīng)Association,lineEnd對(duì)應(yīng)AssocationEnd。
此外也有許多不同的約束條件。
4.結(jié)論
關(guān)于此方法的一些可能的進(jìn)展:
將這種方法應(yīng)用到更精密復(fù)雜的語(yǔ)言中;
將這種模式編碼為包模板;
創(chuàng)造專用的符號(hào)來(lái)描述這些關(guān)系;
應(yīng)用這項(xiàng)技術(shù)到MDA技術(shù)中;
自動(dòng)化的生成或者配置工具;
和其他方法結(jié)合來(lái)更好的定義語(yǔ)言。
感想:
文中最復(fù)雜的一個(gè)約束是從抽象語(yǔ)法到語(yǔ)義域的轉(zhuǎn)換定義中的一個(gè)約束:Association的勢(shì)(cardinality)的上限和下限在link中保持了。它的具體含義是如果有Class A和B分別是AssociationA的兩個(gè)AssociationEnd,其中B端具有勢(shì)upper和lower,那么對(duì)于所有Snapshot中的對(duì)象a(A的實(shí)例)和b1,b2,bi…(B的實(shí)例),如果a和b1,b2,bi…之間有連接LinkA(AssociationA的實(shí)例),那么Class B的實(shí)例b1,b2,bi…的個(gè)數(shù)必須在upper和lower之間,否則就違反了約束。
作者用OCL描述了這個(gè)約束:
context PackageSnapshot inv:
package.association.associationEnd->forAll(ae |
snapshot.allObject()->select(o |
classRelObject.rangeLookup(o).class = {ae.source})
->forAll(o | let n = o.sourceOf->select(le |
associationRelLink.domainLookup(ae.owner).linkEnd
->includes(le))->size in n <= ae.upper and n >= ae.lower))
解釋如下:
在PackageSnapshot這個(gè)“關(guān)系對(duì)”(Pair)中,必須滿足一個(gè)不變式
對(duì)于package.association.associationEnd中的所有元素ae必須滿足約束A。
約束A如下:
先取出snapshot中的所有對(duì)象,選擇出滿足條件B的對(duì)象o的集合,此集合必須滿足約束C。
條件B如下:
rangeLookup(o)選擇出了所有range為o的“關(guān)系對(duì)”,這些關(guān)系對(duì)是屬于classRelObject關(guān)系的,然后找出這些關(guān)系對(duì)的class,如果class等于ae.source就將o選入集合。
約束C如下:
對(duì)于所有滿足條件B的對(duì)象集合,其中每個(gè)對(duì)象o必須滿足n<=ae.upper和n>=ae.lower,其中n的計(jì)算方法如下:
用o.sourceOf找出所有o所連接的LinkEnd,然后選擇出滿足條件D的le,組成一個(gè)集合,用size計(jì)算出這個(gè)集合的大小就是n的值。
條件D如下:
對(duì)于對(duì)象o的每個(gè)LinkEnd le,首先用domainLookup(ae.owner)找出所有“關(guān)系對(duì)”,這些關(guān)系對(duì)的左邊是AssociationEnd(ae.owner),然后將關(guān)系對(duì)的右邊(即linkEnd)全部取出來(lái)組成一個(gè)集合,如果此集合包含le,則le滿足條件D。
我想如果這個(gè)約束可以看懂,那么看懂整篇文章就不難了。