DDD领域应用理论实践分析回顾

目录

一、DDD的重要性

(一)拥抱互联网黑话(抓痛点、谈愿景、搞方法论)

(二)DDD真的重要吗?

二、领域驱动设计DDD在B端营销系统的实践

(一)设计落地步骤

(二)战略设计实践

开始事件风暴用例分析,根据业务玩法反复确定对应用例(必要时采用二八原则)

分析名词动词找出关键和初始边界界限,抽取概念统一语言

梳理关系确定领域范围

确定营销领域后开始划分和分析

验证概念模型

(三)战术设计实践

从概念模型到对象模型确定实体和值对象

实体和值对象分析确定营销系统的聚合根

正确认识服务协作并整体落地

(四)代码架构实践

三、大众点评交易系统DDD应用

参考文章


干货分享,感谢您的阅读!本次不做基本概念的讲解,基本概念和理解可见一下推荐博客:

主要内容链接阅读

领域驱动实践基本理论总结与分析

领域驱动实践总结(基本理论总结与分析V+架构分析与代码设计+具体应用设计分析)_领域驱动设计案例分析报告-CSDN博客

领域驱动实践架构分析与代码设计

领域驱动实践总结(基本理论总结与分析+架构分析与代码设计V+具体应用设计分析)_l领域驱动实践总结-CSDN博客

领域驱动实践具体应用设计分析

领域驱动实践总结(基本理论总结与分析+架构分析与代码设计+具体应用设计分析V)_领域驱动编程 实践-CSDN博客

一、DDD的重要性

(一)拥抱互联网黑话(抓痛点、谈愿景、搞方法论)

互联网黑话通常带有一种神秘和高深莫测的感觉,能够吸引人们的注意力,让人们觉得自己参与的是一个非常前沿和高大上的事情。比如说,简单的“数据分析”听起来平平无奇,但一旦换成“大数据赋能”,是不是立刻高大上?

《拥抱毒瘤 DDD》黑话神化举例

有一家公司,由于研发的人数有限,但是活儿很多,分散在多个系统之间。研发部门研究出来的结论是:要聚焦,集中力量到核心系统上。怎么办?不能在PPT上干巴巴的写上聚焦两个字吧,那显得多LOW。

思来想去,突然灵机一动。要不,我们造点名词吧。按照级别,分它个CVP系统、IVP系统、EVP系统。这样,一下子逼格就上升了不少。

看不懂这些名词?看不懂就对了,因为这是我造的,要的就是看不懂这种效果。

看看下面这张图,我们甚至可以赋予它属性,把系统归类到这三类之中。

重要的是,业务系统的聚焦,摇身一变,成为了CVP的重点建设。哈哈,比起一句话就完事的决策,我们这下可以聊很久了。

“教你怎么说话十分钟,等于什么都没说”。这是一种非常重要的能力。

DDD互联网黑话推广

回归到DDD,其实其确实有点像互联网黑话(抓痛点、谈愿景、搞方法论)推广思路:

第一步,抓痛点想象一下,你的客户是一个开发团队的负责人,总是因为复杂的业务逻辑和代码混乱而头疼。而你呢,正好推荐DDD。抓住他们的痛点,让他们觉得生活离不开DDD。话术安排:“你是不是经常因为业务逻辑复杂,代码难以维护而烦恼?DDD正是为了解决这些问题而设计的。它能够帮助你理清业务逻辑,让代码更清晰、更易于维护。”

第二步,谈愿景不仅仅是告诉他们DDD能解决眼前的问题,还要画个大饼:“有了DDD,你的整个开发流程将变得井井有条,团队协作更高效,未来所有的项目都能顺利上线!”让他们看见美好的明天。话术安排:“采用DDD之后,未来你们的开发流程将会更加流畅。业务逻辑将被清晰地映射到代码中,每个团队成员都能明确自己的职责。无论多复杂的项目,都能轻松驾驭,快速上线。”

