【问题标题】:Why should I use EMF?为什么要使用 EMF?
【发布时间】:2024-05-04 14:55:03
【问题描述】:

我已经阅读了 some tutorials 关于 EMF 的文章,但我仍然想知道为什么要使用它。

到目前为止,我都是从 XSD 架构 + JXC 或手动生成我的 POJO。

据我了解 EMF,定义类之间的一些复杂关系(一对多等)可能很有用。但仅此而已吗?用 EMF 生成代码不是更复杂吗?不是增加了一些额外的依赖吗?

【问题讨论】:

    标签: java xsd eclipse-emf


    【解决方案1】:

    高级 EMF 是模型驱动工程或 MDA 的 MOF 标准的实现。因此,使用 EMF,您可以从生成的 Java 代码中访问,而不是访问 Java 对象,而是访问它们的模型。如果不仅仅是 Java 反射功能的话。

    【讨论】:

      【解决方案2】:

      一般来说,可以说使用 emf 在运行时提供了多种好处。

      在第一阶段,您会注意到 ecore 类(和 emf 运行时)提供了您在应用程序中的 POJO 中可能需要的东西。在很多领域都不需要进一步编码,而在使用普通 POJO 时您需要手动编写很多代码:

      • 您将获得一个完整的通知系统(不再有 PropertyChange 编码)。它甚至为在您的实例树中进一步发生的更改提供通知(将侦听器附加到 x,获得 x 引用的 y 更改的通知)。
      • 值是不可设置的(实际上是一个非常普遍的需求:您需要了解一个值的 3 种状态:已设置、已设置为 null 或未触及)。
      • 双向引用:X 引用 Y,反之亦然。删除 X 中对 Y 的引用,相反的引用也被删除。
      • 开箱即用的 XML、XMI(等)序列化支持。
      • 延迟加载:您可以对模型进行分区并仅延迟加载某些部分。

      EMF 的扩展甚至提供了更多功能:

      • EMF 查询或 EMF 路径添加高级查询功能以收集给定条件的 pojo 实例
      • CDO 允许您编写 3 层应用程序,而无需任何进一步的手动编码。 CDO 添加了数据库持久性和远程通知(会话、事务、版本控制、分支等)
      • Xtext 将序列化添加到自定义 DSL(定义您自己的序列化格式/方言)

      您实际上可以争辩说,EMF/Ecore 为 POJO 提供了一个标准,并且围绕它发展了一个完整的生态系统,实际上提供了您可以以经典方法手动编码的内容。

      说实话,EMF 的缺点是你会依赖于 Ecore 运行时,如果你编写基于 Eclipse 的富客户端,这非常好,但如果你在服务器上可能会成为一个问题。

      【讨论】:

      • 应该注意的是,EMF 可以独立使用,即使在不运行在 Equinox 中的纯粹基于 OSGi 的应用程序中也是如此。您只需要 3 个包:org.eclipse.emf.ecore、org.eclipse.emf.ecore.xmi 和 org.eclipse.emf.common
      【解决方案3】:

      除了 Jordi 所说的之外,EMF 提供了通知机制,它与 XML Beans 不同,例如,允许您添加侦听器以进行模型更改。因此,当模型发生更改时,您会收到有关此更改的通知。

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

      【讨论】:

        【解决方案4】:

        如果您唯一的兴趣是 POJO 的生成,那么我同意有许多替代方案可以实现与 EMF 相同的效果。

        然而,Java 生成只是 EMF 的第一个应用。现在有大量基于 EMF 的 Eclipse 插件可以免费为您提供很多功能来操作(查询、验证、转换......)您的 EMF 模型。

        有关 EMF 上的官方 Eclipse 项目列表,请参阅 Eclipse Modeling Project

        此外,请查看Acceleo,了解他们从 EMF 模型(用于 Java、PHP 等)中基于模板的生成方法的灵活性。

        【讨论】: