​一份关于DDD的FAQ #​

news2024/5/18 18:39:14

前几年,我全程采用DDD开发了一个一物一码管理平台——码如云,并成功上线。在这个过程中,我们学了很多,积累了很多,也踩了不少的坑。在本文中,我希望通过FAQ(Frequently Asked Questions,常见问题)的方式给大家分享一下我对DDD的一些看法。如果对DDD落地感兴趣,可以参考我的DDD落地文章系列。


问:DDD最大的受益者是谁?

答:架构师和程序员,请注意,这里的架构师是那些工作在前线,至少会参与软件模型设计的架构师,最好是依然参与代码编写工作。


问:搞DDD需要哪些条件?

答:建议先写3年左右的代码,在熟悉了面向对象技术后再学习DDD可能更加容易上手。


问:DDD为什么有时也被称为"玄学"?

答:很多对DDD的解读比较空洞,纸上谈兵,无法指导软件项目的实际落地,这种对DDD虚无缥缈的解读被有些人称为"玄学"。


问:哪些人可以做领域专家?

答:任何熟悉业务的人,比如银行的前台工作人员对于银行业务系统来说则可认为是领域专家。


问:业务分析师(BA)需要了解DDD吗?

答:不需要,BA需要做的事情是理清业务,然后将业务传递给架构师或程序员。


问:DDD的战略设计是什么?

答:DDD的战略设计只在解决一个问题,即软件的模块化划分问题。


问:DDD与微服务是什么关系?

答:没关系,业界有个说法是“DDD的限界上下文可以帮助指导微服务的划分”,但是这个说法过于笼统和牵强,基本不具现实指导意义。


问:DDD当下为什么这么火?

答:可能是跟风者比较多吧,或者是前面提到的与微服务那种牵强的关系,DDD就是一个工具而已,原本不应该这么火的。


问:DDD与TOGAF有什么关系?

答:没有关系,TOGAF主要用于企业整体架构,而DDD侧重于一个具体业务系统的软件设计和落地。


问:搞DDD必须搞事件风暴吗?

答:不用,事件风暴主要用于帮助我们了解业务流程,在实践中事件风暴很容易陷入“为了搞事件风暴而搞事件风暴”的陷阱,建议采用更加朴素的方式梳理业务。


问:DDD与面向对象是什么关系?

答:可以认为DDD是面向对象进阶,这也是为什么前面有建议说熟悉了OO之后再搞DDD。


问:DDD的战术设计包含哪些概念?

答:包含应用服务,聚合根,领域服务,实体,值对象,工厂,领域事件,资源库等。


问:为什么建议将业务概念优先建模为值对象而不是实体?

答:因为值对象是不可变的,可以大大降低系统的信息熵进而降低程序员的负担,并且可以方便逻辑推理和系统调试。


问:怎么理解聚合根?

答:聚合根表示业务中那些顶级的实体对象,其内部数据相互紧密联系,即“聚合”在一起。比如,电商系统中的“订单(Order)”,CRM系统中的“客户(Customer)”均是典型的聚合根对象。


问:不变条件是什么意思?

答:不变条件表示在聚合根中,那些具有业务互动性的业务逻辑,不变条件必须在同一个聚合根的公有方法中得到满足,否则容易导致业务逻辑的泄漏。一个老生常谈的例子是订单(Order),修改订单项内容后,订单价格也应该随之变化,因此对订单项的修改和对价格的修改应该放到同一个方法(比如updateOrderItems())中。


问:事务边界应该放在哪里?

答:应用服务,因为应用服务中的共有方法和业务用例一一对应,而业务用例又与事务一一对应。


问:什么时候应该用领域服务?

答:当将业务逻辑放在聚合根中不合适的时候,才考虑创建领域服务来存放这些业务逻辑。比如,在更新成员手机号时,需要检查手机号是否已经被他人占用,这种跨聚合根的业务逻辑无法放到某一个成员对象中,此时应该采用领域服务。


问:应用服务和领域服务的区别是什么?

答:应用服务和领域服务是很不一样的概念,应用服务是领域模型的门面,所有外部请求都由应用服务的调度编排后进入领域模型中,而领域服务是属于领域模型的一部分。应用服务不包含业务逻辑,领域服务则相反。


问:如何保证发送领域事件和更新聚合根之间一致性?

答:采用事件发送表,即先将事件保存到与聚合根相同的数据库中,这样通过数据库的本地事务即可完成它们之间的数据一致性,然后再通过一个单独的组件从事件表中加载领域事件再发送出去。更多详情,请参考这里。


问:DDD和CQRS是什么关系?

答:没关系,不过在DDD项目中通常会采用CQRS,以得到更加纯粹的领域模型,当然CQRS的作用并不止于此。


问:有推荐的DDD书籍吗?

答:《领域驱动设计:软件核心复杂性应对之道》(蓝皮书),《实现领域驱动设计》(红皮书),《领域驱动设计模式、原理与实践》,《解构领域驱动设计》等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1038498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode算法心得——美丽塔 I(HashMap)

大家好,我是晴天学长,hashmap的灵活应用,然后边界的细节处理,需要的小伙伴可以关注支持一下哦!后续会继续更新的。 1) .美丽塔 美丽塔 I 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴…

SpringBoot项目(百度AI整合)——如何在Springboot中使用文字识别OCR入门

前言 前言:本系列博客尝试结合官网案例,阐述百度 AI 开放平台里的组件使用方式,核心是如何在spring项目中快速上手应用。 本文介绍如何在Springboot中使用百度AI的文字识别OCR 其他相关的使用百度AI的文章列表如下: 如何在Spri…

【SpringBoot】-SpringBoot配置文件

