用于描述UI的Java DSL?

时间:2012-10-07 21:48:59

标签: java eclipse netbeans user-interface dsl

我想知道在我们的一个项目中使用基于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")
  }
}

我考虑过using Groovy as a DSL,它为Closures和meta类提供了良好的基础。但是我注意到代码完成需要DSLD,并且只在Eclipse和IntelliJ中支持使用它们。团队成员主要使用NetBeans。因为具有正确编写的XML Schema的XML可以更好地支持它。

我也读过有关Java DSL的内容,在我看来,这可以通过组合fluent API interfacebuilder pattern来实现。最大的好处是,这会导致Java代码,所以代码完成,Javadocs,所有东西都在IDE中开箱即用。我可以使用完全理解Java的Groovy来使用动态编译。然而,这引入了非标准的Java bean,其中包含Spring的外部设置器(我们刚刚用Spring替换了项目的主干,所以它对我们很重要)。我不知道我们是否会直接使用这些UI类与Spring,但我喜欢保留这个选项。此外,Java DSL看起来有点难看,它可能需要大量手写代码才能工作。

做这样的事情是一种好习惯吗?还有其他解决办法吗?

1 个答案:

答案 0 :(得分:1)

我个人对内部DSL持怀疑态度,因为基础语言语法迟早会出现在你的表达式中,使它们看起来很难看,并最终迫使你在键入时真正理解引擎盖下发生的事情。因此,在您的情况下,我要么坚持使用基于XML的定义,要么使用纯Java流畅的API /构建器模式。