用于描述 UI 的 Java DSL?

标签 java eclipse netbeans user-interface dsl

我想知道如何将我们的一个项目中基于 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/

相关文章:

java - 将原始音频编码为 mp3/ogg

java - MySQL 不使用 netbeans 将插入推送到数据库中

java - netbeans:链接应用程序和 View ?

java - 如何在注解中使用注解?

java - 如何修复操作 switch 语句

android - PhoneGap-在新设备上不起作用

android - 加载失败的 Android 虚拟设备

java - Eclipse 扩展和声明式服务

Java JRebel 与 MyRebel 许可证插件

Java 特征求解器