领域驱动设计(Domain-Driven Design, DDD) 是一种软件开发方法论,由Eric Evans在2003年提出,旨在通过深入理解和建模业务领域来应对复杂系统的开发挑战。其核心思想是将业务领域知识与技术实现紧密结合,确保软件设计与实际业务需求高度一致。
核心概念
-
领域(Domain)
业务所涉及的特定问题域(如电商、金融、医疗等),DDD强调以领域为中心进行建模。 -
子域(Subdomain)
将复杂领域拆分为更小的子域(如电商系统中的订单、支付、库存),每个子域聚焦特定业务能力。 -
核心域(Core Domain)
业务成功的关键部分(如电商平台的交易流程),需投入最多资源进行精细化设计。 -
通用语言(Ubiquitous Language)
开发团队与业务专家共同定义的统一术语,确保代码、文档与业务描述一致(例如“订单状态”在代码中直接体现为OrderStatus
)。
关键组件(战术设计)
-
实体(Entity)
具有唯一标识的对象,其连续性(如用户ID)比属性更重要(例如用户、订单)。 -
值对象(Value Object)
无唯一标识,通过属性值定义(如地址、货币金额),具有不可变性。 -
聚合(Aggregate)
一组关联对象的集群,由聚合根(Aggregate Root)维护一致性(例如订单聚合包含订单项,通过订单ID操作)。 -
领域服务(Domain Service)
封装跨多个实体或聚合的业务逻辑(如支付服务协调订单与账户)。 -
仓储(Repository)
抽象数据访问逻辑,提供领域对象的持久化与检索接口。
战略设计模式
-
限界上下文(Bounded Context)
明确模型适用的边界(如“用户”在订单上下文与账户上下文中的定义可能不同)。 -
上下文映射(Context Map)
描述不同限界上下文之间的协作关系(如防腐层、共享内核)。
实施步骤
-
与业务专家协作
通过事件风暴(Event Storming)等方法梳理业务流程。 -
划分限界上下文
根据业务边界定义子域和对应的模型。 -
建模领域对象
使用聚合、实体、值对象等构建领域模型。 -
分层架构
通常采用分层架构(如六边形架构、洋葱架构),分离领域层与基础设施。
适用场景
- 复杂业务系统:如金融交易、供应链管理。
- 高可维护性需求:需长期迭代的系统。
- 跨团队协作:通过限界上下文减少耦合。
优势与挑战
-
优势:
- 提升代码与业务的一致性。
- 增强团队沟通效率。
- 支持复杂系统的长期演进。
-
挑战:
- 需要业务与技术深度协作。
- 初期设计成本较高。
示例:电商订单场景
- 聚合根:
Order
(包含订单项、支付状态)。 - 值对象:
Address
(街道、城市等属性不可变)。 - 领域服务:
OrderService
处理下单逻辑,协调库存与支付。 - 仓储:
OrderRepository
负责持久化订单数据。
通过DDD,系统能更灵活地应对业务变化(如新增促销规则),同时保持代码清晰。