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
    
    所以上面的例子展示了编程语言的转变以满足领域特定语言的需要。
    让我们看一个如何在 Groovy 中实现 DSL 的简单示例:
    
    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 方法。