Groovy for Domain-specific Languages - Second Edition

(nextflipdebug2) #1
Chapter 7

[ 145 ]

The breakdown of the calling sequence is then as follows:



  • Calling deposit returns a Map with an entry currency, which is a closure

  • Calling currency returns another Map with an entry to which is a closure
    that can be called just like a method, as described earlier

  • Calling to does the conversion based on the parameters passed to deposit
    and currency and sets the balance on the Account passed to itself:


given:
Account savings = new Account()

when:
deposit (100.00).currency(USD).to(savings)
deposit 100.00 currency GBP to savings

then:
savings.balance == 230.0

Builders


Much of what we do in writing software involves construction or assembly of some
sort or other. It could be building a graphical user interface, constructing a file to be
saved on disk, or structuring a response to be sent to another system through a web
services request. A lot of coding effort is dedicated to getting the structure of what
we are building correct. Web pages need to be structured correctly in order to be
displayed in a browser. XML-based files and responses to service requests need to be
well-formed or they will cause validation exceptions. Building rich client UIs is an art
in itself, with each client framework—such as Swing or SWT—having its own arcane
API to work with.


Beyond the complexities of the structures that we build, the pattern of construction
and the order of initialization imposed by different APIs bring their own constraints.
This alone will often obfuscate the structure of what we are building by burying it
deep within boilerplate code. In addition to this, the classes of object that we need to
construct may be of a similar nature and have different means of construction.

Free download pdf