Kotlin领域特定语言(DSL)
DSL是什么
对笔者来说DSL
是一个既熟悉又陌生的词,总感觉经常看到但是又不知道它具体是什么。为了便于理解就要提到编程语言
,对于这个我们就再熟悉不过了,比如Java、kotlin都属于编程语言
,而DSL
全称为“领域特定语言”。以下为两者的对比:
- 编程语言:有一系列足够完善的能力来解决几乎所有能被计算机解决的问题。
- DSL:专注在特定任务,或者说领域上,并放弃与该领域无关的功能。
可以看出,专门针对某一特殊功能所存在的语言并且仅能完成这部分功能的语言我们称之为领域特定语言。常见的有DSL
有SQL和正则表达式。
内嵌DSL
内嵌DSL作为kotlin的一种新特性,可以方便我们的开发。那为什么要使用内嵌DSL而不是直接使用呢,以SQL为例。
这些语言为了更有效的完成它们的目标,通过会减少它们提供的功能,因此当你需要执行一个SQL语句的时候,不用声明一个类或者方法,每一个关键字就代表了需要执行的操作和类型,每种类型的操作都有自己独特的语法和针对特定任务的关键字集合。
并且往往DSL语言更趋向于声明式,和通用编程语言相反,大部分是命令。
这导致直接使用DSL有个缺点:它们很难与使用通用编程语言的宿主应用程序结合起来使用。简单来说就是语法不同,需要以字符串等其他形式传入,不便于及时纠错。
示例
Anko SQLite(SQL)
fun getUsers(db: ManagedSQLiteOpenHelper): List<User> = db.use {
db.select("Users")
.whereSimple("family_name = ?", "John")
.doExec()
.parseList(UserParser)
}
Anko Layouts(XML)
verticalLayout {
val name = editText()
button("Say Hello") {
onClick { toast("Hello, ${name.text}!") }
}
}
总结
kotlin用内嵌DSL的方式让一些特殊领域语言的编写变得更加容易和统一。当熟练后甚至可以不用再写XML文件来布局,不用再写难记又不方便调试的SQL语句。(虽然就本人而言其实还是习惯用XML写布局)
其实现的原理也很简单,实际上就是普通的方法基于lambda表达式的形式完成高度简洁的代码风格。说白了就是以代码形式完成以上的功能,不过这些代码是经过kotlin深度封装和优化的。