MDA之路

          MDA,UML,XML,Eclipse及Java相關(guān)的Blog
          posts - 53, comments - 494, trackbacks - 0, articles - 2
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          前言:

          本文是模型轉(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ù)、集合論、UMLOCL以及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

          地址

           暫無(wú)

          時(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ǔ)法:由packageclassAssociationAssociationEnd組成,還定義了他們之間的約束,例如一個(gè)package中不能有重名的Class

          語(yǔ)義域:由snapshotobjectlinklinkEnd組成,以及他們之間的約束;注意他們的約束要少一些,因?yàn)闆](méi)有package的嵌套和class的繼承等關(guān)系存在。

          具體語(yǔ)法:由diagramboxlinelineEnd組成,以及約束;注意box有兩種,一種是haveTab(有一個(gè)小標(biāo)簽的)對(duì)應(yīng)packagehaveNoTab(沒(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ì)ef,其中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)snapshotclass對(duì)objectAssociation對(duì)linkAssociationEnd對(duì)linkEnd;另外還有很多約束條件。

             約束條件中最復(fù)雜的兩條:第一Association的勢(shì)(cardinality)的上限和下限在link中保持了;第二,linkEnd所連接的object是屬于linkEnd所對(duì)應(yīng)的AssaciationEnd所連接的Class

          具體語(yǔ)法到抽象語(yǔ)法的轉(zhuǎn)換:其中BoxhasTab)對(duì)應(yīng)Packageboxnot hasTab)對(duì)應(yīng)Classline對(duì)應(yīng)AssociationlineEnd對(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 AB分別是AssociationA的兩個(gè)AssociationEnd,其中B端具有勢(shì)upperlower,那么對(duì)于所有Snapshot中的對(duì)象aA的實(shí)例)和b1b2bi…B的實(shí)例),如果ab1b2bi…之間有連接LinkAAssociationA的實(shí)例),那么Class B的實(shí)例b1b2bi…的個(gè)數(shù)必須在upperlower之間,否則就違反了約束。

          作者用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)選擇出了所有rangeo的“關(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.uppern>=ae.lower,其中n的計(jì)算方法如下:

          o.sourceOf找出所有o所連接的LinkEnd,然后選擇出滿足條件Dle,組成一個(gè)集合,用size計(jì)算出這個(gè)集合的大小就是n的值。

          條件D如下:

          對(duì)于對(duì)象o的每個(gè)LinkEnd le,首先用domainLookup(ae.owner)找出所有“關(guān)系對(duì)”,這些關(guān)系對(duì)的左邊是AssociationEndae.owner),然后將關(guān)系對(duì)的右邊(即linkEnd)全部取出來(lái)組成一個(gè)集合,如果此集合包含le,則le滿足條件D

           

          我想如果這個(gè)約束可以看懂,那么看懂整篇文章就不難了。


          評(píng)論

          # re: 《在元模型中定義轉(zhuǎn)換的關(guān)系型方法》讀書筆記  回復(fù)  更多評(píng)論   

          2006-09-07 12:30 by 三木
          總在你這里看一些有關(guān)MDA,UML以及OCL方面的文章,感覺(jué)這些東西都是平時(shí)看不到的,我對(duì)這篇文章也挺感興趣的,能否給我發(fā)一份英文版的.謝謝
          jhs1205@163.com

          # re: 《在元模型中定義轉(zhuǎn)換的關(guān)系型方法》讀書筆記  回復(fù)  更多評(píng)論   

          2008-03-15 11:19 by 武斌
          對(duì)這篇文章也挺感興趣的,能否給我發(fā)一份嗎?謝謝
          zwbzej@163.com
          主站蜘蛛池模板: 丰台区| 北宁市| 广水市| 徐水县| 温宿县| 万宁市| 怀来县| 句容市| 浠水县| 洪湖市| 洪雅县| 康定县| 札达县| 伊金霍洛旗| 定日县| 喀喇| 黄龙县| 巫山县| 松溪县| 赣榆县| 和田县| 阆中市| 潞城市| 石渠县| 铜山县| 佛冈县| 尤溪县| 武鸣县| 阿拉尔市| 镇安县| 鸡西市| 无棣县| 西宁市| 扶风县| 海兴县| 涞水县| 元江| 延庆县| 中卫市| 千阳县| 辰溪县|