领域专用语言实战
每一次我们在白板上设计领域模型,似乎总会在落实到代码的时候于纷杂中走了样。实现模型不管用哪种编程语言来表述,它都已经不是领域专家能理解的业务语言形式。白板上的模型是否精确反映了我们与领域用户商定的需求规格,这也无从让掌握领域规则的人员去验证。
对于这个症结,本书给出的解决之道是采用一种以DSL驱动的应用程序开发模型。假如我们围绕领域用户能够理解的语法和语义设计领域API,那么即使在应用程序代码的开发过程里,用户也能随时检查领域规则实现得是否正确。采用领域语言的代码更容易让人看懂,在这一点上,开发人员、维护人员、只懂业务不懂编程的领域专家都是受益者。
本书除了教你使用DSL来解决问题,还会教你实现DSL。在本书看来,DSL只是在语义模型外面包裹上薄薄一层以语言形态呈现的抽象。语义模型是把握领域核心结构的实现载体,语言层则使用领域用户的专门用语。
本书将使用Ruby、Groovy、Scala、Clojure等现代语言来讲授DSL的设计与实现,针对这些语言所代表的不同编程范式深入讨论它们在DSL设计上的长处和短处。读完本书,你将透彻理解一些必须掌握的概念,能够设计出用户理解且欣赏的优美的领域抽象。
精心设计的DSL旨在向目标用户提供人性化的界面,而做到这一点的最佳途径是让编程模型使用领域专用语言来“说话”。我们一直以来总是把程序设计得像个“黑盒”,很少让业务人员得知其内部细节,这种做法可以休矣。经验告诉我,所有用户都希望查看一下你建模在代码里的业务规则,而不是白板上杂乱的框框和箭头。
嵌在代码里的规则要容易被用户理解,用户必须能看懂你使用的语言,这就是我从事十年领域建模的领悟。当规则可被理解的时候,DSL也就呼之欲出了。随之得到改善的不仅有开发团队和业务人员的沟通效率,还有软件面向用户的表达能力。
对于我们能否为用户提供表现力充沛的语法和语义,实现语言无论何时都是一个决定性的因素。有赖于当今生态环境的巨大发展,我们所设计的语言得以在表现力上有了长足进步。以鼓励开发者编写精炼而富有表现力的代码而论,Ruby、Groovy、Scala和Clojure是先行的表率。在这几种语言下的第一手编程经验让我感觉到,它们的语言风格和表达习惯远比大多数前代语言更适合领域建模。
写这样一本关于DSL的书是很大的挑战。我试图关注DSL的一切现实事物,所以从一开始就设定了具体的领域。当我们渐次展开论述,领域模型随着各种业务需求的累加而变得越来越复杂。这正好充分体现了DSL驱动的开发方式对问题域复杂度增长的适应能力。DSL方式并不是对API设计的颠覆,它只是鼓励你在API的设计思路上多考虑一个维度。请务必记住,你的用户才是DSL的使用者。凡事多从用户的角度去考虑,你一定会成功的!