Android - 使用DSL构建专有的语法结构

一、简介

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文件,然后在里面定义一个Dependency类,代码如下所示:

class Dependency {
 val libraries = ArrayList<String>()
 fun implementation(lib: String) {
 libraries.add(lib)
 }
}

这里我们使用了一个List集合来保存所有的依赖库,然后又提供了一个implementation()方 法,用于向List集合中添加依赖库,代码非常简单。

接下来再定义一个dependencies高阶函数,代码如下所示:

fun dependencies(block: Dependency.() -> Unit): List<String> {
 val dependency = Dependency()
 dependency.block()
 return dependency.libraries
}

可以看到,dependencies函数接收一个函数类型参数,并且该参数是定义到Dependency类 中的,因此调用它的时候需要先创建一个Dependency的实例,然后再通过该实例调用函数类 型参数,这样传入的Lambda表达式就能得到执行了。最后,我们将Dependency类中保存的 依赖库集合返回

没错,经过这样的DSL设计之后,我们就可以在项目中使用如下的语法结构了:

dependencies {
 implementation("com.squareup.retrofit2:retrofit:2.6.1")
 implementation("com.squareup.retrofit2:converter-gson:2.6.1")
}

简单解释一下。由于dependencies函数接收一个函数类型参数,因此这里我们可以 传入一个Lambda表达式。而此时的Lambda表达式中拥有Dependency类的上下文,因此当 然就可以直接调用Dependency类中的implementation()方法来添加依赖库了。

当然,这种语法结构和我们在build.gradle文件中使用的语法结构并不完全相同,这主要是因 为Kotlin和Groovy在语法层面还是有一定差别的。

猜你喜欢

转载自blog.csdn.net/m0_59482482/article/details/130321101