2011-04-01 67 views
14

我讀過sometutorialsEMF我仍然想知道爲什麼我應該使用它。我爲什麼要使用EMF?

到現在爲止,我從XSD架構+ JXC或手動生成POJO。

就我所瞭解的EMF而言,定義類之間的一些複雜關係(一對多等)會很有用。但是,這一切?用EMF生成代碼不是更復雜嗎?它不是增加了一些額外的依賴嗎?

回答

12

如果你唯一的興趣是POJO的產生,那麼我同意有許多選擇可以實現與EMF一樣的功能。

但是,Java代是EMF的第一個應用程序。現在有大量基於EMF的Eclipse插件可以免費提供很多功能來操作(查詢,驗證,轉換......)您的EMF模型。

請參閱Eclipse Modeling Project以獲取EMF官方Eclipse項目的列表。

此外,請看Acceleo以查看EMF模型(適用於Java,PHP,...)的基於模板的生成方法的靈活性。

3

添加到Jordi說的EMF提供的通知機制與XML Beans不同,例如,允許您將監聽器添加到模型更改。因此,當模型發生變化時,您會收到有關此更改的通知。

我已經成功地使用EMF查詢搜索使用類似SQL的語法的模型,並使用OCL。 EMF驗證是一個很好的框架,用於基於模式中定義的內容來驗證模型,並且在模式中無法表示自己的驗證邏輯。

15

一般而言,可以說使用emf在運行時提供了幾個好處。

在第一個階段,您會注意到ecore類(和emf運行時)爲您的應用程序中的POJO提供了您可能需要的內容。在很多領域沒有進一步的編碼需要,而在使用普通POJO時需要手工編碼:

  • 您將得到一個完整的通知系統(不需要PropertyChange編碼)。它甚至提供了在實例樹中進一步發生的更改的通知(將偵聽器附加到x,獲取由x引用的y中的更改通知)。
  • 值是不可設置的(實際上是一個非常普遍的需求:您需要知道約3個值的狀態:它已設置,它被設置爲null或未被觸摸)。
  • 雙向引用:X引用Y,反之亦然。在X中刪除對Y的引用,相反的引用也被刪除。
  • XML,XMI(等)序列化支持開箱即用。
  • 延遲加載:您可以對模型進行分區,並且只會緩慢加載某些部分。

擴展到EMF甚至提供更:

  • EMF查詢或EMF路徑代碼的三層應用程序添加高級查詢功能,可收集POJO實例給定指標分析
  • CDO讓你沒有任何進一步的手工編碼。 CDO增加了數據庫的持久性和遠程通知(會話,事務,版本,分支等)
  • 的Xtext增加了序列化定製的DSL(定義自己的序列化格式/方言)

你可以實際上認爲EMF/Ecore爲POJO提供了一個標準,整個生態系統都圍繞它進行了擴展,實際上它提供了您將用傳統方法手工編寫的代碼。

說實話,EMF的缺點是,如果您編寫基於Eclipse的胖客戶端,但您可能會成爲一個問題,如果您在服務器上,那麼您將被綁定到Ecore運行時非常好。

+2

應該指出的是,EMF可以單獨使用,即使在純粹的基於OSGi的應用程序中沒有在Equinox中運行。你只需要3個包:org.eclipse.emf.ecore,org.eclipse.emf.ecore.xmi和org.eclipse.emf.common – 2014-11-12 14:22:01