2012-10-07 45 views
3

我想知道如何用基於DSL的文件替換我們項目中的基於XML的表單文件。 XML文件描述了一個窗口,其中的組件放置在不同的容器中,並且事件監聽器被附加到它們上面。 UI的類型表示它可以接受哪種類型的數據以及它如何保存回數據庫。我知道這不是一個很好的設計,但它是一個遺留系統,我們不能整個建築從第一天更改爲另一個:)用於描述UI的Java DSL?

我喜歡使用DSL來:

  • 提高可讀性
  • 提供代碼完成在集成開發環境(當前個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中支持這些DSLD。團隊成員主要使用NetBeans。因爲具有正確書寫的XML模式的XML可以更好地支持這一點。

我也讀過關於在我的情況下可以通過結合fluent API interfacebuilder pattern實現的Java DSLs。最大的好處是這會產生Java代碼,因此代碼完成,Javadocs,IDE中的所有功能都可以正常工作。我可以通過使用充分了解Java的Groovy來使用動態編譯。然而,這引入了非標準的Java bean和Spring以外的setter(並且我們剛剛用Spring完成了項目的主幹,所以對我們來說很重要)。我不知道我們是否會直接使用這些UI類,但我喜歡保留這個選項。另外Java DSL看起來有點難看,並且需要大量的手寫代碼才能工作。

做這樣的事情是否是一種很好的做法?有沒有其他解決方案來做到這一點?

+2

我一直在groovFX(http://groovyfx.org/)上使用groovy DSL來創建UI。我個人的意見是:這是一個完整的混亂。我也在使用grails,它包含大量的DSL來配置項目。而且,恕我直言,這也是一團糟...起初,我對groovy DSL非常熱衷,但更多的使用它們,我會說我更喜歡一個更詳細的普通的老式java builder/fluent API。 – Guillaume

+1

您是自己編寫Java API還是使用某種框架? – NagyI

+1

我已經在Java中編寫了一些構建器/流暢接口DSL(用於SQL查詢,「約束」驅動gui和其他小事情)。用Java編寫這很痛苦,而作爲客戶端代碼編寫起來有點冗長。對於groovy,我只是一個用戶,但我真的錯過了IDE自動完成功能:你必須與文檔一起寫東西,而且當你想維護東西時你必須這樣做;而在Java中,您可以使用自動完成和源代碼檢查。 Groovy DSL對於具有「非有限」結構的語言來說相當不錯(比如解析隨機XML)。 – Guillaume

回答

1

我個人非常懷疑內部DSL,因爲底層語言語法遲早出現在你的表達式中,使得它們看起來很醜,並最終迫使你真正理解當你鍵入它們時發生了什麼。所以在你的情況下,我會堅持使用基於XML的定義或使用普通的Java流利API /構建器模式。