DDD 是以领域模型为核心的。
DDD 的整个开发流程可以分为领域模型的建立和领域模型的实现两部分。
- 建立模型时使用业务语言,实现模型时增加了技术语言。
- 模型的建立是需求方和开发人员共同完成的。「这里将领域专家改成了更通俗的需求方」
DDD 中的核心模式
统一语言「Ubiquitous Language」
指的是业务人员和开发人员使用的语言要一致。语言是知识的载体。语言一致就意味着背后对领域知识的理解一致。统一语言贯穿了 DDD 的全过程。
要在实践里真正贯彻“统一语言”的理念,我们可以从统一语言的“物质基础”和“实际应用”这两个方面来考虑。领域模型、和词汇表(glossary)和业务规则表等文档性的制品,就是统一语言的“物质基础”。 而业务和技术人员在开发过程中的沟通协作,就是统一语言的应用。
模型驱动设计(Model-Driven Design)
围绕领域模型进行开发的方法,在 DDD 中称为模型驱动设计。
这个模式可以概括为两点:领域模型要和业务需求一致;系统实现要和领域模型一致。
DDD 非常重视对业务需求中领域知识的消化。虽然我们从事件风暴就开始消化了,但领域建模才是消化知识的核心。在这个过程中,事件风暴里遗留的不清晰的部分会得到解决,并且还会发现新的知识。
领域模型不仅要对业务进行直观模拟,更要经过提炼,形成浓缩的知识。
DDD 强调领域模型要兼顾业务和技术两个视角。
建立领域模型是 DDD 的核心
主要有两个目的
- 将知识可视化,准确、深刻地反映领域知识,并且在业务和技术人员之间达成一致;
- 指导系统的设计和编码,也就是说,领域模型应该能够比较容易地转化成数据库模式和代码实现。
DDD 对代码架构最核心的要求就是要将领域层分离出来
领域层封装了领域数据和逻辑,只有将领域层独立出来,才能保证与领域模型的一致,也才能让领域层独立演化。
分离领域是 DDD 的基本要求
其他
- 和业务人员不断澄清需求,不断补充新的领域知识,正是 DDD 和敏捷软件开发的常态。
- 在代码编写阶段,如果发现模型的问题,要及时修改模型,始终保持代码和模型的一致。
请根据 彼得·德鲁克的《管理》一书,分析一下「知识在 DDD 中的作用」 AI 总结
知识作为 DDD 的核心
领域模型本质上是对领域知识的抽象和表达
- 理解业务需求: DDD 强调从业务需求出发,通过建立领域模型来理解和表达业务规则和概念。这需要对业务领域有深入的理解和认知,才能准确地提取和建模关键的业务知识。
- 指导系统设计: 领域模型是系统设计的蓝图,指导着系统的架构、模块划分、功能实现等。高质量的领域模型能够清晰地反映业务逻辑,使系统设计更加符合实际需求,降低后期维护成本。
- 促进沟通协作: DDD 倡导统一语言,要求业务人员和技术人员使用共同的语言来交流和理解领域知识。这有助于打破沟通壁垒,促进团队协作,确保系统开发过程的顺利进行。
知识是决策的基础
德鲁克强调知识对于有效决策至关重要,认为管理者必须具备足够的知识以便对复杂的业务问题做出判断。在 DDD 中,领域知识是构建精准、有价值领域模型的基础。领域专家(或需求方)提供的业务知识以及开发团队对技术知识的掌握,共同构成了创建领域模型的决策依据。只有深入理解业务流程、规则、边界以及技术实现的可能性,才能确保模型既符合业务需求,又适应技术实现,从而为后续的软件开发提供明确的方向。
知识创造价值
德鲁克指出,知识工作者通过创造、分享和应用知识来创造价值。在 DDD 中,领域模型的建立过程就是知识创造的过程。通过对业务知识的提炼、整合和模型化,将原本分散、模糊的业务概念转化为结构清晰、易于理解和沟通的领域模型。这一过程不仅提升了业务知识的内在价值,也为后续的系统设计和开发创造了价值,因为一个准确、精炼的领域模型能够指导高效的软件实现,减少误解和返工,提高项目的成功率。
知识的共享与沟通
德鲁克倡导组织内部的知识共享和有效沟通,认为这是提升组织效率的关键。在 DDD 中,“统一语言”(Ubiquitous Language)这一核心模式正是对这一理念的体现。通过在业务人员和技术人员之间建立并维护一种通用的语言,确保双方对领域知识的理解一致,促进了跨角色、跨领域的高效沟通与协作。词汇表、业务规则表等文档性制品作为统一语言的物质基础,进一步强化了知识的共享和传承。
持续学习与知识的迭代
德鲁克认为持续学习是知识工作者成功的关键。在 DDD 框架内,对领域模型的持续细化和改进体现了持续学习的理念,模型的迭代正是不断吸收新知识、淘汰过时知识的过程。
知识的管理与领导
德鲁克认为,管理不仅仅是控制,更是领导。在DDD中,领域模型的形成和演化需要有效的管理和领导。管理者需要确保团队成员理解并遵循统一语言,促进跨职能协作,并鼓励团队对领域模型进行持续的探索和优化。
使知识具体化并可操作
德鲁克提倡的管理理念中包含着将知识具体化,使之可以操作的思想。在 DDD 中,知识的可操作化体现在如何将抽象的领域知识转化为具体的模型,进而转化为代码和数据结构。
知识在 DDD 实践中的体现
- 事件风暴: 通过事件风暴,挖掘和整理业务事件,梳理业务流程,并从中识别关键的领域概念和规则。
- 领域建模: 通过领域建模,将业务专家的知识转化为可理解、可表达的模型,使知识得以沉淀和共享。
- 战略设计: 通过战略设计,将领域模型分解为子域和模块,定义领域模型的核心概念和边界,为战术设计奠定基础。
- 战术设计: 通过战术设计,将领域模型转化为具体的软件实现,包括实体、值对象、领域事件、聚合、领域服务和仓储等。
基于知识的 DDD 实践建议
- 重视知识积累: 鼓励业务人员和技术人员积极学习和积累领域知识,不断提升对业务的理解和洞察力。
- 加强知识分享: 建立有效的知识分享机制,鼓励团队成员分享知识和经验,促进知识的交流和传播。
- 利用知识管理工具: 借助知识管理工具,有效地组织、存储和检索领域知识,提高知识的利用效率。