我想知道如何用基於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 interface和builder pattern實現的Java DSLs。最大的好處是這會產生Java代碼,因此代碼完成,Javadocs,IDE中的所有功能都可以正常工作。我可以通過使用充分了解Java的Groovy來使用動態編譯。然而,這引入了非標準的Java bean和Spring以外的setter(並且我們剛剛用Spring完成了項目的主幹,所以對我們來說很重要)。我不知道我們是否會直接使用這些UI類,但我喜歡保留這個選項。另外Java DSL看起來有點難看,並且需要大量的手寫代碼才能工作。
做這樣的事情是否是一種很好的做法?有沒有其他解決方案來做到這一點?
我一直在groovFX(http://groovyfx.org/)上使用groovy DSL來創建UI。我個人的意見是:這是一個完整的混亂。我也在使用grails,它包含大量的DSL來配置項目。而且,恕我直言,這也是一團糟...起初,我對groovy DSL非常熱衷,但更多的使用它們,我會說我更喜歡一個更詳細的普通的老式java builder/fluent API。 – Guillaume
您是自己編寫Java API還是使用某種框架? – NagyI
我已經在Java中編寫了一些構建器/流暢接口DSL(用於SQL查詢,「約束」驅動gui和其他小事情)。用Java編寫這很痛苦,而作爲客戶端代碼編寫起來有點冗長。對於groovy,我只是一個用戶,但我真的錯過了IDE自動完成功能:你必須與文檔一起寫東西,而且當你想維護東西時你必須這樣做;而在Java中,您可以使用自動完成和源代碼檢查。 Groovy DSL對於具有「非有限」結構的語言來說相當不錯(比如解析隨機XML)。 – Guillaume