参考:https://zhuanlan.zhihu.com/p/101592594
领域驱动模型设计(DDD:Domain-Driven Design)
边界是核心
核心思想:对边界的划分与控制
问题空间
- 第一重边界:
目标(WHY):为了解决问题
聚焦(WHAT):划定问题空间(确定核心子领域、通用子领域与支撑子领域)
HOW:确定项目的愿景与目标
解决方案空间
-
第二重边界:
目标(WHY):为了边界内外可以形成两个不同的世界
聚焦(WHAT):限界上下文
HOW:外部世界的规则是契约、通信以及系统级别的架构风格与模式,内部世界的规则是分层、协作以及类级别的设计风格与模式 -
第三重边界:
目标(WHY):为了隔离业务复杂度与技术复杂度
聚焦(WHAT):基础设施层、应用层与领域层之间的隔离
HOW:将领域层作为整个系统稳定而内聚的核心,是领域驱动设计的关键特征,即分离变与不变 -
第四重边界:
目标(WHY):为了维持领域模型绝对的稳定性
聚焦(WHAT):聚合
HOW:聚合设计原则要求聚合之间通过ID进行关联
这四重边界如下图所示:
image
具体实施:
-
三大纪律
- 领域专家与开发团队工作在一起
- 领域模型必须遵循统一语言
- 时刻坚守四重设计边界
-
八项注意
- 子领域与限界上下文不要混为一谈
- 一个限界上下文不能由多个团队开发
- 跨进程协作通过远程服务,进程内协作通过应用服务
- 保证领域分析模型、领域设计模型与领域实现模型的一致
- 不要将领域模型暴露在应用层之外
- 不要让数据模型干扰领域模型的设计
- 聚合之间只能通过聚合根ID引用
- 聚合不能依赖访问外部资源的网关
具象(什么是领域驱动设计?)
关键准则
领域是应用程序化的对象领域(例如:在库管理)。在域驱动设计中,主要前提是【应用程序的本质是领域】。聚焦在领域内而不是领域外的对象。
“领域模型”的对象模型在领域驱动设计中起着重要的作用。领域模型是领域中存在的概念的抽象(例如:库存管理中“仓库”或“移动”)。领域模型是对象的集合。领域中存在的所有基本行为(业务逻辑)都被建模成领域模型的职责。更具体地说,将所有行为建模成一个对象的责任或多个对象的交互。在领域驱动设计中,领域模型是应用程序开发的起点和基础。
【基本准则】
- 领域是应用程序的本质
- 使用从领域知识派生的通用语言;普遍存在的语言是目标领域中使用的术语的集合,为了消除歧义和重复。
- 使用通用语言进行团队交流,文档书写,领域模型类和方法名称,服务名称等的定义。
- 迭代开发的同时,保持领域模型,使通用语言和实现之间的一致性和可追溯性成为可能。
[补充准则]
-
灵活运用模型驱动开发,面向对象技术,敏捷开发方法。然而不会像分析模型、设计模型那样,分离模型。使用一个模型。
一言以蔽之,所谓领域驱动模型就是聚焦【领域中心】的面向对象的开发方法。 -
基本上是面向对象的。
-
迭代流是模型驱动的。
-
开发过程是一种敏捷方法。
要开始使用域驱动的设计,需要了解三种方法的知识为前提:面向对象,模型驱动,敏捷开发。模型驱动和敏捷需要一定程度的知识来理解该概念,而面向对象则需要一些实践技能。如果您对这三种方法一无所知,而突然进入了DDD,领域驱动设计理解起来就不那么容易了。
但是,如果没有这三种技能,并不是不能开始。领域驱动设计使用迭代型方式进行实践。关于这三种技能,我认为通过这种重复来提高技能也不错。
借助https://www.wps.de/modeler/来划分领域
网友评论