2011-04-01 37 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