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: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.mzph.cn/news/851857.shtml

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

相关文章

详解 Flink 的常见部署方式

一、常见部署模式分类 1. 按是否依赖外部资源调度 1.1 Standalone 模式 独立模式 (Standalone) 是独立运行的,不依赖任何外部的资源管理平台,只需要运行所有 Flink 组件服务 1.2 Yarn 模式 Yarn 模式是指客户端把 Flink 应用提交给 Yarn 的 ResourceMa…

Ansys Mechanical|使用Trace Mapping建立PCB板的有限元模型

Trace Mapping需要使用ECAD的方法 传统方法 vs ECAD方法 传统方法既繁琐又费时。以下是一些数据: 导出电路板布局的step文件大约需要30分钟。 导入Ansys SpaceClaim中大约需要10分钟。 进行布尔运算和共享拓扑操作大约需要24小时甚至更久。 而ECAD方法更加快速且…

剧本新纪元:探索短剧系统的魔力

在现代社会,随着科技的迅猛进步和生活节奏的不断加快,传统的长篇电视剧和电影已不能完全满足所有人的需求。短剧,由于其简短、快速、直接的特性,正在逐步成为一种文化新趋势。短剧系统正是这一趋势的典型代表,它以独特…

自己用pip下载好模块啦,但是在pycharm里面不显示?

问题: 今天在cmd里面用pip命令安装第三方模块,最后用pip list 命令发现已经成功安装,但是在pycharm里面用该模块的时候,还是爆红,显示没有该库 。 解决方法: 第一种(项目刚创建)&am…

项目问题24/5/29需求:用一路IO口捕获外界方波PWM频率,将捕获值实时传入,使得正弦波频率和外界方波频率一致