作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【Framework】 主要内容:.properties 配置文件和 .yml 配置文件中 配置信息的设置和获取。关于IDEA乱码的解决。.yml 配置文件的 方式语法分析和演示。 .yml配置文件 …

芯片验证就是一次旅行

如果你国庆希望去一个你不曾去过的城市旅行,比如“中国苏州”。对游客来说,它是个蛮大的城市,有许多景点可以游玩,还有许多事情可以做。但实际上,即使最豪也最清闲的游客也很难看苏州的所有方方面面。同样的道理也适用…

第 4 章 串(文本行编辑实现)

1. 背景说明 该文本编辑器利用串的堆实现,其中对串的原始存储方式基本不作修改(有部分修改之处),优化之处在于在串的末尾加上了一个空字符,目的是区分字符串结尾,便于将串保存在文件中,且该优化…

JavaScript入门——(2)基础语法(上)

一、JavaScript介绍 1.1 JavaScript是什么 1.1.1 JavaScript是什么? JavaScript是一种运行在客户端(浏览器)的编程语言,实现人机交互效果。 注意:HTML和CSS是标记语言。 1.1.2 作用(做什么&#xff1f…

8月最新修正版风车IM即时聊天通讯源码+搭建教程

8月最新修正版风车IM即时聊天通讯源码搭建教程。风车 IM没啥好说的很多人在找,IM的天花板了,知道的在找的都知道它的价值,开版好像就要29999,后端加密已解,可自己再加密,可反编译出后端项目源码,已增加启动后端需要google auth双重验证,pc端 web端 wap端 android端 ios端 都有 …

小米机型解锁bl 跳“168小时”限制 操作步骤分析

写到前面的安全提示 了解解锁bl后的风险: 解锁设备后将允许修改系统重要组件,并有可能在一定程度上导致设备受损;解锁后设备安全性将失去保证,易受恶意软件攻击,从而导致个人隐私数据泄露;解锁后部分对系…

老胡的周刊(第109期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 lobe-chat[2] LobeChat 是一个开源的、可扩展…

面试题:说说Java并发运行中的一些安全问题

文章目录 1.什么是多线程并发运行安全问题?2.用synchronized修饰的方法3.同步块4.使用Synchronized修饰静态方法5.互斥锁6.死锁现象7.wait()和sleep()的区别 1.什么是多线程并发运行安全问题? 当多个线程并发操作一个数据时,由于线程操作的时…

在Linux上安装Percona Toolkit工具

安装步骤 1. 下载安装包 下载地址:https://www.percona.com/software/database-tools/percona-toolkit 2.上传并解压 上传tar包到服务器,并通过tar -zxvf 文件名.tar.gz解压。工具在bin文件夹中,这个是免安装的。 3. 配置环境变量 配置…

安装OpenSearch

title: “安装opensearch” createTime: 2021-11-30T19:13:4508:00 updateTime: 2021-11-30T19:13:4508:00 draft: false author: “name” tags: [“es”,“安装”] categories: [“OpenSearch”] description: “测试的” 说明 基于Elasticsearch7.10.2 的 opensearch-1.1.…

gRPC之实现TLS通信加密_已设置图床

gRPC之实现TLS通信加密 "crypto/tls"包 “crypto/tls” 是 Go 编程语言中的一个包,用于实现 TLS(传输层安全)协议。TLS 协议用于加密和保护网络通信,通常用于保护敏感数据的传输,如密码、支付信息等。在 G…

详解--计算机存储相关(寄存器、CPU Cache、内存、外存)

CPU寄存器、高速缓冲存储器、主存储器、外存储器 1. 主存储器 参考链接–主存 参考链接–内存 主存储器简称 主存,又称 内存储器(简称 内存)。作用 暂时存放CPU中的运算数据。存放指令和数据,并能由中央处理器(CPU&a…

什么是Service Worker?它在PWA中的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Service Worker的作用是什么?⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前…

1066 二级C语言-自定义函数

输入一个正数x和一个正整数n,求下列算式的值。要求定义两个调用函数: (1)fact(n)计算n的阶乘; (2)mypow(x,n)计算x的n次幂(即xn),两个函数的返回值类型是do…

HEC-HMS和HEC-RAS水文模型、防洪评价报告编制及洪水建模、洪水危险性评价等相关案例解析

► HEC-RAS一维、二维建模方法及应用 【目标】: 1.掌握一维数学模型基本地形导入方法 2.掌握恒定流、非恒定流一维数学模型水流计算方法 3.掌握一维数学模型计算结果分析,水面线成果分析及调试;流速分布图输出方法 4.掌握一维数学模型增设构…

如何让一个uniform variable在多级shader中都起作用(类似C语言的全局变量)?

GLSL编程中通常设计多个shader,如vertex shader, fragment shader等等。在最近的某个项目中,我需要定义一个变量,该变量类似C语言中的全局变量,要同时在两个shader中都起作用。c - OpenGL Uniform Across Multiple Shaders - Stac…

2023-9-23 区间选点

题目链接&#xff1a;区间选点 #include <iostream> #include <algorithm>using namespace std;const int N 100010;int n;struct Range {int l, r;bool operator< (const Range &W) const{return r < W.r;} }range[N];int main() {scanf("%d"…

MyBatisPlus + ShardingJDBC 批量插入不返回主键ID

本文讲述一个由 ShardingJDBC 使用不当引起的悲惨故事。 一. 问题重现 有一天运营反馈我们部分订单状态和第三方订单状态无法同步。 根据现象找到了不能同步订单状态是因为 order 表的 thirdOrderId 为空导致的&#xff0c;但是这个字段为啥为空&#xff0c;排查过程比较波折…