我想知道在我们的一个项目中用基于 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 看起来有点难看,它可能需要大量的手写代码才能工作。
做这样的事情是一个好习惯吗?有没有其他解决方案可以做到这一点?