关于本书

每一次我们在白板上设计领域模型,似乎总会在落实到代码的时候于纷杂中走了样。实现模型不管用哪种编程语言来表述,它都已经不是领域专家能理解的业务语言形式。白板上的模型是否精确反映了我们与领域用户商定的需求规格,这也无从让掌握领域规则的人员去验证。

对于这个症结,本书给出的解决之道是采用一种以DSL驱动的应用程序开发模型。假如我们围绕领域用户能够理解的语法和语义设计领域API,那么即使在应用程序代码的开发过程里,用户也能随时检查领域规则实现得是否正确。采用领域语言的代码更容易让人看懂,在这一点上,开发人员、维护人员、只懂业务不懂编程的领域专家都是受益者。

本书除了教你使用DSL来解决问题,还会教你实现DSL。在本书看来,DSL只是在语义模型外面包裹上薄薄一层以语言形态呈现的抽象。语义模型是把握领域核心结构的实现载体,语言层则使用领域用户的专门用语。

本书将使用Ruby、Groovy、Scala、Clojure等现代语言来讲授DSL的设计与实现,针对这些语言所代表的不同编程范式深入讨论它们在DSL设计上的长处和短处。读完本书,你将透彻理解一些必须掌握的概念,能够设计出用户理解且欣赏的优美的领域抽象。

读者对象

如果你希望自己设计的API其表现力既满足领域用户的需要,又能达到程序员同行的要求,那么这本书恰好适合你。如果你是一名领域用户,正期待着改善与开发团队的沟通效果,那么这本书恰好适合你。如果你是一名程序员,正为如何与领域用户核对业务规则的实现正确与否而苦恼,那么这本书同样适合你。

本书内容

图1、图2、图3除了勾画出了全书的组织脉络,对各章的内容也作了简略的阐述。本书分为三部分:

  • 使用DSL;
  • 实现DSL;
  • DSL开发的未来趋势。

enter image description here

图1 第1章到第3章的学习历程

enter image description here

图2 第4章到第6章的学习历程

enter image description here

图3 第7章到第9章的学习历程

第一部分(第1章~第3章)作为总括,详细地阐述了DSL驱动开发环境的定位,帮助读者在自己的应用程序架构中找到它的用武之地。如果你是程序员或者架构师,这部分内容将协助你调整现有的开发工具和技术,使之适应DSL驱动的新范式。本书主要围绕各种JVM(Java虚拟机)语言展开论述。因此,Java程序员很快就能够从书中找到适合自身项目情况的DSL运用方式,在自己的Java项目内集成用表现力更佳的其他JVM语言开发出来的DSL。

DSL拥有各种贴近用户思维的语法结构,这些语言抽象有赖于语义模型在背后提供支撑。第二部分(第4章~第8章)探讨如何设计出优秀的语义模型,使之成为上层语言抽象的有力后盾。这个部分主要是给开发人员准备的,旨在指导开发人员按照优秀抽象的设计原则来搭建领域模型。从第4章到第8章,各章都含有丰富的DSL代码片段,实现语言包括Ruby、Groovy、Clojure、Scala等。如果正在或即将使用这些语言来实现DSL,那么你会发现这几章的内容特别实用。书中讲解了DSL的实现手法,而且将从最基本的技术入手,逐渐深入到高级技术,如元编程、解析器组合子,以及ANTLR、Xtext等开发框架。

第三部分(第9章)主要展望未来趋势,重点讨论解析器组合子和DSL工作台技术未来的发展。

本书面向真正的实践者。因此,虽然书中也含有理论知识,但只是作为帮助理解具体实现的铺垫而存在。我发自内心地相信这将是一本让奋战在开发第一线的实干家感觉有用的书。

排版约定

本书正文中穿插了不少插入内容和补充内容,用于提醒读者注意一些重要信息。

一般来说,下面的排版样式用于展示与证券交易及结算领域有关的信息。

金融中介系统
带有这个标志,即表示其中信息与DSL所属领域有关,读者需要了解其中知识才能理解上下文。此类内容一般是对一些特殊术语和概念的背景介绍。

书中还有带另一种标志的插入内容,其排版格式如下。

此类插入内容含有不属于所在章节讨论话题的知识。例如某种DSL设计的特殊惯用法、对前文讨论的重点归纳,或者我希望强调的其他重要知识点。

另外,我还用下面所示的标志来引起读者对特定内容的注意。

语言相关信息
看到这个标志,你就应该知道其中含有当前示例所用编程语言的小知识。你需要掌握这些特定的概念才能真正理解当前示例。

在这里,我提请大家注意不要轻易忽略这些带有不同标志的补充信息,它们都是可以帮助你透彻理解当前讨论内容的重要参考知识。

代码约定和下载

