目录
一、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后,你把这些业务逻辑分别建模,比如:
- 订单领域:专门处理订单创建、支付、取消等。
- 库存领域:负责库存增加、减少、查询等。
每个领域都有明确的职责和边界。比如,订单领域中的“支付”只需调用库存领域的“减少库存”,不需要知道具体的库存操作细节。可以看到其直观好处:
- 沟通更顺畅:开发人员和业务人员都明白“订单”该怎么处理,沟通起来没障碍。
- 维护更容易:各个领域代码独立,修改库存逻辑不会影响订单逻辑。
- 扩展更灵活:想加新功能,比如优惠券,只需新增一个领域,其他逻辑不受影响。
简单说,DDD就像是给你的代码搭建了一个有条理的“仓库”,每个“货架”放什么清清楚楚,找起来方便,改起来不乱。
所以,个人依在这场黑话和营销中选择站队DDD,当前前提是应对复杂的业务,其重要性我觉得其主要有三点:
- 抓住业务本质:DDD让开发人员和业务专家用同一种语言交流,确保大家对业务逻辑的理解一致。
- 提升开发效率:通过明确的领域模型,减少了沟通误差,代码更容易维护和扩展。
- 快速应对变化:业务需求变化时,只需调整模型,代码也能灵活变动。
自身工作中的案例相对而言是不能对外的,但这边以一些业内公开的案例来重新体会下DDD的魅力。
二、领域驱动设计DDD在B端营销系统的实践
(一)设计落地步骤
- 战略设计:确定用例,统一语言和划分边界。(事件风暴+统一语言+限界上下文和映射)
- 战术设计:概念模型转化成类(代码)模型。(实体+值对象+聚合+领域服务+事件等)
- 代码架构:将系统设计映射为系统实现。(六边形架构(Hexagonal Architecture)/ 洋葱架构/分层架构+事件驱动机制)
(二)战略设计实践
开始事件风暴用例分析,根据业务玩法反复确定对应用例(必要时采用二八原则)
分析名词动词找出关键和初始边界界限,抽取概念统一语言
梳理关系确定领域范围
确定营销领域后开始划分和分析
营销系统基于问题域拆解为五个子域(活动域,权益域,人群域,推送域,数据域),每个子域解决特定的问题,各子领域相对内聚和简单
将外部概念映射到营销域,通过防腐层来对接外部服务来实现这种映射
验证概念模型
通常用两个方法:
- 场景走查:把模型代入到所有的场景确认一遍,确定所抽象出来的概念模型和统一语言能正确描述它。
- 业务预判:未来业务的变化会在哪里,当变化发生时,概念模型的内涵和外延是否方便扩展并支持到变化。
(三)战术设计实践
战略设计得到了概念模型,战术设计则是将概念模型映射为代码模型,有很多编程范式,比如事务脚本、表模式、面向对象,函数式等,最好的方式是面向对象的实现。这里不做展开分析。
从概念模型到对象模型确定实体和值对象
- 首先,概念是分层的,如营销活动是一个泛化概念,其下还有充值送活动、消费返活动,买赠活动等具体活动。构建对象模型时,通过派生/继承来实现概念分层。
- 其次,概念关系映射成对象关系,比如营销活动包含了档位和库存,那在构建营销活动对象时,可通过组合实现这种包含关系(档位对象和库存对象成为营销活动对象的属性)。
- 最后,概念的属性行为,可以直接变成对象的属性和行为;概念的状态机以及生命周期也会变成对象的状态机。
实体和值对象分析确定营销系统的聚合根
聚合根的设计要遵循一定的原则:
- 满足业务一致性、数据完整性、状态一致性。比如库存档位和活动状态要一致,在数据上也要完整,不存在没有档位的活动,也不存在没有库存的活动。
- 技术限制。有些实体会带来技术挑战,如数据量太大,可抽出来单独考虑。
- 业务逻辑不灭,在业务封装与适度的职责边界之间寻找平衡。不管是大聚合根还是小聚合根,业务逻辑永远都是存在的,就是看把它放在哪里。
正确认识服务协作并整体落地
(四)代码架构实践
依据领域驱动实践架构分析与代码设计,进行分层架构落地如下:
三、大众点评交易系统DDD应用
以上可以回忆我们整体的流程,虽有变动但方法论不会太有很大变化,这里不做细分了。
参考文章
领域驱动实践总结(基本理论总结与分析+架构分析与代码设计V+具体应用设计分析)_l领域驱动实践总结-CSDN博客
领域驱动实践总结(基本理论总结与分析+架构分析与代码设计+具体应用设计分析V)_领域驱动编程 实践-CSDN博客
领域驱动实践总结(基本理论总结与分析V+架构分析与代码设计+具体应用设计分析)_领域驱动设计案例分析报告-CSDN博客
拥抱毒瘤 DDD!
DDD 对决:事务脚本 vs 领域模型,哪个才是业务优化的终极方案?
老板:给我按 DDD 设计这个新项目~
领域驱动设计DDD在B端营销系统的实践 - 美团技术团队
DDD在大众点评交易系统演进中的应用 - 美团技术团队
领域驱动设计在互联网业务开发中的实践 - 美团技术团队