1. はじめに
DSL の正式名称は Domain Specific Language (ドメイン固有言語) で、プログラミング言語によって開発者に与えられた特別な能力で、これによって本来の文法構造から外れたようなコードを記述して、独自の言語を構築することができます。言語、文法構造。
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.6.1'
implementation 'com.squareup.retrofit2:converter-gson:2.6.1'
}
Gradle は Groovy 言語をベースにした構築ツールであるため、上記の文法構造は実際には Groovy が提供する DSL 機能です。すごいと思いますか?驚かないでください。Kotlin の DSL を利用すると、同様の文法構造を実装することもできます。詳しく見てみましょう。
最初の一歩、
まず新しい DSL.kt ファイルを作成し、そのファイル内に依存関係クラスを定義します。コードは次のとおりです。
class Dependency {
val libraries = ArrayList<String>()
fun implementation(lib: String) {
libraries.add(lib)
}
}
ここでは、List コレクションを使用してすべての依存ライブラリを保存し、次に、implementation() メソッドを提供して依存ライブラリを List コレクションに追加します。コードは非常に単純です。
次に、依存関係の高次関数を定義します。コードは次のとおりです。
fun dependencies(block: Dependency.() -> Unit): List<String> {
val dependency = Dependency()
dependency.block()
return dependency.libraries
}
ご覧のとおり、依存関係関数は関数型パラメーターを受け取り、そのパラメーターはDependency クラスで定義されているため、それを呼び出すときは、最初にDependency のインスタンスを作成し、次にそのインスタンスを通じて関数型パラメーターを呼び出す必要があります。これにより、渡されたラムダ式を実行できるようになります。最後に、Dependency クラスに保存された依存ライブラリのコレクションを返します。
そうです、このような DSL 設計の後は、プロジェクトで次の構文構造を使用できます。
dependencies {
implementation("com.squareup.retrofit2:retrofit:2.6.1")
implementation("com.squareup.retrofit2:converter-gson:2.6.1")
}
簡単に説明してください。依存関係関数は関数型パラメーターを受け取るため、ここで Lambda 式を渡すことができます。このとき、Lambda式にはDependencyクラスのコンテキストが含まれるため、Dependencyクラスのimplementation()メソッドを直接呼び出して依存ライブラリを追加することももちろん可能です。
もちろん、この文法構造は、build.gradle ファイルで使用する文法構造とまったく同じではありません。主な理由は、Kotlin と Groovy には依然として文法レベルで一定の違いがあるためです。