4.6 小结

本章漫长的学习之旅已接近尾声,你的耐心值得称赞。我们一路针对金融中介系统领域的问题片段展开讨论,几乎涵盖了所有的内部DSL实现模式。

要点与最佳实践

设计内部DSL的时候,你应遵循实现语言的最佳实践。按照一种语言的习惯去运用它,我们总是能在表现力和性能之间取得最佳的平衡。

Ruby、Groovy等动态语言给予使用者非常大的元编程能力。请借助这些能力去设计DSL抽象和背后的语义模型,你会得到漂亮的简洁语法,而死板代码则交由语言运行时去处理。

对于像Scala这样的实现语言,静态类型是你的好帮手。我们建议大家运用类型抽象来表达大部分业务逻辑,让编译器充当DSL语法的第一道验证防线。

对于Clojure这类具有编译时元编程能力的语言,请用宏来自定义语法结构。你会得到不输于Ruby实现的简洁语法,同时不会遭遇额外的运行时负担。

Ruby、Groovy等动态语言提供了强大的反射式元编程范式,用在DSL实现中对语言简洁性和表现力都有很大的帮助。这类语言允许你在运行时操控其元模型,因此特别适合用来实现较为动态的结构。

本章向你演示了动态builder和装饰器的制作方法,教你驾驭元编程的力量。而且,相信你还学会了运用静态类型以声明式风格表达领域约束。最后,我们学习了如何实现生成式DSL,在编译时或运行时生成代码。

阅读完本章,你应该能够从语言惯用法和最佳实践的角度去思考问题,以之为标杆来衡量自己的DSL实现。我们谈了很多模式,你不难在自己的DSL模型中为它们找到适用的上下文。前面几章一直泛泛地赞扬基于DSL的开发,本章终于把问题域的特定场景和具体的实现结构联系起来了。本章为你的DSL风景线增添了以下主要“景色”:

  • 你现在知道如何发挥实现语言内在的力量去提高DSL的简洁度;

  • 如果选用静态类型语言,你可以围绕类型化的抽象去建立DSL模型;

  • 如果实现语言具备元编程能力,你可以利用这一点使DSL的语法更紧凑,让语言运行时或者编译设施代替你生成代码。

接下来我们应该继续探索更多来自现实世界的例子。下一章我们会讨论动态类型语言家族,看看它们对于实现具有良好表现力的DSL有什么好办法。还等什么呢?让我们精神倍增地学习后面的精彩内容吧!