接觸Eclipse一段時間的朋友應該都聽說過EMF這個名字,EMF是Eclipse Modeling Framework的縮寫,它是Eclipse的一個重要的子項目,如果翻譯成中文就是“Eclipse 建模框架”。其實只從這個名字還真是難以確定它的作用是什麼,我認為要完全掌握 EMF應該對模型驅動開發(MDA)有一定的了解,而EMF可以看作是Eclipse上的MDA一個實現(代 碼生成是MDA 的重要組成部分之一),它能夠生成在Eclipse上執行的代碼。可惜我對MDA沒 有系統研究過,對EMF的應用大多是為了減少模型修改帶來的影響,所以也希望EMF能帶我進 入MDA的世界。
MDA講究的是把模型和應用系統實現分開,模型是最重要的部分,可以說有了清楚的模型 ,就完成了一半的工作。模型是由元模型(Meta Model)定義的,例如UML裡“類 ”和“屬性”這些概念是在UML的元模型裡定義的,而元模型又是由“ 元元模型”來定義,後者多是自描述的,也就是能夠自己定義自己,所以很少見到 “元元元模型”的概念。在MOF規范裡,元元模型處於M3層,元模型處於M2層,往 下的M1層是模型,而M0層是實例。EMF定義了一套Ecore元模型,該模型是EMOF(MOF的一個子 集, MOF是Meta-Object Facility的縮寫)的一個實現,這是一個自描述的模型,可以認為 它處於MOF中的M2層,即與UML元模型相同的位置。用Ecore元模型可以定義 ecore模型,也就 是.ecore文件,這個模型處於M1層,而ecore模型的實例處於M0層。關於MOF的更多概念請參 考MOF規范和相關文檔, MDA的各種概念是相當多的,研究它的人也很多,我認為EMF算是比 較務實的一派。如果以後有機會深入研究Ecore元模型,我也會把心得寫在這裡供大家參考。
EMF自發布以來一直受到Eclipse社區的熱情擁護,目前很多Eclipse的子項目都是基於它 開發的,可見EMF確實能給開發者帶來好處。隨著EMF的成長,出現了越來越多的文檔,在 eclipse.org/emf上就可以找到不少,最全面和權威的當屬這本Eclipse Modeling Framework A Developers Guide,完整的講解了EMF,雖然針對的版本較早,但絕大部分內容還是適用的 ;作為入門讀物,網站上Documents裡列出的一些教程也是不錯的選擇;EMF的新聞組更是一 個很好的交流場所,Ed Merks(EMF設計師之一)和其它幾位開發人員可以說是有問必答,感 謝他們的認真態度。
通過在一些項目裡使用EMF,我也逐漸感覺了到它起到的作用,特別是當模型裡各種元素 和關系比較多時,EMF的代碼生成功能會節省不少工作量,對於我們開發人員來講,這不就是 最大的好處嗎。其實用EMF構造一個應用的步驟很簡單:1、構造模型,2、生成代碼,前者可 以通過UML類圖、Java接口、 XML Schema等多種方式定義,後者可以選擇只生成模型部分的 代碼,也可以同時生成編輯器部分的代碼,對這個編輯器做一些定制就可以得到符合需求的 應用程序。
類圖可以幫助我們直觀的了解應用系統裡各對象的關系,但在開發過程中,類圖裡的定義 很可能被修改,如果這一修改沒有及時反映回類圖,類圖就會逐漸變得不准確而失去作用。 但是保持代碼和類圖的一致是一件很煩瑣的工作,有時由於項目管理的需要,類圖又必須保 證能夠反映系統的真實結構。比較好的解決方法是讓代碼由類圖直接生成,模型需要修改時 也在類圖上做改動,並且重新生成代碼,這正是EMF的專長。
說了這麼多,你可能還是沒弄明白EMF到底能為我們帶來哪些好處,是怎樣為我們節省工 作量的,從下個帖子開始我們將一步步了解怎樣使用EMF構造應用程序。因為是邊用邊寫,所 以這個系列的帖子都不會太長,相信後面部分會以心得和技巧等內容為主。