领域驱动设计与动态文档
英文原文:DDD and Living Documentation
创建文档是一件令人厌烦的工作,文档内容很可能是过期的,或者会产生误导。但某种新的思想能够同时改善你的文档与代码。在今年于伦敦举办的 DDD Exchange 大会的一场演讲中,Cyrille Martraire 为听众阐述了如何在进行领域驱动设计(DDD)时创建动态文档(living documentation)。
在 Martraire 看来,文档的目的就是为了将信息传递给他人、在将来进行参考以及为了应付可能会到来的合规检查(regulatory compliance)。DDD 关注的是领域知识,而事件风暴是一种捕获这种知识的方法,Martraire 认为这是一种能够有效地探索一个领域的途径。他还建议使用行为驱动开发(BDD)技术,通过对话及场景中的实例对行为进行文档化。通过使用类似于 Cucumber 的工具,可以将场景以代码的方式进行运行,这正是动态文档的第一个例子,它与实际的代码始终是同步的。
Martraire 表示,如果从 DDD 的角度来看待代码,那么边界上下文已经包含在这些代码之中了,只是这种包含是隐式的。通过为包或命名空间添加标注,他就能够声明与描述多个不同的上下文,而这些描述同样也是始终与代码保持同步的。他认为通过这种技术还能够为他带来一种非常有价值的良好副作用,即他能够描述不同的 DDD 概念,他将这一过程称为嵌入式学习。
按照同样的方式,统一语言其实也已经表述在代码之中了,包括类、接口和方法。Martraire 通过对与领域相关的部分添加标注,并且以某种处理过程对添加了标注的代码进行扫描,就生成了一份始终保持最新的活术语表。在他之前所参与的一个项目中,他就通过这种方式自动生成了一份术语表,并定期地发送给项目负责人,这在他看来是一个巨大的成功。
为了举例说明如何对设计进行文档化,Martraire 使用了一个多边形架构,其中某个边的内部只包含领域模型,而其它部分都在外部。这一模式已经实现了文档化,只需在代码中谨慎地遵循这一模式,就能够确保设计已隐含在代码之中。他再次通过对包或命名空间添加标注的方式创建了活图表,并保证该图表正确地反映出代码。
Martraire 在这一技术中还发现了一个重要的价值:如果你发现很难按照这种方式创建一个活术语表或者是其它类型的动态文档,这就是一个信号,它表示你实现 DDD 的方式很可能有错。这就意味着可以通过文档检查你的代码现状,并对代码加以改善。
Martraire 目前正在撰写一本名为《Living Documentation》的书籍,可在 Leanpub 上进行试读。