Groovy-dsls

提供:Dev Guides
移動先:案内検索

Groovy-DSLS

Groovyでは、最上位ステートメントのメソッド呼び出しの引数の括弧を省略することができます。 これは「コマンドチェーン」機能と呼ばれます。 この拡張機能は、そのような括弧のないメソッド呼び出しを連鎖できるようにすることで機能し、引数を括弧で囲む必要も連鎖した呼び出しの間にドットも必要としません。

呼び出しが a b c d として実行される場合、これは実際には* 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メソッドを呼び出すことができます。