知识卡片
DDD的本质:一套处理复杂系统的等级机制
内容
DDD涌现出的领域、子领域、限界上下文、聚合、实体、值对象这些概念之间存在包含关系,每一个概念负责解决一类特定粒度的问题:值对象只解决对象属性层面的问题,实体解决对象完整生命周期的问题,聚合解决模块层面的问题,限界上下文解决简单系统层面的所有问题;当系统复杂度进一步提升,超出单个限界上下文能处理的范围,子领域和领域这两个更高层级的概念就出现了,负责把系统按规则继续拆分,直到拆到限界上下文这个粒度、可以用面向对象方法处理为止。这意味着DDD的设计里内嵌了一整套”复杂系统处理的等级机制”——无论系统有多复杂,DDD总有相应等级的概念去应对这个复杂程度,而不是只有一套”放之四海而皆准”的固定方案。这也解释了DDD为什么会随微服务一起兴起:微服务把大型系统拆成小型系统、再进一步细化成更小的服务模块,而DDD天生具备的这种拆分灵活性,让它能适用于任意复杂度的系统——DDD的本质,就是通过一个灵活的等级机制来应对系统的复杂度,能根据实际需要把任何规模的系统拆分到刚好适合处理的粒度。可迁移启发:面对一个具体系统时,不要一上来就套用DDD全套概念(领域、子领域、限界上下文、聚合、实体、值对象一个不落),而是先判断这个系统的复杂度落在等级机制的哪一档——足够简单的系统可能只需要实体和值对象层面的建模,用不上领域和子领域这两层,强行套用反而是过度设计。
结构图:
flowchart TB
V["值对象:对象属性层面"]
E["实体:对象完整生命周期"]
A["聚合:模块层面"]
B["限界上下文:简单系统层面(可用面向对象处理)"]
S["子领域:系统复杂度超出单一限界上下文时出现"]
D["领域:系统更复杂时,进一步拆分子领域"]
V --> E --> A --> B --> S --> D
D -.等级机制的意义.-> M["无论系统多复杂,总有对应等级概念可用<br/>=DDD能与微服务共同适配任意复杂度"]
参考来源
- 位置:《架构师启示录:知识模型、落地方法与思维模式》第7章《架构设计》之"7.4.2 DDD的本质"(源文件:_epub-src/EPUB/xhtml/chapter11.xhtml)
- 结论依据:原文说明"每一个概念代表解决一类问题。例如,值对象只能解决对象属性层面的问题,实体可以解决对象完整生命周期的问题,聚合可以解决模块层面的问题,限界上下文则可以解决简单系统层面的所有问题……DDD的本质就是通过一个灵活的等级机制来应对系统的复杂度,它可以根据需要将任何规模的系统拆分成适合处理的粒度", 直接支撑本卡关于DDD等级机制及其与微服务共同兴起原因的结构图。
- 原始内容:DDD所具备的拆分灵活性,让它可以适用于任意复杂度的系统,并因此与微服务一起被广泛应用。