首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

使用 EMF 實現模型驅動開發,第 1 部分:建立 UML 模型與代碼生成

     編輯:Java 相關知識

EMF 核心價值

Eclipse Modeling Framework(EMF)是實現模型驅動架構(MDA)的開源框架。核心能力:

  • 從 UML、XML Schema、帶註解的 Java 介面三種模型來源生成代碼
  • 生成代碼支援完整 CRUD、關聯關係、繼承結構、約束驗證
  • 內建通知機制、參照完整性、可客製化 XMI 持久化
  • 一鍵同步模型變更至代碼,支援圖形化編輯器生成
  • 實現 OMG MOF 2.0 標準,為 EMF:XSD、Hyades 等 Eclipse 專案基石

三種模型定義方式

方式一:UML + Omondo 插件

  1. 建立 EMF 類別圖 forum.ucd,產生 .ecore 模型檔
  2. 定義類別:Forum、Member、Topic、Post
  3. 屬性型別使用 Ecore 對應型別(EString、EInt 等)
  4. 建立關聯:Forum→Member (members)、Forum→Topic (topics) 含 containment、navigable 設定
  5. 定義枚舉 TopicCategory:ANNOUNCEMENT(0)、GUEST_BOOK(1)、DISCUSSION(2)
  6. 建立 EMF 專案,從 .ecore 載入生成 forum.genmodel

方式二:XML Schema (XSD)

適用於需精確控制 XML 序列化格式的場景。關鍵語法:

<xsd:simpleType name="TopicCategory">
  <xsd:restriction base="xsd:NCName">
    <xsd:enumeration value="Announcement"/> ...
  </xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="Post">
  <xsd:sequence>
    <xsd:element name="comment" type="xsd:string"/>
    <xsd:element name="author" type="xsd:anyURI" ecore:reference="forum:Member"/>
  </xsd:sequence>
</xsd:complexType>

透過 ecore:reference 實現跨型別引用。同樣透過 EMF 專案向導從 XSD 載入生成 genmodel。

方式三:帶註解的 Java 介面

最貼近開發者習慣的方式。核心規則:

  • 介面屬性對應 getter 方法,於 JavaDoc 加入 @model 標籤
  • 集合屬性需指定 type 與 containment
  • 雙向關聯使用 opposite 指定反向導航屬性
  • 枚舉定義為 class 而非介面,常數加 @model name="..."
public interface Forum {
  @model type="Topic" containment="true"
  List getTopics();
  
  @model type="Member" containment="true"
  List getMembers();
  
  @model
  String getDescription();
}

GenModel 客製化與代碼生成

生成的 forum.genmodel 可視化編輯器允許調整:

  • 版權聲明、基礎套件、生成選項(Schema、Edit、Editor 代碼)
  • 模型描述變更後,右鍵 Reload 同步更新

三種生成目標

目標產出內容
Generate Model Codecom.ibm.example.forum(介面/工廠)、.impl(實作)、.util(AdapterFactory)
Generate Edit Codecom.ibm.example.forum.edit → .provider(編輯器項目提供者)
Generate Editor Codecom.ibm.example.forum.editor → .presentation(JFace 圖形編輯器)

驗證生成的插件編輯器

  1. Run → Run... → Runtime Workbench → New 啟動 Eclipse 運行時工作台
  2. 啟用所有工作區插件
  3. 新建 Simple 專案,使用 Example EMF Model Creation Wizards 建立 sample.forum
  4. 圖形編輯器支援 Tree、Table、TableTree 等多視圖,Outline 視圖同步導航

客製化生成代碼:@generated 標記保護機制

EMF 生成代碼的 JavaDoc 均標記 @generated。刪除此標記後重新生成,JMerge 將保留手動修改。實例:

  • 修改 ForumEditor.createPages() 增加 Table 欄位(Author、Posts 數)
  • 於 TopicItemProvider 實作 ITableItemLabelProvider 客製化欄位顯示邏輯
  • 於 ForumItemProviderAdapterFactory 註冊新介面支援

程式化操作 EMF 模型

載入模型

Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
Map m = reg.getExtensionToFactoryMap();
m.put("forummodel", new XMIResourceFactoryImpl());
ResourceSet resSet = new ResourceSetImpl();
Resource res = resSet.getResource(URI.createURI("model/forum.forummodel"), true);
Forum forum = (Forum) res.getContents().get(0);

建構模型

ForumPackageImpl.init();
ForumFactory factory = ForumFactory.eINSTANCE;
Forum forum = factory.createForum();
forum.setDescription("programmatic forum example");
Member admin = factory.createMember();
admin.setNickname("Administrator");
forum.getMembers().add(admin);
Topic notice = factory.createTopic();
notice.setTitle("Notices");
notice.setCategory(TopicCategory.ANNOUNCEMENT_LITERAL);
notice.setCreator(admin);
forum.getTopics().add(notice); // 雙向關聯自動維護 creator/topicsCreated

持久化儲存

URI fileURI = URI.createFileURI("model/forum.ecore");
Resource resource = new XMIResourceFactoryImpl().createResource(fileURI);
resource.getContents().add(forum);
resource.save(Collections.EMPTY_MAP);

根物件 Forum 含有所有子物件,僅需儲存根即可級聯持久化。非 containment 關聯物件需顯式 resource.getContents().add()。

結語

EMF 提供從模型定義到代碼生成、編輯器構建、持久化的完整工具鏈。三種模型來源滿足不同團隊習慣,生成代碼具備企業級品質且支援增量客製化。配合圖形化編輯器與程式化 API,EMF 讓模型驅動開發真正落地。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved