# 八股-DDD
## 面试题
- DDD的分层架构是怎么样的?
- 什么是充血模型和贫血模型?
- 什么是实体,什么是值对象?
- 什么是聚合,什么是聚合根?
- 什么是领域事件?
- 如何理解领域驱动设计?
- 请详细描述DDD的实现流程?
|问题|关键词/关键概念|
|---|---|
|DDD的分层架构是怎么样的?|**用户接口层**(Controller/API)→**应用层**(Application Service编排/协调)→**领域层**(Entity/Value Object/Domain Service核心业务)→**基础设施层**(Repository/DB/MQ技术实现)、依赖倒置、领域层不依赖其他层|
|什么是充血模型和贫血模型?|**贫血模型**:实体只有属性getter/setter、业务逻辑在Service、面向过程、违反OOP<br>**充血模型**:实体包含业务行为、自包含业务逻辑、面向对象、高内聚|
|什么是实体,什么是值对象?|**实体Entity**:有唯一标识ID、生命周期、可变状态、如User/Order<br>**值对象Value Object**:无标识、不可变、通过属性判等、可替换、如Money/Address|
|什么是聚合,什么是聚合根?|**聚合Aggregate**:一组相关对象的集合、事务一致性边界、整体概念单元<br>**聚合根Aggregate Root**:聚合的唯一入口、对外暴露接口、维护聚合内一致性、如Order是OrderItem的聚合根|
|什么是领域事件?|**Domain Event**:领域中发生的业务事件、过去时命名如OrderPlaced、事件驱动、解耦聚合、最终一致性、事件溯源、包含时间戳和相关数据|
|如何理解领域驱动设计?|**核心思想**:业务复杂度驱动、统一语言(Ubiquitous Language)、界限上下文(Bounded Context)、战略设计+战术设计、业务专家协作、模型驱动、持续演进|
|请详细描述DDD的实现流程?|**战略设计**:1.事件风暴识别领域事件 2.划分界限上下文 3.上下文映射关系<br>**战术设计**:4.识别聚合和实体 5.定义值对象 6.设计领域服务 7.定义仓储接口<br>**实现落地**:8.分层架构搭建 9.编写领域模型 10.实现应用服务 11.基础设施实现 12.持续重构优化|
## DDD核心概念详解
### **分层架构职责**
- **用户接口层**:REST API、Web页面、DTO转换、参数校验
- **应用层**:用例编排、事务管理、权限控制、调用领域服务
- **领域层**:核心业务规则、领域模型、业务不变量、领域服务
- **基础设施层**:数据持久化、消息队列、缓存、第三方服务集成
### **战略设计要素**
- **界限上下文**:明确边界、独立部署、数据隔离、团队自治
- **上下文映射**:共享内核、客户供应商、防腐层、开放主机服务
- **统一语言**:业务术语一致、代码体现业务、减少翻译成本
### **战术设计模式**
- **工厂模式**:复杂对象创建
- **仓储模式**:持久化抽象
- **规约模式**:业务规则封装
- **领域服务**:跨聚合业务逻辑
### **实施要点**
- **事件风暴**:与业务专家协作、发现领域事件、识别聚合边界
- **增量迭代**:小步快跑、持续重构、演进式设计
- **测试驱动**:单元测试保护领域逻辑、集成测试验证用例
### **常见误区**
- 过度设计、所有项目都用DDD
- 忽视业务复杂度、技术驱动而非业务驱动
- 贫血模型假DDD、只用战术模式忽视战略设计
- 聚合边界过大、事务范围不当