Maravilloso - DSLS
Groovy permite omitir paréntesis alrededor de los argumentos de una llamada a método para declaraciones de nivel superior. Esto se conoce como función de "cadena de comandos". Esta extensión funciona al permitirle encadenar tales llamadas a métodos sin paréntesis, sin requerir ni paréntesis alrededor de los argumentos ni puntos entre las llamadas encadenadas.
Si una llamada se ejecuta como a b c d, esto en realidad será equivalente a a(b).c(d).
El lenguaje específico de dominio o DSL está destinado a simplificar el código escrito en Groovy de tal manera que sea fácilmente comprensible para el usuario común. El siguiente ejemplo muestra qué se entiende exactamente por tener un idioma específico de dominio.
def lst = [1,2,3,4]
print lst
El código anterior muestra una lista de números que se imprimen en la consola mediante la instrucción println. En un lenguaje específico de dominio, los comandos serían como:
Given the numbers 1,2,3,4
Display all the numbers
Entonces, el ejemplo anterior muestra la transformación del lenguaje de programación para satisfacer las necesidades de un lenguaje específico de dominio.
Veamos un ejemplo simple de cómo podemos implementar DSL en Groovy:
class EmailDsl {
String toText
String fromText
String body
/**
* This method accepts a closure which is essentially the DSL. Delegate the
* closure methods to
* the DSL class so the calls can be processed
*/
def static make(closure) {
EmailDsl emailDsl = new EmailDsl()
// any method called in closure will be delegated to the EmailDsl class
closure.delegate = emailDsl
closure()
}
/**
* Store the parameter as a variable and use it later to output a memo
*/
def to(String toText) {
this.toText = toText
}
def from(String fromText) {
this.fromText = fromText
}
def body(String bodyText) {
this.body = bodyText
}
}
EmailDsl.make {
to "Nirav Assar"
from "Barack Obama"
body "How are things? We are doing well. Take care"
}
Cuando ejecutamos el programa anterior, obtendremos el siguiente resultado:
How are things? We are doing well. Take care
Debe tenerse en cuenta lo siguiente sobre la implementación del código anterior:
Se utiliza un método estático que acepta un cierre. Esta es principalmente una forma sencilla de implementar un DSL.
En el ejemplo de correo electrónico, la clase EmailDsl tiene un método make. Crea una instancia y delega todas las llamadas en el cierre a la instancia. Este es el mecanismo en el que las secciones "to" y "from" terminan ejecutando métodos dentro de la clase EmailDsl.
Una vez que se llama al método to (), almacenamos el texto en la instancia para formatearlo más adelante.
Ahora podemos llamar al método EmailDSL con un lenguaje sencillo que sea fácil de entender para los usuarios finales.