第三步,搞方法论提供一套神乎其神的方法论,比如“只需三步,让你的项目焕然一新!”让他们觉得你不是在卖概念,而是在传授武功秘籍。话术:“通过三步走策略,快速掌握DDD:1.领域建模:识别核心业务领域,定义领域模型。2.代码实现:将领域模型映射到代码结构,保证业务逻辑清晰。3.持续优化:通过领域事件和聚合根,不断优化和重构,提升代码质量。”

(二)DDD真的重要吗?

DDD(领域驱动设计)其实就是把软件开发中的业务问题用清晰的语言和模型直接反映在代码里,确保开发团队和业务专家说的都是一回事儿。

假设你在开发一个电商平台。没有DDD时,订单处理、库存管理、用户管理等逻辑可能混在一起,代码乱成一团。用DDD后,你把这些业务逻辑分别建模,比如:

  • 订单领域:专门处理订单创建、支付、取消等。
  • 库存领域:负责库存增加、减少、查询等。

每个领域都有明确的职责和边界。比如,订单领域中的“支付”只需调用库存领域的“减少库存”,不需要知道具体的库存操作细节。可以看到其直观好处:

  1. 沟通更顺畅:开发人员和业务人员都明白“订单”该怎么处理,沟通起来没障碍。
  2. 维护更容易:各个领域代码独立,修改库存逻辑不会影响订单逻辑。
  3. 扩展更灵活:想加新功能,比如优惠券,只需新增一个领域,其他逻辑不受影响。

简单说,DDD就像是给你的代码搭建了一个有条理的“仓库”,每个“货架”放什么清清楚楚,找起来方便,改起来不乱。

所以,个人依在这场黑话和营销中选择站队DDD,当前前提是应对复杂的业务,其重要性我觉得其主要有三点:

  1. 抓住业务本质:DDD让开发人员和业务专家用同一种语言交流,确保大家对业务逻辑的理解一致。
  2. 提升开发效率:通过明确的领域模型,减少了沟通误差,代码更容易维护和扩展。
  3. 快速应对变化:业务需求变化时,只需调整模型,代码也能灵活变动。

自身工作中的案例相对而言是不能对外的,但这边以一些业内公开的案例来重新体会下DDD的魅力。

二、领域驱动设计DDD在B端营销系统的实践

(一)设计落地步骤

  • 战略设计:确定用例,统一语言和划分边界。(事件风暴+统一语言+限界上下文和映射)
  • 战术设计:概念模型转化成类(代码)模型。(实体+值对象+聚合+领域服务+事件等)
  • 代码架构:将系统设计映射为系统实现。(六边形架构(Hexagonal Architecture)/ 洋葱架构/分层架构+事件驱动机制)

(二)战略设计实践

开始事件风暴用例分析,根据业务玩法反复确定对应用例(必要时采用二八原则)

分析名词动词找出关键和初始边界界限,抽取概念统一语言

梳理关系确定领域范围

确定营销领域后开始划分和分析

营销系统基于问题域拆解为五个子域(活动域,权益域,人群域,推送域,数据域),每个子域解决特定的问题,各子领域相对内聚和简单

将外部概念映射到营销域,通过防腐层来对接外部服务来实现这种映射

验证概念模型

通常用两个方法:

  1. 场景走查:把模型代入到所有的场景确认一遍,确定所抽象出来的概念模型和统一语言能正确描述它。
  2. 业务预判:未来业务的变化会在哪里,当变化发生时,概念模型的内涵和外延是否方便扩展并支持到变化。

(三)战术设计实践

战略设计得到了概念模型,战术设计则是将概念模型映射为代码模型,有很多编程范式,比如事务脚本、表模式、面向对象,函数式等,最好的方式是面向对象的实现。这里不做展开分析。

从概念模型到对象模型确定实体和值对象

  • 首先,概念是分层的,如营销活动是一个泛化概念,其下还有充值送活动、消费返活动,买赠活动等具体活动。构建对象模型时,通过派生/继承来实现概念分层。
  • 其次,概念关系映射成对象关系,比如营销活动包含了档位和库存,那在构建营销活动对象时,可通过组合实现这种包含关系(档位对象和库存对象成为营销活动对象的属性)。
  • 最后,概念的属性行为,可以直接变成对象的属性和行为;概念的状态机以及生命周期也会变成对象的状态机。

