Why should I use EMF?

18

我已经阅读了关于 EMF一些 教程,但我仍然不知道为什么要使用它。

直到现在,我都是通过 XSD 模式 + JXC 或手动方式生成我的 POJOs。

据我所知,EMF 可以用于定义类之间的某些复杂关系(一对多等)。但这就是全部吗?使用 EMF 生成代码是否更加复杂?是否会增加一些额外的依赖关系?

4个回答

18
一般来说,使用 EMF 在运行时提供了几个好处。
首先,您会注意到 Ecore 类(以及 EMF 运行时)为应用程序中的 POJO 提供了所需的功能。在许多领域中不需要进一步编码,当使用普通的 POJO 时需要手动编写大量代码:
- 您可以获得完整的通知系统(不再需要 PropertyChange 编码)。它甚至为发生在实例树下方的更改提供通知(将侦听器附加到 x,在 y 中发生更改会收到通知,y 是由 x 引用的)。 - 值是可取消设置的(实际上是很常见的需求:您需要知道一个值的 3 种状态:已设置、设置为 null 或未触及)。 - 双向引用:X 引用 Y,反之亦然。从 X 中删除对 Y 的引用,相反的引用也会被删除。 - XML、XMI(等)序列化支持开箱即用。 - 惰性加载:您可以分区模型,并且只有某些部分才会惰性加载。 - 等等。
EMF 的扩展甚至提供了更多功能:
- EMF Query 或 EMF Path 添加了高级查询能力,以收集符合给定条件的 Pojo 实例。 - CDO 允许您编写 3 层应用程序而不需要任何手动编码。CDO 添加了数据库持久性和远程通知(会话、事务、版本控制、分支等)。 - Xtext 添加了自定义 DSL 的序列化功能(定义自己的序列化格式/语言)。 - 等等。
您实际上可以认为 EMF / Ecore 提供了一个 POJO 标准,整个生态系统都围绕它而建立,实际上提供了您在传统方法中手动编码的内容。
老实说,EMF 的缺点是您会受到 Ecore 运行时的限制,如果您在服务器端,则可能会成为问题。

2
需要注意的是,即使在不运行于Equinox的纯OSGi应用程序中,EMF也可以独立使用。您只需要3个捆绑包:org.eclipse.emf.ecore、org.eclipse.emf.ecore.xmi和org.eclipse.emf.common。 - Viliam Simko

14

如果您只关心生成POJOs,那么我同意有许多其他替代方案可以实现与EMF相同的功能。

但是,Java生成只是EMF的第一个应用程序。现在有许多基于EMF的Eclipse插件,免费提供了大量功能来操作(查询、验证、转换等)您的EMF模型。

请参阅Eclipse Modeling Project以获取EMF的官方Eclipse项目列表。

此外,看一下Acceleo,了解他们基于模板的从EMF模型生成(Java、PHP等)的灵活性。


3

除了Jordi所说的,EMF还提供了通知机制,与XML Beans不同,它允许您向模型更改添加监听器。因此,当模型发生更改时,您会收到有关此更改的通知。

我已经成功地使用EMF Query使用类似SQL语法和OCL搜索模型。 EMF Validation是一个很好的框架,可以根据模式定义验证模型,并引入自己的验证逻辑(如果无法在模式中表达)。


0
在高层次上,EMF 是 MOF 标准的一个实现,用于模型驱动工程或 MDA。因此,使用 EMF,您可以从生成的 Java 代码中访问它们的模型,而不仅仅是 Java 对象。这比仅具有 Java 反射功能要多得多。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接