DDD系列 1 —— DDD 为什么会存在?
作者:程序员罗尼 | 发布:2022-12-06 | 原文:https://mp.weixin.qq.com/s/IDc_j5DMNLISG0ElknnYDQ
相信每个写过几年代码的人都听说过 DDD,也就是领域驱动设计,但是 DDD 具体是什么又众说纷纭,让人困惑。我这个系列的文章就是想从 DDD 思想的源头来概述一下 DDD 是什么,希望对大家全面理解和继续探索 DDD 有所帮助。本系列文章的主要参考资料是以下三本书:
- 《领域驱动设计》
- 《实现领域驱动设计》
- 《解构领域驱动设计》
下面开始正文。
一、DDD 被提出的背景
DDD 由 Eric Evans 提出并于 2003 年出版了经典之作《领域驱动设计》。在前言中作者说到,20 年前(也就是 80 年代)就已经有人认识到领域建模和设计的重要性,但是一直没有人写出点什么东西进行系统性的总结。作者写这本书时,面向对象设计领域已经有一种思潮在涌动,作者将其称之为领域驱动设计(DDD)。
本书主要介绍了作者在前人和自身的实践中总结出的一种软件设计方法,并提供了一个讨论领域驱动设计的词汇表,包括一些用于描述领域驱动设计的概念和一些进行领域建模的最佳实践。我们一方面可以根据书中的词汇和概念来讨论和发展领域驱动设计,更重要的是,我们还可以将书中提到的模式和最佳实践应用到日常的开发中,提高我们的软件质量。
下面我们看看领域驱动设计为什么会存在?主要解决什么问题?
二、领域驱动设计存在的现实基础
这里作者提到了两点:
第一,在大多数软件项目中,主要的焦点应该是领域和领域逻辑。 这是因为软件都同时具有技术复杂性和领域复杂性。虽然大部分技术人员都重视技术复杂性,不断在技术上提升自己的能力,经常忽略了业务领域本身的复杂性,但大多应用程序的复杂性并不在于技术上,而在于领域本身,包括其复杂的业务模型和多变的业务用例。所以,要想更好地掌控领域的复杂性,我们也需要掌握一些良好的设计方法。
第二,复杂的领域设计应该基于模型。 这是因为现实世界太复杂了,模型是一种对现实的简化。为了创建真正能为用户使用的软件,团队必须了解一整套有关的知识体系,其所需知识的广度可能令人望而生畏,信息的复杂程度也可能超乎想象。通过模型,我们可以把仅与解决问题密切相关的方面抽象出来,而忽略无关的细节。模型对知识进行了选择性的简化和有意的结构化。通过适当的模型可以使人更好地理解领域的意义,并专注于领域问题。
以上两个实际问题是领域驱动设计之所以被提出的两个原因。那什么样的团队可以使用 DDD 呢?
三、运用 DDD 需要遵循的实践
首先说明,虽然 DDD 是一种软件设计方法,但设计过程和开发过程是密不可分的。所以,为了应用领域驱动设计,也要遵循一些相应的开发实践来支持 DDD 的设计过程。
虽然 DDD 并不限制具体的流程,但是开发过程还是要遵循两个最基本的实践:
第一个是迭代开发。 这是因为 DDD 的核心是领域模型,领域模型需要在不断的学习和改进中完善,所以软件开发过程也需要支持这种持续改进。
第二个实践是开发人员和领域专家要密切合作。 这是因为好的模型既需要准确地反映领域知识,又需要能和开发过程紧密结合起来。要实现这两个目标,我们需要领域专家来保证模型的知识性和准确性,又需要开发人员来保证模型与实现紧密地关联在一起,准确实现领域设计的意图。
在了解了 DDD 的背景、现实基础和应用 DDD 的要求之后,我们就可以真正进入了解 DDD 的旅程了。
四、DDD 全貌
下面我们从总体上看一下 DDD。DDD 主要可以分为两个设计方面,一个是战略设计,一个是战术设计。
- 战略设计主要是决定整个问题领域如何拆分成子领域,哪一个是核心领域,哪一些是支撑领域,子领域如何保持自己的独立性,子领域之间的依赖关系是怎么样的,各自如何演化等等。
- 战术设计则主要集中精力在一个子领域内部,研究如何在一个子领域内建立具有深刻表现力的模型,怎样在代码中对模型进行实现,以及如何通过不断的迭代精化模型等等。
下面简略地通过两张图看一下战略设计和战术设计分别包含的内容:

这个图是 DDD 中战略设计相关的一些模式和实践。

这个图是 DDD 中战术设计相关的一些模式和实践。后面的文章会进一步解释图中的概念。
小结
下面总结一下这篇的内容:
- DDD 被提出的背景
- 领域驱动设计存在的现实基础
- 运用 DDD 需要遵循的实践
- 领域驱动设计全貌
今天先写到这里了。
(完)