实体和值对象分析确定营销系统的聚合根

聚合根的设计要遵循一定的原则:

  1. 满足业务一致性、数据完整性、状态一致性。比如库存档位和活动状态要一致,在数据上也要完整,不存在没有档位的活动,也不存在没有库存的活动。
  2. 技术限制。有些实体会带来技术挑战,如数据量太大,可抽出来单独考虑。
  3. 业务逻辑不灭,在业务封装与适度的职责边界之间寻找平衡。不管是大聚合根还是小聚合根,业务逻辑永远都是存在的,就是看把它放在哪里。

正确认识服务协作并整体落地

(四)代码架构实践

依据领域驱动实践架构分析与代码设计,进行分层架构落地如下:

三、大众点评交易系统DDD应用

以上可以回忆我们整体的流程,虽有变动但方法论不会太有很大变化,这里不做细分了。

参考文章

领域驱动实践总结(基本理论总结与分析+架构分析与代码设计V+具体应用设计分析)_l领域驱动实践总结-CSDN博客

领域驱动实践总结(基本理论总结与分析+架构分析与代码设计+具体应用设计分析V)_领域驱动编程 实践-CSDN博客

领域驱动实践总结(基本理论总结与分析V+架构分析与代码设计+具体应用设计分析)_领域驱动设计案例分析报告-CSDN博客

拥抱毒瘤 DDD!

DDD 对决:事务脚本 vs 领域模型,哪个才是业务优化的终极方案?

老板:给我按 DDD 设计这个新项目~

领域驱动设计DDD在B端营销系统的实践 - 美团技术团队

DDD在大众点评交易系统演进中的应用 - 美团技术团队

领域驱动设计在互联网业务开发中的实践 - 美团技术团队

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【聚类】K-Means 聚类(无监督)及K-Means ++

1. 原理 2. 算法步骤 3. 目标函数 4. 优缺点 import torch import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.decomposition import PCA import torch.nn as nn# 数据准备 # 生成数据:100 个张量&#xff0c…

C++学习日记---第14天(蓝桥杯备赛)

笔记复习 1.对象的初始化和清理 对象的初始化和清理是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用后果是未知,同样的使用完一个对象或者变量,没有及时清理,也会造成一定的安全问题 构造函数&…

网络安全防护指南:筑牢网络安全防线(5/10)

一、网络安全的基本概念 (一)网络的定义 网络是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息收集、存储、传输、交换、处理的系统。在当今数字化时代,网络已经成为人们生活和工作中不可或缺的一部分。它连接了世…

【最新鸿蒙开发——应用导航设计】

大家好,我是小z,不知道大家在开发过程中有没有遇到模块间跳转的问题,今天给大家分享关于模块间跳转的三种方法 文章目录 1. 命名路由(ohos.router)使用步骤 2. 使用navigation组件跳转。步骤缺点 3. 路由管理模块1. 路由管理模块…

Wireshark常用功能使用说明

此处用于记录下本人所使用 wireshark 所可能用到的小技巧。Wireshark是一款强大的数据包分析工具,此处仅介绍常用功能。 Wireshark常用功能使用说明 1.相关介绍1.1.工具栏功能介绍1.1.1.时间戳/分组列表概况等设置 1.2.Windows抓包 2.wireshark过滤器规则2.1.wiresh…

【进阶篇-Day15:JAVA线程-Thread的介绍】

目录 1、进程和线程1.1 进程的介绍1.2 并行和并发1.3 线程的介绍 2、JAVA开启线程的三种方法2.1 继承Thread类:2.2 实现Runnable接口2.3 实现Callable接口2.4 总结: 3、线程相关方法3.1 获取和设置线程名字的方法3.2 线程休眠方法:3.3 线程优…

组播基础实验

