Groovy - DSLS

Groovy consente di omettere le parentesi attorno agli argomenti di una chiamata al metodo per le istruzioni di primo livello. Questa funzione è nota come "catena di comandi". Questa estensione funziona consentendo di concatenare tali chiamate di metodo senza parentesi, non richiedendo né parentesi attorno agli argomenti, né punti tra le chiamate concatenate.

Se una chiamata viene eseguita come a b c d, questo sarà effettivamente equivalente a a(b).c(d).

Il linguaggio DSL o Domain specifico ha lo scopo di semplificare il codice scritto in Groovy in modo tale che diventi facilmente comprensibile per l'utente comune. Il seguente esempio mostra cosa si intende esattamente per avere una lingua specifica del dominio.

def lst = [1,2,3,4] 
print lst

Il codice precedente mostra un elenco di numeri stampati sulla console utilizzando l'istruzione println. In una lingua specifica del dominio i comandi sarebbero come:

Given the numbers 1,2,3,4
 
Display all the numbers

Quindi l'esempio sopra mostra la trasformazione del linguaggio di programmazione per soddisfare le esigenze di un linguaggio specifico del dominio.

Diamo un'occhiata a un semplice esempio di come possiamo implementare i DSL in 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" 
}

Quando eseguiamo il programma sopra, otterremo il seguente risultato:

How are things? We are doing well. Take care

Quanto segue deve essere notato sull'implementazione del codice sopra:

  • Viene utilizzato un metodo statico che accetta una chiusura. Questo è principalmente un modo semplice per implementare un DSL.

  • Nell'esempio di posta elettronica, la classe EmailDsl ha un metodo make. Crea un'istanza e delega tutte le chiamate nella chiusura all'istanza. Questo è il meccanismo in cui le sezioni "a" e "da" finiscono per eseguire metodi all'interno della classe EmailDsl.

  • Una volta chiamato il metodo to (), memorizziamo il testo nell'istanza per la formattazione in seguito.

  • Ora possiamo chiamare il metodo EmailDSL con un linguaggio semplice e di facile comprensione per gli utenti finali.