拥有大型领域模型的软件系统可能会变得非常复杂,这使得查看整个图片变得令人难以承受。
模块的概念是许多编程语言中的一个设计元素(在 Java 中称为包,在 C# 中称为命名空间),用于划分代码以管理复杂性并协助代码重用。
通常,编程语言教科书主要将模块作为代码组织工具来推广。

相反,领域驱动设计通过将模块视为我们模型的一部分并使用它们来划分概念来提高模块的重要性(Evans,2003)。正如 Evans (2003) 所说,“模块之间应该具有低耦合性,而内部应该具有高内聚性”。
最后一句话非常熟悉,是面向对象编程的基石,即类之间的低耦合和类内部的高内聚(Martin,2009)。
尽管模块的作用是不言而喻的,但许多应用程序框架指导开发人员在技术上而不是概念上对代码进行分组,例如通过将所有接口放置在单个模块中,将处理业务逻辑的所有类放置在另一个模块中,将处理数据访问的所有类放置在另一个模块中等等。

DDD 模块应该具有有意义的名称,这些名称是通用语言的一部分(Evans,2003)。
此外,模块应该与所包含的代码元素并行发展,而不是保持静态,即我们可能必须重构模块,因为我们的概念视图因领域模型中新概念的引入而不同(Evans,2003;Vernon, 2013)。

在Python编程语言中,最高级别的组织单元称为模块(Lutz,2013)。事实上,任何包含Python函数、类、数据等的文件都是一个模块,可以导入和使用其他模块。
因此,Python 模块和 DDD 模块是一一匹配的。

 参考

  • Evans, E. (2003) 领域驱动设计:解决软件核心的复杂性。波士顿:艾迪生-韦斯利。

  • Lutz, M. (2013) 学习 Python。北京:奥莱利。

  • Martin, R. (2009) 干净代码:敏捷软件工艺手册。波士顿:普伦蒂斯霍尔。

  • Vernon, V. (2013) 实施领域驱动设计。波士顿:艾迪生-韦斯利。

这篇文章摘自我的硕士论文,题为“在 Python 中应用领域驱动设计 - 设计一个自托管的稍后阅读服务”(2014 年 1 月)。