Reputation: 5997
I'm wondering about replacing the XML based form files in one of our projects with DSL based files. An XML file describes a window with components placed in different containers and event listeners are attached to them. The type of the UI denotes which kind of data it can accept and how it's saved back to the database. I know it's not a good design but it's a legacy system, we cannot change the whole architecture from one day to an another :)
I like to use DSL to:
Currently it looks something like:
<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>
and i like to replace it with something like:
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")
}
}
I've thought about using Groovy as a DSL which provides a good base for this with Closures and meta classes. However i've noticed that code completion requires DSLDs and using these are only supported in Eclipse and IntelliJ. Team members mostly work with NetBeans. Because of that XML with a correctly written XML Schema can support this better.
I've also read about Java DSLs which in my case can be realized by combining the fluent API interface and the builder pattern. The big advantage is that this results in Java code, so code completion, Javadocs, everything works out of the box in IDEs. I can use dynamic compilation by using Groovy which fully understands Java. However this introduces non-standard Java beans with setters foreign to Spring (and we've just finished replacing the project's spine with Spring so it's important to us). I don't know if we'll ever use these UI classes directly with Spring but i like to keep this option. Also Java DSLs look a little bit ugly and it can require a lot of hand written code to work.
Is it a good practice to do something like that? Is there any other solution to do this?
Upvotes: 4
Views: 1334
Reputation: 8926
I am personally very skeptical about internal DSLs, because the underlying language syntax, sooner or later, comes out in your expressions making them look ugly and eventually forces you to really understand what is happening under the hood when you type them. So in your case I would either stick with the XML-based definition or use plain Java fluent API/builder pattern.
Upvotes: 1