Учебники

Groovy — DSLS

Groovy позволяет опустить круглые скобки вокруг аргументов вызова метода для операторов верхнего уровня. Это называется функцией «командная цепочка». Это расширение работает, позволяя объединять такие вызовы методов без скобок, не требуя ни скобок вокруг аргументов, ни точек между цепочечными вызовами.

Если вызов выполняется как abcd , это фактически будет эквивалентно a (b) .c (d) .

DSL или специфичный для домена язык предназначен для упрощения кода, написанного на Groovy, таким образом, чтобы он стал легко понятным для обычного пользователя. В следующем примере показано, что именно подразумевается под доменным языком.

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

Приведенный выше код показывает список чисел, выводимых на консоль с помощью оператора println. На доменно-ориентированном языке команды будут выглядеть так:

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

Таким образом, приведенный выше пример показывает преобразование языка программирования для удовлетворения потребностей конкретного предметного языка.

Давайте рассмотрим простой пример того, как мы можем реализовать DSL в 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" 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

How are things? We are doing well. Take care

Необходимо отметить следующее о реализации кода выше:

Используется статический метод, который принимает замыкание. Это в основном простой способ реализации DSL.

В примере электронной почты у класса EmailDsl есть метод make. Он создает экземпляр и делегирует все вызовы в замыкании экземпляру. Это механизм, в котором разделы «to» и «from» в конечном итоге выполняют методы внутри класса EmailDsl.

После вызова метода to () мы сохраняем текст в экземпляре для последующего форматирования.

Теперь мы можем вызвать метод EmailDSL с простым языком, понятным для конечных пользователей.