当需要同时发给多个接受者或者接收者ip未知时使用组播 一、组播IP地址 1、组播IP地址范围 组播地址属于D类地址:224.0.0.0/4(224.0.0.0-239.255.255.255) 2、分类 (1)链路本地地址(link-local&#xf…

EasyDarwin搭建直播推流服务

学习链接 easydarwin官网 - 这里看介绍 easydarwin软件下载地址 - 百度网盘 easydarwin视频 B站 文章目录 学习链接使用下载EasyDarwin压缩包,并解压到目录启动EasyDarwin点播直播easyplayer.jsapidocffmpeg推流rtsp & ffplay拉流 使用 下载EasyDarwin压缩包…

Java有关数组的相关问题

Java中的栈和堆的含义 栈 存储局部变量:栈主要用于存储方法中的局部变量,包括基本数据类型(int、double、boolean等)和对象的引用(不包含对象本身)。 遵循后进先出原则:当一个方法被调用时&…

眼部按摩仪WT2605音频蓝牙语音芯片方案 单芯片实现语音提示及控制/手机无线音频传输功能

随着科技的快速发展,人们的生活方式也在不断改变,智能化、便捷化的产品逐渐成为市场的主流。眼部按摩仪作为一种结合了现代科技与健康生活理念的产品,受到了广大消费者的青睐。而在众多眼部按摩仪中,采用WT2605音频蓝牙芯片的方案…

ESP32-S3模组上跑通ES8388(12)

接前一篇文章:ESP32-S3模组上跑通ES8388(11) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析了es8388_init函数中的第5段代码,本回继续往下解析。为了便于理解和回顾,再次贴出es8388_init函数源码,在…

C#VB.NET开发整体一键国际化显示

第一章链接 第二章 窗口多国语言显示 在第一章时我们已经了解如何对内容进行多语言化下面讲解如何对窗口多语言显示 在实际开发中单个窗体内可能有很多控件,如果我们对每个控件使用Mu方法进行赋值是异常繁琐的如下 Button1.Text"显示".Mu(); 在对窗口进行多语言化SG…

Linux---对时/定时服务

文章目录 目录 文章目录 前言 一.对时服务 服务端配置 客户端配置 二.定时服务 单次定时任务 循环定时任务 前言 在当今信息化高速发展的时代,时间的准确性和任务的定时执行对于各种系统和服务来说至关重要。Linux操作系统,凭借其强大的功能和灵活的…

centos更换源文件,换源,替换源

期初怎么折腾就是不行,换了源也是不能使用的,最后发现不是换的源不行,而是之前的源文件不行,然后给所有的源文件在yum源统一放在了bak目录下,随后我们再去下载安装源文件。 您将yum源下载之后,先将您的其他…

分布式系统中的Dapper与Twitter Zipkin:链路追踪技术的实现与应用

目录 一、什么是链路追踪? 二、核心思想Dapper (一)Dapper链路追踪基本概念概要 (二)Trace、Span、Annotations Trace Span Annotation 案例说明 (三)带内数据与带外数据 带外数据 带…

【深度学习基础】一篇入门模型评估指标(分类篇)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 模…

零拷贝相关知识点(一)

前言 大家好,我是程序员田螺。 零拷贝是老生常谈的问题啦,大厂非常喜欢问。比如Kafka为什么快,RocketMQ为什么快等,都涉及到零拷贝知识点。最近技术讨论群几个伙伴分享了阿里、虾皮的面试真题,也都涉及到零拷贝。因此…

React+TS+css in js 练习

今天分享的内容是动态规划的经典问题--0-1 背包问题 0-1背包问题的描述如下:给定一组物品,每种物品都有自己的重量和价值,背包的总容量是固定的。我们需要从这些物品中挑选一部分,使得背包内物品的总价值最大,同时不超过背包的总容量。 举个例子:假设这组物品的质量…

【人工智能基础03】机器学习(练习题)

文章目录 课本习题监督学习的例子过拟合和欠拟合常见损失函数,判断一个损失函数的好坏无监督分类:kmeans无监督分类,Kmeans 三分类问题变换距离函数选择不同的起始点 重点回顾1. 监督学习、半监督学习和无监督学习的定义2. 判断学习场景3. 监…

【数据结构计数排序】计数排序

非比较排序概念 非比较排序是一种排序算法,它不是通过比较元素大小进行排序的,而是基于元素的特征和属性排序。这种排序方法在特定情况下,可以做到比元素比较排序(快排,归并)更有效率。尤其是在处理大量数…