4

我想知道在我们的一个项目中用基于 DSL 的文件替换基于 XML 的表单文件。XML 文件描述了一个窗口,其中的组件放置在不同的容器中,并且事件侦听器附加到它们。UI 的类型表示它可以接受哪种数据以及如何将其保存回数据库。我知道这不是一个好的设计,但它是一个遗留系统,我们无法将整个架构从一天更改为另一天:)

我喜欢使用 DSL 来:

  • 提高可读性
  • 在 IDE 中提供代码完成(当前 XML 没有任何模式定义)
  • 可选地在 UI 定义中包含事件监听器代码

目前它看起来像:

<Form type="BIBLIOGRAPHY" name="BOOK" maximizable="false" minimizable="true">
  <Size width="320" height="240" />
  <Tab name="FIRST_PAGE">
    <Control type="INPUT.FIELD" name="SOME_FIELD" value="database_column" />
  </Tab>
</Form>

我喜欢用类似的东西代替它:

form(type=FormType.BIBLIOGRAPHY, name=FormName.BOOK, maximizable=false, minimizable=true) {
  size = { width = 320, height = 240 }
  tab(name="FIRST_PAGE") {
    input(name="SOME_FIELD", value="database_column")
  }
}

我考虑过将 Groovy 用作 DSL,它通过闭包和元类为此提供了良好的基础。但是我注意到代码完成需要 DSLD,并且仅在 Eclipse 和 IntelliJ 中支持使用这些。团队成员大多使用 NetBeans。因为具有正确编写的 XML Schema 的 XML 可以更好地支持这一点。

我还阅读了有关 Java DSL 的信息,在我的情况下,可以通过结合fluent API 接口构建器模式来实现。最大的优势是这会生成 Java 代码,因此代码完成、Javadocs 等一切都可以在 IDE 中开箱即用。我可以使用完全理解 Java 的 Groovy 来使用动态编译。然而,这引入了非标准 Java bean 和 Spring 之外的 setter(我们刚刚用 Spring 替换了项目的主干,所以它对我们很重要)。我不知道我们是否会直接在 Spring 中使用这些 UI 类,但我喜欢保留这个选项。此外,Java DSL 看起来有点难看,它可能需要大量的手写代码才能工作。

做这样的事情是一个好习惯吗?有没有其他解决方案可以做到这一点?

4

1 回答 1

1

我个人对内部 DSL 持怀疑态度,因为底层语言语法迟早会出现在您的表达式中,使它们看起来很难看,并最终迫使您真正理解在输入它们时发生的事情。因此,在您的情况下,我要么坚持使用基于 XML 的定义,要么使用普通的 Java fluent API/builder 模式。

于 2012-10-29T13:23:15.620 回答