Eclipse 的模型驅(qū)動開發(fā)方法入門
簡介: 本文介紹了 Graphical Modeling Framework(GMF)項目,說明了如何開發(fā)一個簡單的 Eclipse Modeling Framework(EMF)模型,并使用 GMF 的工具將其轉(zhuǎn)換成典型的圖形化編輯器。
坦白說:過去在 Eclipse 里使用 Graphical Editor Framework(GEF)創(chuàng)建圖形化編輯器 既慢又痛苦。這個過程包括理解復雜的框架和大量的冗余代碼。但也說明 GEF 是創(chuàng)建圖形化編輯器的最佳框架,因為它與模型無關(guān)。另一方面,與模型無關(guān)本身也有一些問題。
GMF 的運行時組件是 IBM? 為使用 Eclipse Foundation 開發(fā)的,它以前還受 IBM Rational? 建模產(chǎn)品的支持。
GEF 是 Model-View-Controller(MVC)機制的精髓,它允許將您自己的模型引入表中。在使用 GEF 的早期,大多數(shù)人還使用自定義模型(考慮傳統(tǒng) Java 對象 [Plain Old Java? Object, POJO])。您會發(fā)現(xiàn)自定義模型帶來的問題是需要自己編寫通用代碼來支持模型,如序列化及偵聽模型更改的功能。
在 GEF 中使用模型的下一個邏輯步驟是要使用 Eclipse Modeling Framework(EMF),EMF 提供了以各種形式將模型序列化的工具和偵聽對模型默認值的更改的功能。
如果您覺得缺乏 Eclipse Modeling Framework(EMF)方面的基礎(chǔ)知識,或想要強化關(guān)于 EMF 的一般知識,建議您看書或者 developerWorks 中的一系列介紹性文章,這些都是非常好的參考資料。有關(guān)這些參考資料和其他 EMF 參考資料,請參閱 參考資料。
但是,將 EMF 模型與 GEF 框架整合在一起有一定的技術(shù)難度(如不同的命令堆棧),導致 EMF 模型并沒有很快被基于 GEF 的編輯器接受。最終,GMF 項目在這種逆境中應(yīng)運而生,并希望能夠引入一種快速生成圖形化編輯器的方法。通過類似的方法,EMF 生成適用于 EMF 模型的基本編輯器。
創(chuàng)建模型的第一步就是定義 EMF 模型的協(xié)作對象。我寫這篇文章的目的只是說明定義模型的過程,而不是深入講解 EMF 提供的模型處理工具的用法。本例中將要使用的模型是一個簡單的圖形化模型。我將通過一張圖來幫助我說明模型的外觀。
如您所見,使用模型是幫助我們理解各部分之間關(guān)系的一種簡單方法。這個模型由圖形、連接和圖形化圖表組成。
EMF 支持通過多種方法定義模型。為簡單起見,我決定使用加注的 Java 技術(shù)。下面的代碼清單說明了如何使用 EMF 定義模型。第一個模型對象是一個有名稱屬性、源連接和目標連接(Connection
類型)的圖形。請注意,這是一個抽象的 EMF 類。
/** * @model abstract="true" */public interface Shape {/** * @model */String getName();/** * @model type="com.ibm.model.shapes.model.Connection" containment="true" */List getSourceConnections();/** * @model type="com.ibm.model.shapes.model.Connection" */List getTargetConnections();} |
接下來定義囊括所有圖形的列表的圖形化圖表。
/** * @model */public interface ShapesDiagram {/** * @model type="com.ibm.model.shapes.model.Shape" containment="true" */List getShapes();} |
接下來定義一些特殊的圖形使模型更加生動。
/** * @model */public interface RectangularShape extends Shape {} |
/** * @model */public interface EllipticalShape extends Shape {} |
最后,再添上連接就可以了,這樣就能將各種圖形真正連接在一起。
/** * @model */public interface Connection {/** @model */Shape getSource();/** @model */Shape getTarget();} |
使用 Java 編程語言定義了模型后,請單擊 File > New > Eclipse Modeling Framework > EMF Model(參見圖 2)定義一個新的 EMF genmodel。注意:如果還沒有 EMF 項目,就先創(chuàng)建一個。
如果在生成 EMF 模型遇到問題,請參閱名為 "Generating an EMF Model" 的教程,它可以幫助您入門。請參閱 參考資料。
創(chuàng)建了 EMF genmodel 后,請在文件上單擊鼠標右鍵,并確保生成 Model 和 Edit 組件(您只需選擇 Generate All 就可以輕松地完成)。
GMF 需要您先創(chuàng)建一組模型,然后生成圖形化編輯器。圖 3 顯示了創(chuàng)建這些模型所涉及的過程。我們需要使用的第一個模型是圖形化定義,它定義了編輯器生成后的視覺效果。接下來是工具定義,它包括與編輯器面板、菜單等相關(guān)的事務(wù)。最后,還需要一個模型就是映射定義,相信您猜得到,它用于定義業(yè)務(wù)邏輯(EMF 圖形化模型)與可視化模型(圖形化和工具定義)之間的映射。
GMF 有個叫 GMF 指示板(Window > Show View > Other > GMF Dashboard)的實用程序非常好。它可以幫助您用一種簡單的方法完成圖形化編輯器生成過程。在這個階段,您必須選定域模型和域 genmodel。
GMF 有一個優(yōu)秀的備忘單,它可以幫助您完成用 GMF 生成編輯器的創(chuàng)建過程。建議將此備忘單與 GMF 指示板結(jié)合使用。請通過菜單項 Help > Cheat Sheets... 訪問備忘單。
需要創(chuàng)建的第一個模型是圖形化定義模型(在指示板的 Graphical Def Model 下單擊創(chuàng)建超級鏈接)。確保選擇 Canvas 為模型對象。這個模型很容易創(chuàng)建:
注意:如果您在執(zhí)行此任務(wù)時遇到問題,您可以下載一個樣例插件,此插件為您準備好了所有模型。
這個步驟需要定義工具定義模型,使用此模型可以定義圖形化編輯器的信息類面板和菜單。要定義工具定義模型,請打開 GMF 指示板,然后單擊 Create。我們的簡單模型只需定義一個面板和一些創(chuàng)建工具來輔助創(chuàng)建模型(參見圖 6)。
所有工作都從映射定義模型 開始。在此模型中,我們將可視化(圖形)模型映射到業(yè)務(wù)邏輯(域模型)中。GMF 有一組有序向?qū)Э梢詭椭鷦?chuàng)建映射定義。請通過 File > New > Graphical Modeling Framework > Guide GMFMap Creation 調(diào)用這組向?qū)?。第一步要選擇所有 GMF 模型(參見圖 7)。
接下來,向?qū)⒅悄艿靥崾疚覀冞x擇要使用哪個模型元素作為圖表根元素。在我們舉的例子中,此模型元素為 ShapesDiagram。
最后,GMF 會像變魔術(shù)一樣算出哪些模型元素必須映射到哪些可視化元素上。
可以使用基本編輯器編輯 GMF 映射定義文件來添加更多高級自定義功能。要勇敢地去嘗試!
必須注意的是:這些向?qū)Э赡軙S著 GMF 的發(fā)展而改變。據(jù)說使用 GMF 自身提供的圖形化編輯器就可以幫助創(chuàng)建映射定義文件(和其他 GMF 模型)。
整個過程的最后一步也是最有趣的一步是生成圖形化編輯器。這需要您先通過映射定義模型創(chuàng)建一個 GMFGen 模型。然后,在映射定義文件上單擊鼠標右鍵并選擇 Create generator model...。這樣,一個包含使用圖形化編輯器所需的全部代碼的新項目就生成了。要使用圖形化編輯器,請啟動一個新的 Eclipse 運行時工作臺,然后轉(zhuǎn)到 File > New > Examples > Model Diagram(參見圖 10)。
模型文件創(chuàng)建后,您就應(yīng)當能夠使用生成的編輯器了(參見圖 11)。很不錯,是吧?
通過映射定義文件獲得的 GMFGen 模型是可以根據(jù)需要加以修改的。例如,GMFGen 模型的屬性就可以使用屬性視圖進行編輯。GMFGen 模型還有可以控制生成代碼的命名規(guī)則、生成的編輯器是否支持打印功能及很多其他自定義操作的屬性。試試這些選項,然后根據(jù)您的需求對其進行自定義。
必須注意的是:我們構(gòu)造并生成的編輯器僅用到了 GMF 功能的一小部分。您可以做很多改動來利用框架的高級功能。
例如,GMF 支持驗證。這句話的含義是:如果我們要限定圖形化模型,只許與每個模型元素有一個連接會怎樣?只允許相似的元素相互連接,還是對可用于圖形的名稱類型進行控制?GMF 完全能夠支持這些類型的驗證,甚至其他驗證。對于驗證,GMF 利用了 Eclipse Modeling Framework Technology(EMFT)來支持涉及使用 Java 代碼和對象約束語言(Object Constraint Language,OCL)來定義驗證器的情況。GMF 將給未通過驗證的文件安插錯誤標記,這類似于 Eclipse 對未編譯的 Java 文件的處理方法。要查看關(guān)于 GMF 支持內(nèi)容的更多信息,請參閱 參考資料。
我的目的有兩個:一是展示支持模型驅(qū)動開發(fā)的 Eclipse Callisto 發(fā)行版中令人興奮的新的一面;二是讓您了解它有多棒,只需 15 分鐘就能在 Eclipse 中生成圖形化編輯器。
描述 | 名字 | 大小 | 下載方法 |
---|---|---|---|
Sample plug-in | os-ecl-gmf.zip | 41KB | HTTP |
學習
獲得產(chǎn)品和技術(shù)
討論
Chris Aniszczyk 是 IBM Lotus 的軟件工程師,是 IBM 的 Extreme Blue 實習項目的畢業(yè)生。他是衷心的開放源碼支持者,并在 Gentoo Linux(http://www.gentoo.org)發(fā)行方面工作,是 Eclipse Modeling Framework Technology(EMFT)項目的參與者。