01. 什么是DDD?
DDD(Domain-Driven Design)领域驱动设计
DDD是一种软件开发方法,可以帮助我们设计高质量的软件模型。
DDD是Eric Evans在2003年出版的《领域驱动设计:软件核心复杂性应对之道》(Domain-Driven Design: Tackling Complexity in the Heart of Software)一书中提出的具有划时代意义的重要概念,是指通过统一语言、业务抽象、领域划分和领域建模等一系列手段来控制软件复杂度的方法论.
DDD的革命性在于领域驱动设计是面向对象分析的方法论,它可以利用面向对象的特性(封装、多态)有效地化解复杂性,而传统J2EE或Spring+Hibernate等事务性编程模型只关心数据。这些数据对象除了简单的setter/getter方法外,不包含任何业务逻辑,业务逻辑都是以过程式的代码写在Service中。这种方式极易上手,但随着业务的发展,系统也很容易变得混乱复杂。
领域驱动设计关心的是业务中的领域划分(战略设计)和领域建模(战术设计),其开发过程不再以数据模型为起点,而是以领域模型为出发点,研发过程如图所示。领域模型对应的是业务实体,在程序中主要表现为类、聚合根和值对象,它更加关注业务语义的显性化表达,而不是数据的存储和数据之间的关系。
Evic Evans在著作中将软件系统的设计分为2个部分:战略设计和战术设计。
在战略设计层面提出了域、子域、限界上下文等重要概念;在战术设计层面提出了实体、值对象、领域服务、领域事件、聚合、工厂、资源库等重要概念。如图所示:
战略设计部分指导我们如何拆分一个复杂的系统,(全局思考)
战术部分指导我们对于拆分出来的单个子系统如何进行落地,在落地过程中应该遵循哪些原则。(局部方法)
02. 为什么需要DDD?
1. 统一语言,使业务专家和技术人员组成一个密切协作的团队,不需要翻译。统一结果认知。
2. 更方便知识沉淀,知识传递。
3. 设计就是代码,代码就是设计,业务建模代码可反推业务。
4. 可分析出组织重点,做组织核心能力倾斜。
其他理解
1. 更好的分析业务。
2. 战术设计提供了比较有效的设计方案。
3. 了解多一种架构思想,开拓自己的设计思路。
03. DDD能带来的价值
1. 获得一个有用的领域模型
2. 业务得到了更准确的定义和理解
3. 更好的用户体验
4. 清晰的模型边界
5. 更好的企业架构
6. 敏捷、迭代式和持续建模