前言

2001年春天,我供职的Anshinsoft公司(http://www.anshinsoft.com)开始涉足企业应用开发业务,客户是一家在亚太区数一数二的证券中介和资产管理企业。这段经历激起了我对一个专门的问题领域进行建模,然后将模型转换成软件的兴趣。于是我开始了一段考验毅力的学习旅程,仔细参详了Eric Evans的领域驱动设计著作(Domain-Driven Design: Tackling Complexity in the Heart of Software1),聆听了Josh Bloch关于如何设计优秀API的教诲(How to Design a Good API & Why it Matters,http://www.infoq.com/presentations/effective-api-design)以及Martin Fowler关于DSL的教义。

1. 中文版《领域驱动设计》,人民邮电出版社出版。——编者注

精心设计的DSL旨在向目标用户提供人性化的界面,而做到这一点的最佳途径是让编程模型使用领域专用语言来“说话”。我们一直以来总是把程序设计得像个“黑盒”,很少让业务人员得知其内部细节,这种做法可以休矣。经验告诉我,所有用户都希望查看一下你建模在代码里的业务规则,而不是白板上杂乱的框框和箭头。

嵌在代码里的规则要容易被用户理解,用户必须能看懂你使用的语言,这就是我从事十年领域建模的领悟。当规则可被理解的时候,DSL也就呼之欲出了。随之得到改善的不仅有开发团队和业务人员的沟通效率,还有软件面向用户的表达能力。

对于我们能否为用户提供表现力充沛的语法和语义,实现语言无论何时都是一个决定性的因素。有赖于当今生态环境的巨大发展,我们所设计的语言得以在表现力上有了长足进步。以鼓励开发者编写精炼而富有表现力的代码而论,Ruby、Groovy、Scala和Clojure是先行的表率。在这几种语言下的第一手编程经验让我感觉到,它们的语言风格和表达习惯远比大多数前代语言更适合领域建模。

写这样一本关于DSL的书是很大的挑战。我试图关注DSL的一切现实事物,所以从一开始就设定了具体的领域。当我们渐次展开论述,领域模型随着各种业务需求的累加而变得越来越复杂。这正好充分体现了DSL驱动的开发方式对问题域复杂度增长的适应能力。DSL方式并不是对API设计的颠覆,它只是鼓励你在API的设计思路上多考虑一个维度。请务必记住,你的用户才是DSL的使用者。凡事多从用户的角度去考虑,你一定会成功的!

目录

  • 版权声明
  • 献词
  • 前言
  • 致谢
  • 关于本书
  • 关于封面图片
  • 第一部分 领域专用语言入门
  • 第1章 初识DSL
  • 第2章 现实中的DSL
  • 第3章 DSL驱动的应用程序开发
  • 第二部分 实现DSL
  • 第4章 内部DSL实现模式
  • 第5章 Ruby、Groovy、Clojure 语言中的内部DSL设计
  • 第6章 Scala语言中的内部DSL设计
  • 第7章 外部DSL的实现载体
  • 第8章 用Scala语法分析器组合子设计外部DSL
  • 第三部分 DSL开发的未来趋势
  • 第9章 展望DSL设计的未来
  • 附录A 抽象在领域建模中的角色
  • 附录B 元编程与DSL设计
  • 附录C Ruby语言的DSL相关特性
  • 附录D Scala语言的DSL相关特性
  • 附录E Groovy语言的DSL相关特性
  • 附录F Clojure语言的DSL相关特性
  • 附录G 多语言开发