第1章:DDD入门(Introduction to DDD)
一、导读
1.1 本章学习目标
第1章介绍领域驱动设计(DDD)的核心理念——用业务领域来指导软件设计。
本章的核心学习目标包括:
- 理解 DDD 的核心思想:领域模型是软件的核心
- 掌握统一语言(Ubiquitous Language)
- 理解限界上下文(Bounded Context)
- 区分战略设计和战术设计
1.2 为什么本章如此重要
DDD 不是技术框架,而是一种设计方法论。它解决的核心问题是:如何让软件真实反映业务现实?当业务复杂到一定程度时,技术驱动的设计会失败——只有领域驱动的设计才能应对。
1.3 核心问题引导
什么是领域模型?它和技术模型有什么区别?
统一语言为什么如此重要?
限界上下文解决了什么问题?
DDD 的战略设计和战术设计分别关注什么?
二、核心概念详解
2.1 领域模型
领域模型:对业务领域的简化和抽象表示
不是:
- 数据库表结构
- API 接口定义
- 技术架构图
而是:
- 业务概念和关系的表达
- 业务规则和约束的体现
- 业务行为的抽象2.2 统一语言
java
// 不好的设计:技术语言
class UserDTO {
private String name;
private String email;
private int status; // 0=active, 1=inactive
}
// 好的设计:统一语言(业务语言)
class Customer {
private CustomerName name;
private EmailAddress email;
private CustomerStatus status; // ACTIVE, INACTIVE, SUSPENDED
boolean isActive() { return status == CustomerStatus.ACTIVE; }
void suspend() { status = CustomerStatus.SUSPENDED; }
}2.3 限界上下文
限界上下文:领域模型的边界
同一个概念在不同上下文中有不同含义:
- 电商上下文:Product(商品,有价格、库存)
- 物流上下文:Product(货物,有重量、体积)
- 财务上下文:Product(资产,有折旧、价值)
每个限界上下文有自己的:
- 统一语言
- 领域模型
- 数据模型
- 团队2.4 战略设计 vs 战术设计
战略设计(Strategic Design):
- 限界上下文的划分
- 上下文之间的关系(Context Map)
- 团队的组织和沟通
战术设计(Tactical Design):
- 实体(Entity)
- 值对象(Value Object)
- 聚合(Aggregate)
- 领域服务(Domain Service)
- 领域事件(Domain Event)
- 仓储(Repository)三、实战案例
3.1 案例一:电商系统的限界上下文
电商系统的限界上下文:
1. 商品目录(Catalog)
- Product, Category, Brand
- 关注:商品描述、分类、搜索
2. 库存(Inventory)
- StockItem, Warehouse
- 关注:数量、位置、补货
3. 订单(Order)
- Order, OrderLine, OrderStatus
- 关注:下单、支付、发货
4. 支付(Payment)
- Payment, Transaction, Refund
- 关注:支付渠道、对账、退款
5. 物流(Shipping)
- Shipment, TrackingEvent
- 关注:配送、跟踪、签收
每个上下文独立开发、独立部署、独立数据库
通过上下文映射(Context Map)定义交互方式四、本章小结
领域模型:业务领域的抽象表示,是软件的核心。
统一语言:开发团队和业务专家共享的语言。
限界上下文:领域模型的边界,统一语言的作用范围。
战略设计:上下文划分和关系。战术设计:实体、值对象、聚合等。
五、思考与练习
为一个你熟悉的业务系统识别限界上下文。
统一语言在实际项目中如何推广?
限界上下文和微服务有什么关系?