# 八股-DDD
- [面试题](#%E9%9D%A2%E8%AF%95%E9%A2%98)
- [什么是实体,什么是值对象?](#%E4%BB%80%E4%B9%88%E6%98%AF%E5%AE%9E%E4%BD%93%EF%BC%8C%E4%BB%80%E4%B9%88%E6%98%AF%E5%80%BC%E5%AF%B9%E8%B1%A1%EF%BC%9F)
- [什么是聚合,什么是聚合根?](#%E4%BB%80%E4%B9%88%E6%98%AF%E8%81%9A%E5%90%88%EF%BC%8C%E4%BB%80%E4%B9%88%E6%98%AF%E8%81%9A%E5%90%88%E6%A0%B9%EF%BC%9F)
- [什么是领域事件?](#%E4%BB%80%E4%B9%88%E6%98%AF%E9%A2%86%E5%9F%9F%E4%BA%8B%E4%BB%B6%EF%BC%9F)
- [如何理解领域驱动设计?](#%E5%A6%82%E4%BD%95%E7%90%86%E8%A7%A3%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1%EF%BC%9F)
- [请详细描述DDD的实现流程?](#%E8%AF%B7%E8%AF%A6%E7%BB%86%E6%8F%8F%E8%BF%B0DDD%E7%9A%84%E5%AE%9E%E7%8E%B0%E6%B5%81%E7%A8%8B%EF%BC%9F)
- [DDD的分层架构是怎么样的?](#DDD%E7%9A%84%E5%88%86%E5%B1%82%E6%9E%B6%E6%9E%84%E6%98%AF%E6%80%8E%E4%B9%88%E6%A0%B7%E7%9A%84%EF%BC%9F)
- [DDD核心概念详解](#DDD%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5%E8%AF%A6%E8%A7%A3)
- [**分层架构职责**](#**%E5%88%86%E5%B1%82%E6%9E%B6%E6%9E%84%E8%81%8C%E8%B4%A3**)
- [**战略设计要素**](#**%E6%88%98%E7%95%A5%E8%AE%BE%E8%AE%A1%E8%A6%81%E7%B4%A0**)
- [**战术设计模式**](#**%E6%88%98%E6%9C%AF%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F**)
- [**实施要点**](#**%E5%AE%9E%E6%96%BD%E8%A6%81%E7%82%B9**)
- [**常见误区**](#**%E5%B8%B8%E8%A7%81%E8%AF%AF%E5%8C%BA**)
## 面试题
- DDD的分层架构是怎么样的?
- 什么是充血模型和贫血模型?
- 什么是实体,什么是值对象?
- 什么是聚合,什么是聚合根?
- 什么是领域事件?
- 如何理解领域驱动设计?
- 请详细描述DDD的实现流程?
| 问题 | 关键词/关键概念 |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 如何理解领域驱动设计? | **核心思想**:业务复杂度驱动、统一语言(Ubiquitous Language)、界限上下文(Bounded Context)、战略设计+战术设计、业务专家协作、模型驱动、持续演进 |
| 请详细描述DDD的实现流程? | **战略设计**:1.事件风暴识别领域事件 2.划分界限上下文 3.上下文映射关系<br>**战术设计**:4.识别聚合和实体 5.定义值对象 6.设计领域服务 7.定义仓储接口<br>**实现落地**:8.分层架构搭建 9.编写领域模型 10.实现应用服务 11.基础设施实现 12.持续重构优化 |
| 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的实现流程?
| 问题 | 关键词/关键概念 |
| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| 请详细描述DDD的实现流程? | **战略设计**:1.事件风暴识别领域事件 2.划分界限上下文 3.上下文映射关系<br>**战术设计**:4.识别聚合和实体 5.定义值对象 6.设计领域服务 7.定义仓储接口<br>**实现落地**:8.分层架构搭建 9.编写领域模型 10.实现应用服务 11.基础设施实现 12.持续重构优化 |

## DDD的分层架构是怎么样的?
| 问题 | 关键词/关键概念 |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| DDD的分层架构是怎么样的? | **用户接口层**(Controller/API)→**应用层**(Application Service编排/协调)→**领域层**(Entity/Value Object/Domain Service核心业务)→**基础设施层**(Repository/DB/MQ技术实现)、依赖倒置、领域层不依赖其他层 |

## 什么是实体,什么是值对象?
| 问题 | 关键词/关键概念 |
| ------------- | --------------------------------------------------------------------------------------------------- |
| 什么是实体,什么是值对象? | **实体Entity**:有唯一标识ID、生命周期、可变状态、如User/Order<br>**值对象Value Object**:无标识、不可变、通过属性判等、可替换、如Money/Address |

## 什么是聚合,什么是聚合根?
| 问题 | 关键词/关键概念 |
| ------------- | -------------------------------------------------------------------------------------------------------------- |
| 什么是聚合,什么是聚合根? | **聚合Aggregate**:一组相关对象的集合、事务一致性边界、整体概念单元<br>**聚合根Aggregate Root**:聚合的唯一入口、对外暴露接口、维护聚合内一致性、如Order是OrderItem的聚合根 |

## 什么是领域事件?
| 问题 | 关键词/关键概念 |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 什么是领域事件? | **Domain Event**:领域中发生的业务事件、过去时命名如OrderPlaced、事件驱动、解耦聚合、最终一致性、事件溯源、包含时间戳和相关数据 |

## 什么是充血模型和贫血模型?
| 什么是充血模型和贫血模型? | **贫血模型**:实体只有属性getter/setter、业务逻辑在Service、面向过程、违反OOP<br>**充血模型**:实体包含业务行为、自包含业务逻辑、面向对象、高内聚 |
| ------------- | ------------------------------------------------------------------------------------------ |

## DDD核心概念详解
### **分层架构职责**
- **用户接口层**:REST API、Web页面、DTO转换、参数校验
- **应用层**:用例编排、事务管理、权限控制、调用领域服务
- **领域层**:核心业务规则、领域模型、业务不变量、领域服务
- **基础设施层**:数据持久化、消息队列、缓存、第三方服务集成
### **战略设计要素**
- **界限上下文**:明确边界、独立部署、数据隔离、团队自治
- **上下文映射**:共享内核、客户供应商、防腐层、开放主机服务
- **统一语言**:业务术语一致、代码体现业务、减少翻译成本
### **战术设计模式**
- **工厂模式**:复杂对象创建
- **仓储模式**:持久化抽象
- **规约模式**:业务规则封装
- **领域服务**:跨聚合业务逻辑
### **实施要点**
- **事件风暴**:与业务专家协作、发现领域事件、识别聚合边界
- **增量迭代**:小步快跑、持续重构、演进式设计
- **测试驱动**:单元测试保护领域逻辑、集成测试验证用例
### **常见误区**
- 过度设计、所有项目都用DDD
- 忽视业务复杂度、技术驱动而非业务驱动
- 贫血模型假DDD、只用战术模式忽视战略设计
- 聚合边界过大、事务范围不当