2.5 小结
从第1章的基本原理,到本章实用主义的DSL用法、实现、分类,你已经在很短的时间内汲取了大量知识。如果说第1章只是指引你步入DSL开发,那么本章就切切实实地把你带到了DSL的现实世界。
本章一开头就举例强调基于DSL的程序开发重点是抽象的表现力。Java实现的交易单处理DSL对于作为用户的程序员来说表现力已经足够。但如果打算让不懂编程的领域专家用你的DSL作为表达载体,你就要有一种更能传达领域含义的实现语言。Groovy实现做到了,从Java迁移到Groovy大大提高了其表现力水平。
接着,我们的话题从具体实现转为更广泛的DSL模式。你了解到在内部和外部DSL两大分类下还有很多不同的实现模式。DSL的复杂度各不相同。DSL设计者需要挑选最适合手头问题的实现策略。然后,2.3节逐一介绍各种模式,以便你对现有的DSL实现技术有个概括的了解。
阅读完本章,你已经见识过五花八门的DSL形式和结构了。最终把领域模型塑造成什么样,这是架构师的责任。不过在继续建模的话题之前,我们需要先解决DSL与开发环境的集成问题。目前为止,我们已经见过DSL的宏观模型发挥作用。现在请换一种思维,想一想DSL开发中的微观建模产物。假设你在JVM平台上用Java开发了核心应用程序,然后又开发了Groovy DSL,请问两方面要怎样集成,才能保证DSL既可以访问Java组件,又能维持其独立实体的身份?为了回答这个问题,你要面对许多选择和陷阱;这些都是下一章的内容。
要点与最佳实践
Java的语言特性足以实现出具有充分表现力的DSL。如果你感觉Java有所局限,请关注JVM平台上与Java互操作性良好的其他语言。
当你为DSL选定一种实现语言,请注意学习那些使DSL贴近实现语言习惯的模式。当选用Groovy或Ruby时,元编程模式是最好的帮手。当选用Scala时,它强大的类型系统可以成为DSL实现的靠山。
选择DSL实现形式的时候,要保持开放的心态。外部DSL看似困难,但实践中很少有必要从头实现一种完整全面的语言,所以复杂度不一定有那么高。
在后面的章节里,我们将要实现证券交易领域的各种DSL片段,老鲍当然也会陪着我们,用他洞悉全局的眼光帮忙改进DSL的表现力。