10.5 小结
以下是本章中的关键概念。
- 引入DSL的主要目的是为了弥补程序员与领域专家之间对程序认知理解上的差异。对于编写实现应用程序业务逻辑的代码的程序员来说,很可能对程序应用领域的业务逻辑理解不深,甚至完全不了解。以一种“非程序员”也能理解的方式书写业务逻辑并不能把领域专家们变成专业的程序员,却使得他们在项目早期就能阅读程序的逻辑并对其进行验证。
- DSL的两大主要分类分别是内部DSL(采用与开发应用相同的语言开发的DSL)和外部DSL(采用与开发应用不同的语言开发的DSL)。内部DSL所需的开发代价比较小,不过它的语法会受宿主语言限制。外部DSL提供了更高的灵活性,但是实现难度比较大。
- 可以利用JVM上已经存在的另一种语言开发多语言DSL,譬如Scala或者Groovy。这些新型语言通常都比Java更加简洁,也更灵活。然而,要将Java与它们整合在一起使用需要修改构建流程,而这并不是一项小工程,并且Java与这些语言的互操作也远没达到完全无缝的程度。
- 由于自身冗长、烦琐以及僵硬的语法,Java并非创建内部DSL的理想语言,然而随着Lambda表达式及方法引用在Java 8中的引入,这种情况有所好转。
- 现代Java语言已经以原生API的方式提供了很多小型DSL。这些DSL,譬如
Stream和Collectors类中的那些方法,都非常有用,使用起来也极其方便,特别是你需要对集合中的数据进行排序、过滤、转换或者分组的时候,非常值得一试。 - 在Java中实现DSL有三种主要模式,分别是方法链接、嵌套函数以及函数序列。每种模式都有其优点和弊端。不过,你可以在一个DSL中整合这三种DSL,尽量地扬长避短,充分发挥各种模式的长处。
- 很多Java框架和库都可以通过DSL使用其特性。本章介绍了其中的三种,分别是:jOOQ,一种SQL映射工具;Cucumber,一种基于行为驱动的开发框架;Spring Integration,一种实现企业集成模式的Spring扩展库。