问题 STM32F103控制下,定时器3的捕获PWM模式下的中断里的全局变量psc 20,中断触发后,主函数while循环里TIM1_PWM_Init(1451,psc)函数初始化正弦波,用了中断传过来的全局变量psc后,为什么PWM频率不是PWM 72000000.0 / ((145 * (psc11))24.8…

常用的bit位操作

#ifndef BIT_IS_1 #define BIT_IS_1(value,bitpos) (((value)&(1<<(bitpos)))>>(bitpos)) //判断某1位是1还是0 #endif #ifndef GET_BIT #define GET_BIT(value,bitpos) ((value)&(1<<(bitpos))) //读取指定位置bit位的值 #endif #ifndef REV_BIT…

如何学习软件测试,并成功找到工作

在IT行业日益繁荣的今天&#xff0c;软件测试作为确保软件质量的关键环节&#xff0c;越来越受到企业的重视。对于初入职场的小白来说&#xff0c;掌握软件测试技能不仅能够帮助他们快速适应工作&#xff0c;还能为未来的职业发展奠定坚实的基础。本文将为职场小白推荐学习软件…

PHP数组排序方法及应用场景分析

在PHP编程中&#xff0c;数组是一种非常常见的数据结构&#xff0c;而对数组进行排序是经常需要处理的任务之一。PHP提供了多种方法来对数组进行排序&#xff0c;包括按值排序、按键排序、自定义排序等。本文将从多个角度对PHP数组排序方法进行详细介绍&#xff0c;并探讨不同排…

NVIDIA DeepStream SDK 说明及链接

NVIDIA DeepStream SDK DeepStream 的多平台支持为您提供了一种更快、更简单的方式来开发视觉AI应用程序和服务。您甚至可以在本地、边缘和云中部署它们&#xff0c;只需单击一个按钮。 开始 在Launchpad上试用 什么是 NVIDIA DeepStream&#xff1f; NVIDIA 的 DeepStream …

公交车载视频监控系统解决方案

公交车载视频监控系统基于iVMS-7200移动视频监控管理平台&#xff0c;通过3G/4G网络接入车载前端&#xff0c;实现实时监控、录像回放、GIS地图定位、轨迹回放、设备状态查询、紧急报警等功能。 车载前端包含车载硬盘录像机(简称车载DVR或MDVR)、车载专用摄像机、车载LCD显示屏…

50.Python-web框架-Django中引入静态的bootstrap样式

目录 Bootstrap 官网 特性 下载 在线样例 Bootstrap 入门 Bootstrap v5 中文文档 v5.3 | Bootstrap 中文网 在django中使用bootstrap 新建static\bootstrap5目录&#xff0c;解压后的Bootstrap文件&#xff0c;拷贝项目里就好。 在template文件里引用css文…

SQL-窗口函数合集

目录 1.窗口函数简介2.窗口的定义3.相关题目示例3.1 PERCENT_RANK()2346 以百分比计算排名 3.2 FIRST_VALUE()/LAST_VALUE()/NTH_VALUE()2388 将表中的空值更改为前一个值 1.窗口函数简介 MySQL 开窗函数&#xff08;Window Functions&#xff09;是 MySQL 8.0 版本引入的一个…

k8s metrics-server服务监控pod 的 cpu、内存

项目场景&#xff1a; 需要开启指标服务&#xff0c;依据pod 的 cpu、内存使用率进行自动的扩容或缩容 pod 的数量 解决方案&#xff1a; 下载 metrics-server 组件配置文件&#xff1a; wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/…

植物大战僵尸杂交版 MacBook 苹果电脑下载安装详细教程

最近老是看到别人玩植物大战僵尸杂交版&#xff0c;可是找了一圈发现都是PC版本的&#xff0c;原来游戏作者只做了一个PC版本&#xff0c;还好最终没有放弃终于在 Mac 上安装上了植物大战僵尸杂交版 版本是 2.0.88 真的蛮好玩的就是关卡有亿点点难&#xff0c;我最爱玩无尽模式…

一站式解决ComfyUI安装、调试和界面操作,附安装包 C001

点击打开以上网页&#xff0c;页面往下拉&#xff0c;找到“Direct link to download”&#xff0c;点击即可下载官方安装包。 下载完成后&#xff0c;将安装包移动到你想要安装的地方&#xff0c;解压&#xff08;推荐使用7-Zip&#xff09;&#xff0c;然后点击“run_nvidia_…

C++中的观察者模式

目录 观察者模式&#xff08;Observer Pattern&#xff09; 实际应用 股票价格监控系统 发布-订阅系统 总结 观察者模式&#xff08;Observer Pattern&#xff09; 观察者模式是一种行为型设计模式&#xff0c;它定义了对象间的一对多依赖关系。当一个对象的状态发生改变…

无需插件脚本,IDEA配置多服务一键启动

分享本教程的初衷是本人在本地调试时业务场景中需要调用多个服务&#xff0c;并且每次为了找到需要启动的服务花了很多不必要的时间&#xff0c;我相信很多同为开发的小伙伴也有和我一样的困扰。但是学会这招后多个服务需要同时启动时仅需一键即可搞定。接下来让我们一步步设置…

C++方法封装成dll及C#调用示例

1,编译生成dll时可能出现错误&#xff0c;解决办法&#xff1a;pch.h文件头部&#xff0c;添加声明 #define _CRT_SECURE_NO_WARNINGS 2, c头文件声明 extern "C" __declspec(dllexport) char* getvalue(const char * param1, const char * param2); 3, c方法实现…

【PasteSpider】的集群组件【PasteCluster】(让你的项目快速支持集群模式)的思路及实现(含源码)

PasteSpider是什么? 一款使用.net编写的开源的Linux容器部署助手&#xff0c;支持一键发布&#xff0c;平滑升级&#xff0c;自动伸缩&#xff0c;Key-Value配置&#xff0c;项目网关&#xff0c;环境隔离&#xff0c;运行报表&#xff0c;差量升级&#xff0c;私有仓库&…

vue在hash路由模式下实现点击定位滑动

背景&#xff1a;一般是使用锚点来实现dom的定位&#xff0c;但在hash模式下&#xff0c;这种方式不行&#xff0c;会刷新路由&#xff0c;没法实现dom定位的效果。 其实scrollIntoView就可以解决这个问题&#xff0c;scrollIntoView可以将调用它的元素滚动到浏览器窗口的可见…