Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. DDD
  3. 正文
                           

【转载】DDD 的 7 大关键概念

2024-09-08 1435点热度 0人点赞 0条评论

领域驱动设计是一种设计思想,来源于 Eric Evans  的一本书 Domain-Driven Design –Tackling Complexity in the Heart of Software。它倡导通过建立领域模型来驱动软件的设计,也就是从业务知识出发设计业务人员和技术人员都能理解的模型。

统一语言是领域驱动设计的关键概念之一。领域建模的核心难点就在于业务人员和技术人员使用了不同的概念(词汇)来描述他们对软件的理解。如果能使用同样的语言交流,那么复杂软件的设计就变得更加容易。

领域模型就是跨越业务领域作为问题空间和软件解决方案空间的桥梁。

DDD 的 7 大关键概念

01 使用模型表达业务实体

使用模型来表达业务概念和知识,并指导数据库、API 等软件的进一步设计。模型思维是软件工程中重要的思维之一,它可以简化复杂问题,并从某一个视角出发让人们更加容易理解问题。

模型是对现实世界的简化,例如地图就是一种有效的模型,帮助人们理解道路和街道。

领域模型就是对业务领域简化的模型。

02 识别模型的边界

领域模型集合之间由于业务的相关性可能形成松散的边界,这些边界就是我们分解复杂、大型问题为局部、消息问题的契机。

通过辨析模型的相关性,找到边界就能为软件模块的划分(单体架构)、服务的划分(微服务架构)提供指导。

在领域驱动中,识别出来的边界被称为界限上下文。

03 识别聚合

在数据库的关系模型中,模型为一张网络结构。这样对于代码实现存在困扰,因为难以处理业务的一致性问题。例如,订单、订单项目、商品之间,订单和订单项目的关系更加密切,具有相同的业务生命周期。在领域驱动设计理念中,我们使用聚合代表一组模型的从属关系,其中起到关键带头作用的模型被叫做聚合根,除此之外被叫做实体和值对象。

如果一个聚合只有一个实体,那么聚合根就是这个实体。

04 区分实体和值对象

除了聚合根和实体之外,有一些模型看起来就像一次性的,他们没有自己的 ID 来标明身份,更多的是作为某个实体的一部分,表达几个字段的集合。

例如,在电商系统中,用户设定的常用地址,就是典型的实体,它有自己的 ID 作为身份。但当用户为订单选择地址时,这时的地址只是订单上的若干字段,我们就会把它处理为值对象。

05 操作模型

在领域驱动设计中,为了操作这些模型,又衍生了一些作为“操作者”的对象。

工厂:处理领域模型创建过程的对象,但有时候不是必须的。服务:用来处理某些业务逻辑的对象。例如,为订单计算总价,或者校验一些业务规则。仓储:负责将领域模型持久化到数据库中或从数据库中重建的对象,它的目的是为了隔离领域模型和技术实现之间的差异。

06 对架构分层

为了更好的组织项目中各种各样的对象,我们需要像计算机网络一样分层,来简化复杂项目的复杂性。

在领域驱动设计中,推荐使用四层架构:

  • 用户接入层:处理用户接入的数据结构,例如 RESTful API,或者事件。
  • 应用层:处理用户的业务操作逻辑,也就是用例,它和用户的使用场景相关。
  • 领域层:处理通用的领域逻辑,也就是较为专业的业务逻辑,例如订单价格计算。
  • 基础设施层:用来和基础设施适配,例如连接数据库,操作 Redis等。

07 建立领域模型

为了从业务知识中提取出领域模型,人们发明了很多种方法。

事件风暴是一种流行的软件建模方法。它的形式是通过工作坊引导业务人员和技术人员共同创作领域模型,以业务事件为线索,探索系统中可能的领域模型。

除了事件风暴之外,彩色建模也是一种常用的建模方法。它通过颜色区分不同领域模型的特点,来澄清领域模型的职责。彩色建模在过去的很多年里曾非常流行。

 

本文仅供学习!所有权归属原作者。侵删!文章来源: ByteByteGo -李华 :http://mp.weixin.qq.com/s/80NTgbLZmf8ITWx8oY0Y8A

更多文章:

  1. 系统设计 | RESTful API 使用问题和建议
  2. 京东平台研发朱志国:领域驱动设计(DDD)理论启示
  3. 基于DDD的微服务设计和开发实战
  4. 大家一直在谈的领域驱动设计(DDD),我们在互联网业务系统是这么实践的
  5. DDD 学习与感悟 —— 向屎山冲锋
  6. 殷浩详解DDD系列 第二讲 - 应用架构
  7. 从MVC到DDD,该如何下手重构?
  8. DDD系列第五讲:聊聊如何避免写流水账代码
  9. 解构领域驱动设计(一):为什么DDD能够解决软件复杂性
  10. 解构领域驱动设计(二):分层架构
标签: 转载 架构 ddd 领域驱动设计 聚合 实体 微服务 领域模型 值对象
最后更新:2024-09-08

coder

分享干货文章,学习先进经验。

打赏 点赞
< 上一篇
广告
文章目录
  • 01 使用模型表达业务实体
  • 02 识别模型的边界
  • 03 识别聚合
  • 04 区分实体和值对象
  • 05 操作模型
  • 06 对架构分层
  • 07 建立领域模型
最新 热点 推荐
最新 热点 推荐
干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议 视频笔记:什么是微服务,为什么是微服务? 视频笔记:什么是AI 智能体? 视频笔记:什么是Flink? 如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具
Elasticsearch 使用误区之六——富文本内容写入前不清洗基于 MySQL Binlog 实现可配置的异构数据同步马蜂窝消息总线——面向业务的消息服务设计干货 | 论Elasticsearch数据建模的重要性你可以不用RxJava,但必须得领悟它的思想!如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具视频笔记:什么是Flink?视频笔记:什么是AI 智能体?
DDD四色建模法 系统设计 | 企业应用数据交换 云音乐贵州机房迁移总体方案回顾 ParNew+CMS 实践案例 (一)- NameNode YGC诊断优化 设计模式在外卖营销业务中的实践 Elasticsearch 使用误区之五——单次请求获取大量数据 ChatGPT的探索与实践 Prompt之【翻译】

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (2) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (18) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2

x