演化架构和紧急设计: 使用 DSL2011-08-18 IBM Neal Ford简介:至今, 演化构架和紧急设计 主要关注技术模式的紧急设计,本期将介绍使用特定领域语言 (DSL)捕获 领域惯用模式。系列作者 Neal Ford 用一个例子说明了该方法,显示了这种获取惯用模式 的抽象样式的优势。惯用模式可以是 技术也可以是 领域。技术模式为常用的技术软件问题指出解决方案,例如在应用程 序(或应用程序套件)中怎样处理验证、安全和事务数据。前几期主要关注获取技术惯用模式所用的技术 ,例如元程序设计。域模式关注的是如何抽象常见业务问题。而技术模式几乎出现在所有的软件中,域模 式之间的差异与业务之间的差异一样大。然而获取它们有一套丰富的技术,这就是本期以及后续几期将要 谈论的话题。本文为使用 DSL 技术作为一种抽象样式获取域模式提供动力,DSL 提供多种选择,包括自己命名的模 式。Martin Fowler 最近的一本书对 DSL 技术有较为深入的研究。在后续几期中,我会使用他的许多模 式名,也会将他的示例用于我的例子中,逐步讲述具体技术。DSL 的动机为什么我们要费 那么多周折创建一个 DSL ?仅仅为了获取一个惯用模式?正如我在 “利用可重用代码,第 2 部分 ” 中指出的,区分惯用模式的最好方法就是让它看起来与其他代码不一样。这种看得见的不同是最 直接的线索,您不需要再看常规 API。同样,使用 DSL 的目的之一是写代码,使这些代码看起来不像源 代码而更像您正在尝试解决的问题。如果能够达到这个目标(或者接近这个目标),那您将填补软件项目 中的这一空白,为开发人员和业务涉众的沟通架起了桥梁。允许用户阅读您的代码很有必要,因为这消除 了将代码转换为语言的需求,这是项很容易出错的工作。让您的代码对于非技术人员是易读的,因为他们 了解软件的预期设想,这样你们之间就会有更多的交流。为激励开发人员使用这种技术,我将借 用 Fowler DSL 书中的例子。假设我正为一家制作软件控制的暗格(secret compartments,想想 James Bond)的公司工作。公司的一个客户,H. 夫人,想要在她的卧室里装一个暗格。然而我们公司使用 .com 泡沫破碎后留下的 Java™驱动的 toasters 来运行软件。尽管 toasters 比较便宜,但更新其中的 软件却很昂贵,因此我需要创建基础暗格代码,然后将其永久地设置在 toasters 上,然后找到一种方法 根据每位用户的需求进行配置。您也知道,在现代软件世界中,这是一个很常见的问题:普遍行为不常改 变,而配置需要根据个人情况进行改变。H. 夫人想要一个暗格,打开这个暗格的方法是:首先关闭卧室门,接着打开梳妆台的第二个抽屉,最 后打开床头灯。这些活动必须依次进行,如果打乱次序,必须重头开始。您可以将控制暗格的软件想象为 一个状态机,如图 1 所示:图 1. H. 夫人的暗格是状态机