我想知道如何将我们的一个项目中基于 XML 的表单文件替换为基于 DSL 的文件。一个 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")
}
}
我想过using Groovy as a DSL这为闭包和元类提供了良好的基础。但是我注意到代码完成需要 DSLD,并且仅在 Eclipse 和 IntelliJ 中支持使用它们。团队成员主要使用 NetBeans。因为具有正确编写的 XML 模式的 XML 可以更好地支持这一点。
我还阅读了有关 Java DSL 的内容,在我的例子中,它可以通过结合 fluent API interface 来实现。和 builder pattern .最大的优势是这会生成 Java 代码,因此代码完成、Javadocs,一切都在 IDE 中开箱即用。我可以通过使用完全理解 Java 的 Groovy 来使用动态编译。然而,这引入了非标准的 Java bean,其中的 setter 与 Spring 无关(我们刚刚用 Spring 替换了项目的主干,所以它对我们很重要)。我不知道我们是否会直接在 Spring 中使用这些 UI 类,但我想保留这个选项。此外,Java DSL 看起来有点难看,它可能需要大量手写代码才能工作。
做这样的事情是一种好习惯吗?还有其他解决方案吗?
最佳答案
我个人对内部 DSL 持怀疑态度,因为底层语言语法迟早会出现在您的表达式中,使它们看起来很难看,并最终迫使您真正理解在您键入它们时发生的事情。因此,在您的情况下,我要么坚持使用基于 XML 的定义,要么使用普通的 Java 流畅 API/构建器模式。
关于用于描述 UI 的 Java DSL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12773151/