本书包含大量的DSL示例,其中不少例子的完成度很高,足以完整解释某一方面的领域规则实现。这些例子使用的编程语言有Java、Ruby、Groovy、Scala和Clojure。代码清单和正文中插入的代码片段都使用等宽字体,便于读者把它们和一般的文字区分开来。正文中出现的方法名、参数、对象属性、ANTLR和Xtext等脚本、XML元素和属性也都一律使用等宽字体呈现。

示例代码不一定总是短小的片段,有时候为了充分说明所涉领域的上下文和语义,也会占用较长的篇幅,保留较多的细节。书中的代码经常会为了适应书本的页面宽度,而在断行和缩进上做一些格式调整;偶尔还有调整不过来的情况,这时对于那些不得不折行的代码,我们会在折行的位置打上一个续行标记。

很多代码清单中会穿插一些标注,以便向读者提示重点。有时候标注还会带有数字编号,方便我们在后续的介绍中引用和参照。

书中用了多种编程语言来实现DSL,显然不可能所有的读者都熟悉其中所用的每一种语言。因此作为快速的参考,书后准备了每种语言的速查表格,见附录C到附录G。附录中的介绍只是针对书中探讨DSL实现所用到的一些关键语言特性展开,并不完整全面,进一步的知识需要读者到表格后补充的参考资料中去寻找。

大多数时新的IDE都有能力支持开发者在同一项目中使用多种语言。如果读者不熟悉多语言开发环境,附录G是一个简单的入门指导。

书中所有示例的源代码都可以从Manning出版社网站下载1,地址为http://www.manning.com/DSLsinAction,配置构建环境和执行环境的相关指示也包含在内。阅读的时候在手边备一份源代码,这会对你很有帮助。

1. 也可在图灵社区本书页面(http://www.ituring.com.cn/book/836)免费注册下载。——编者注

作者在线

本书有一个由Manning出版社运营的关联网络论坛,购买本书的读者具有免费访问论坛的权利。读者可以在上面发表评论、询问技术问题,并获得作者和其他用户的帮助。注册及使用论坛请访问http://www.manning.com/DSLsinAction。读者可从该页面了解论坛的注册和使用方法、论坛内提供的帮助、论坛守则等信息。

Manning出版社向读者承诺提供读者之间、读者与作者之间展开有意义对话的便利场所。作者只是志愿(且无偿)地参与论坛活动,因此Manning出版社不对作者参与论坛的程度做要求。我们建议读者尽量提出一些具有挑战性的问题,让作者有兴趣持续访问本论坛。在书籍在版期间,出版社网站将保证读者可以访问作者在线交流论坛及论坛上积累的讨论内容。

关于作者

Debasish Ghosh(Twitter账号:@debasishg)在Anshinsoft公司(http://www.anshinsoft.com)任首席技术布道师,他擅长领导团队交付企业规模的解决方案,服务过的客户有小企业也有世界500强企业。他的研究兴趣是OO及函数式编程、DSL和NoSQL数据库。他是ACM协会的高级会员,还撰写一个编程方面的博客“Ruminations of a Programmer”(http://debasishg.blogspot.com)。他的电子邮件:dghosh@acm.org。

关于封面图片

本书封面图片为“来自克罗地亚斯拉沃尼亚地区奥西耶克城附近的久尔杰瓦茨村的男人”。这幅画是在克罗地亚历史名城斯普利特的民族博物馆一位热心馆员的帮助下取得的,来自该馆2003年重版的一本19世纪中期由Nikola Arsenovic编撰的克罗地亚传统服饰画集。斯普利特民族博物馆本身即坐落于中世纪的城市中心,也是罗马古迹的核心所在——建于公元304年前后的罗马帝国宫殿戴克里先宫遗址上。画集内收录了克罗地亚各地区人物形象的精细彩绘图样,并配有对服饰和生活习俗的文字说明。

久尔杰瓦茨村位于奥西耶克城附近,属于克罗地亚东部历史悠久的斯拉沃尼亚地区。斯拉沃尼亚的男人们传统上穿戴红色的帽子、白色衬衣、带刺绣图案的蓝色马甲和长裤,然后点缀上毛织或皮革的宽腰带和厚毛袜,最后罩一件棕色羊皮的短外套,也就是本书封面上的样子。

人们的衣着式样和生活习俗在最近的200年里发生了很大的变化。从前各地丰富多彩,极具地方特色的衣着和习俗已经消失殆尽。依现在的情况,甚至连不同洲的居民都趋于同化、难以区分了,相距数里的村落和市镇之间,就更不可能有什么差别了。也许,我们已经牺牲了文化的多样性来换取多姿多彩的个人生活——五光十色的、快节奏的科技生活。

Manning出版社特意从旧书和藏品里找回这些古老图样,让两个世纪以前丰富多彩的地方生活特色在图书封面上重焕光彩,以此来表达对计算机行业的创造精神和主动精神的赞美。

目录

  • 版权声明
  • 献词
  • 前言
  • 致谢
  • 关于本书
  • 关于封面图片
  • 第一部分 领域专用语言入门
  • 第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 多语言开发