6.2 迈向Scala DSL的第一步

Scala是一种很好的内部DSL宿主语言,但单凭这一点不足以说服经理在开发环境中引入Scala这种新技术。任何新技术都要控制引入的节奏,以免增加混乱的风险。一般可以先在不太关键的业务上采用,再慢慢普及。

置身于JVM之上,拥有与Java互操作的能力,这是Scala的重要优势。企业可以一边保留Java方面的投入,一边向Scala过渡。Scala DSL的第一步可以有很多走法,在保持基本Java抽象不变的前提下,已经有不少发挥空间。图6-2给出了一些策略,可以供你的开发团队参考。

enter image description here

图6-2 Scala不需要一开始就应用到生产代码之中。这里列举了一些学步的方案,选择何种顺序你说了算

从图6-2中可以看出,项目的交付主线可以继续沿用Java,团队中的部分成员在辅助性工作中接触Scala。下面几个小节将详细说明图中的几种起步方式。

6.2.1 通过Scala DSL测试Java对象

测试是开发过程中的核心任务之一,同时它的技术和框架都有很大的选择空间。测试套件的重要性不亚于生产代码库。业内人士正竭尽全力,希望将测试套件表达得更到位、更详尽。

DSL已经成为测试框架必不可少的一部分。你只要选择一种基于Scala DSL的测试框架,就能立即开始学习用Scala语言设计DSL。例如ScalaTest(见6.10节文献[8])就是这样一种DSL框架,你可以用它编写DSL,对Java和Scala类进行测试。一开始并不要求你掌握Scala类的写法,只要在这类测试框架内重用原有的Java类即可,目的是熟悉一下基于DSL的开发方式和环境。

6.2.2 用Scala DSL作为对Java对象的包装

本书一再提及Scala与Java的完美契合,我们可以利用Scala的这个特点,为Java对象加上一层包装,获得更灵巧、丰满的表达。3.2.2节可作为这种手法的实证,我们借助Scala的力量,把Java对象打扮成一副精明能干的样子,是相当有说服力的。通过对这种手法的实践,你将掌握如何运用Scala语言在Java对象模型上创作DSL,这是一条简单高效的学习途径。

6.2.3 将非关键功能建模为Scala DSL

大型应用常包含一些不太关键的部分。你可以跟客户协商,把其中一些次要部分作为Scala DSL设计的试验田。如果不愿意放弃主要的Java编译模式,那么可以把Scala DSL做成脚本,然后通过Java 6提供的ScriptEngine来运行。

下面详述Scala各项特性的具体用法,深入探讨怎样用它们建立领域模型,然后编排成流畅的DSL。

代码提示 后面的段落含有大量代码片段,我会插入对一些预备知识的说明,解释必要的语言特性,以便读者理解实现中的细微之处。如有需要,还可以查阅本书附录中相应语言的速查表。

讨论中将继续沿用金融中介领域的例子,逐步应用不同的特性去修补和改良DSL的设计,最后形成一种可以交付使用的完善DSL。这段旅程将充满乐趣。