一篇關于模型編織的文章及其他
標題:
Model Transformation and Weaving in the AMMA Platform
地址:
http://www.sciences.univ-nantes.fr/lina/atl/www/papers/CR_2005_GTTSE_transfo_weaving.pdf
時間:
2005
閱讀時間:
2005.12.10
摘要:
Model transformation creates a set of target models from a set of source models. This operation is central in current MDE approaches. However, we highlight in this paper some of its limitations. Model weaving is another operation on models, which specifies typed links between model elements. Model weaving can thus be used to specify abstract model transformations assets of links between source and target metamodel types. Therefore, we propose to combine model transformation and model weaving in order to overcome some of current model transformation limitations. This paper presents how we experimented this with ATLAS Transformation Language (ATL) and AMW (ATLAS Model Weaver) on an example.
模型轉換從一組源模型創建出一組目標模型。這種操作是目前MDE方法的主流。然而,在本文中我們指出了它的一些局限。模型編織是另外一種模型操作的方法,它定義了模型元素之間的有類型的連接。因此模型編織能夠被用于將抽象的模型轉換定義為一組源和目標元模型類型的連接。因此,我們建議將模型轉換和模型編織組合起來去克服一些當前的模型轉換的局限。本文給出了一個在ATLAS模型轉換語言和AMW(ATLAS模型編織器)上實踐本方法
的例子。
大意:
本文分為六個大的部分:
1 Introduction
當前的模型驅動工程學(MDD)中,例如微軟的軟件工廠,OMG的MDA等,模型轉換都是一個核心的技術。目前已經發展出很多模型轉換的方法,但是模型轉換的標準QVT一直沒有能夠制訂。模型編織是另外一種操作模型的方法,它通過建立模型元素之間的連接來編織模型。模型編織與模型轉換存在一些不同之處。它克服了模型轉換的三個主要局限。
2 Transforming Relational Tuples into an XML Document
本節介紹了一個應用場景,在一個圖書館信息系統中,將RDBMS的數據轉換到XML文檔中。其各自的元模型如下:

在這個場景中,使用ATL語言定義了一個模型轉換程序,如下:
module RDBMS2XML;
create Target : XML from Source : RDBMS;
rule Books {
from
db : RDBMS!BookRcd
to
xml : XML!Book (
Title <- db.Title, Author <- db.Author,
ISBN <- db.ISBN,
subjects <- RDBMS!SubjectRcd.
allInstances()->select (e | e.SID = db.SID)
)
}
rule Subjects {
from
db : RDBMS!SubjectRcd (RDBMS!BookRCD.
allInstances()->exists(e | e.SID = db.SID))
to
xml : XML!Subject (
SubjectID <- db.SID,
Descr <- db.Name
)
}
這個程序定義了如何將RDBMS的模型轉換為XML模型。
3 Limitations of Direct Transformations
本節詳細說明了上面模型轉換方法的三個缺點:1)方向性,只能從左到右轉換,如果要反向轉換則必須再寫一個模型轉換程序;2)模式重用,對于稍微復雜的轉換,要寫大量雷同的代碼,很多代碼具有相同的模式,但是不能直接重用。3)變更的傳播性,源和目標模型有小的改變則必須改變程序中的多處代碼,很容易出錯。
4 Introducing Model Weaving
本節以上面的實例作為例子介紹了模型編織的概念。下圖很能說明模型編織的概念:

從上圖可以看出,上面的模型編織使用了三種類型的連接,分別是Equals,FK和Nested。其含義顯而易見。
另外,文中給出了模型編織的元模型。因為模型編織的實例也是一個模型,因此它需要元模型予以規范。所以,文中給出了這個元模型關系圖:

文中還討論了WMM所應該具有的擴展性等特點,但是沒有給出具體的元模型描述。
5 Combining Weaving and Transformation
本節簡要介紹了如何將模型編織和模型轉換組合起來來解決目前的模型轉換中存在的問題。其主要思想是:首先建立一個模型編織的模型,然后利用這個模型來創建一個模型轉換的程序,然后利用模型轉換程序來具體進行模型轉換的執行。
通過模型編織的方法,克服了以前模型轉換的三個缺點。
6 Related Work
介紹一些相關工作,主要是模型轉換的一些方法。
7 Conclusion
結論也是老生常談,再把上面的工作和優點都復述一遍,最后還說明了模型編織還可用于更加復雜的場景:在UML Profile和DSL之間作橋接。
感想:
模型編織
Model Weaving這個概念我是第一次見到。本文正好是一篇Model Weaving的入門文章,極大的滿足了我的好奇心。Model Weaving的中文譯名還不知道有沒有正式確定,和MDA群里面的人討論了一下,原來大家都翻譯為模型編織,看來我還是誤打誤中了。
新生的事物總是缺點與優點同樣突出的,模型轉換方法發展好幾年了,但是其最顯著的缺點還是沒有大的進步。本文指出了三個缺點:雙向的模型轉換方法很少而且難以實現;模型轉換程序的代碼難以重用;變更傳播。
很多研究者希望通過制訂新的模型轉換語言或者增加其語義來解決這些問題。但是本文的作者境界更高一點,他提出的模型編織是從一個更高的層次來解決問題,即提出一個模型轉換程序生成器,來生成已有的模型轉換程序,來降低模型轉換程序的編寫復雜性。所謂的模型編織即用一個二元連接來連接兩個模型元素,并對這些連接制訂類型和約束,最后根據這些連接類型來生成簡單的模型轉換代碼程序塊。這樣一舉解決了上面的三個問題。其思想含義等同于C編譯器將C程序編譯為匯編代碼。
作者使用的模型轉換語言是ATL,使用的模型編織器是AMW,他們統一集成在一個AMMA平臺中,這個平臺目前是一個開源的Eclipse插件。由于我還缺乏足夠的資料,目前不能確定作者是否就是這個AMMA平臺的開發者。
模型轉換語言
模型轉換是MDA的熱點所在,目前模型轉換方法提出了很多,但是具體的模型轉換語言我也只接觸了三種(精力所限啊):
MTF,模型轉換框架,IBM定義的模型轉換語言,Eclipse插件,規則型的模型轉換語言,用來轉換基于Eclipse的模型插件定義的模型很方便;
ATL,本文介紹的模型轉換語言,我還沒有具體使用過,從本文的例子程序來看,也是規則型的模型轉換語言。同MTF相比,ATL詳細定義了什么是源模型,怎樣創建目標模型,這樣可執行的程度更強,但是就只能單向執行,并且也相對復雜一些;
OCL,OCL用來定義模型轉換其實是水到渠成的一件事情,但是目前還不確定是否有可以運行的基于OCL的模型轉換語言。ATL中就使用了部分的OCL。
問題解決了么
當年在高中我學完經典力學時,認為所有問題都解決了,因為它是如此完美,上帝規定了所有的定律并創造了整個世界,然后用手輕輕一撥,世界便沿著宿命的軌跡運行到毀滅為止。后來才知道,有一種思想就叫宿命論。例如,我今晚選擇寫blog而不是去看網絡小說,是因為我的某些腦細胞收到了某些腦電流刺激,而這些都是一些物理定律決定的,因此當世界開始的時候,就注定了我今晚要寫blog。Hoho!后來才知道有什么概率問題,測不準原理等等上帝擲骰子的動作。
事實上,所有問題都沒有解決的一天,直到這個問題不再成為一個問題,沒有人再關注它是否解決為止。
模型編織是否能夠解決模型轉換中存在的問題呢?當然不能,它只是在某個方向上作了很好的探索而已,事實上,它并沒有觸及到模型轉換問題的本質所在。如我所言,模型編織事實上是一種模型轉換程序產生器,無論多么優秀,但是模型轉換程序本身不能解決的問題,它一樣不能解決。充其量它減少了一部分復雜性,多了一些可用性而已。
模型轉換是為了解決模型之間的自動轉換問題,或者說是為了自動生成軟件模型;軟件模型是為了解決高級語言代碼的自動生成問題;高級語言是為了自動生成匯編語言。。。現在我們可以在模型轉換上面再加一層了,可否就稱之為模型編織層?記不得在哪篇文章中看見過:當某個問題無法解決時,我們就在軟件中再加一層來折衷。我們到底是在寫軟件還是在做千層餅?
方法多了一種,路多了一條,但是問題依然存在。
題外話
我的blog又是兩個多月沒有更新了,這是有原因的(廢話!不算)。前一個月我在努力寫一篇論文,期間又去南京參加了一個會議。后一個月在家陪老婆生娃娃,努力喂奶換尿布做好爸爸,以至于累出胃病。不過成果是喜人的,特貼出小寶寶9天照,以資鼓勵:
