十张图讲清楚ddd建模六个问题与六个步骤

作者&投稿:路战 (若有异议请与网页底部的电邮联系)
~

十张图讲清楚ddd建模六个问题与六个步骤如下:

1 六个问题

1.1 为什么使用

DDD方法论的核心是将问题不断分解,把大问题分解为小问题,大业务分解小领域,简而言之就是分而治之,各个击破。

分而治之是指直接面对大业务我们无从下手,需要按照一定方法进行分解,分解为高内聚的小领域,使得业务有边界清晰,而这些小领域是我们有能力处理的,这就是领域驱动设计的核心。

各个击破是指当问题被拆分为小领域后,因为小领域业务内聚,其子领域高度相关,我们在技术维度可以对其进行详细设计,在管理维度可以按照领域对项目进行分工。需要指出DDD不能替代详细设计,DDD是为了更清晰地详细设计。

在微服务流行的互联网行业,当业务逐渐复杂时,技术人员需要解决如何划分微服务边界的问题,DDD这种清晰化业务边界的特性正好可以用来解决这个问题。

1.2 方法与目标

我们的目标是将业务划分清晰的边界,而DDD是达成目标的有效方法之一,这一点是需要格外注意的。DDD是方法不是目标,不需要为了使用而使用。

例如业务模型比较简单可以很容易分析的业务就不需要使用DDD,还有一些目标是快速验证类型的项目,追求短平快,前期可能也不需要使用领域驱动设计。

1.3 整体与局部

领域可以划分多个子领域,子域可以再划分多个子子域,限界上下文本质上也是一种子子域,那么在业务分解时一个业务模块到底是领域、子域还是子子域?

我认为不用纠结在这个问题,因为这取决于看待这个模块的角度。你认为整体可能是别人的局部,你认为的局部可能是别人的整体,叫什么名字不重要,最重要的是按照高内聚的原则将业务高度相关的模块收敛在一起。

1.4 粒度粗与细

业务划分粒度的粗细并没有统一的标准,还是要根据业务需要、开发资源、技术实力等因素综合考量。例如微服务拆分过细反而会增加开发、部署和维护的复杂度。

但是拆分过粗可能会导致大量业务高度耦合,开发部署起来是挺快的,但是缺失可维护性和可扩展性,这需要根据实际情况做出权衡。

1.5 领域与数据

领域对象与数据对象一个重要的区别是值对象存储方式。在讨论领域对象和数据对象之前,我们首先讨论实体和值对象这一组概念。实体是具有唯一标识的对象,而唯一标识会伴随实体对象整个生命周期并且不可变更。值对象本质上是属性的集合,并没有唯一标识。

领域对象在包含值对象的同时也保留了值对象的业务含义,而数据对象可以使用更加松散的结构保存值对象,简化数据库设计。

现在假设我们需要管理足球运动员信息,对应的领域模型和数据模型应该如何设计?姓名、身高、体重是一名运动员本质属性,加上唯一编号可以对应实体对象。跑动距离,传球成功率,进球数是运动员比赛中的表现,这些属性的集合可以对应值对象。

值对象在数据对象中可以用松散的数据结构进行存储,而值对象在领域对象中需要保留其业务含义。

1.6 抽象与灵活

抽象的核心是找相同,对不同事物提取公因式。实现的核心是找不同,扩展各自的属性和特点。例如模板方法设计模式正是用抽象构建框架,用实现扩展细节。

我们再回到数据模型的讨论,可以发现脚本化是一种拓展灵活性的方式,脚本化不仅指使用groovy、QLExpress脚本增强系统灵活性,还包括松散可扩展的数据结构。

数据模型抽象出了姓名、身高、体重这些基本属性,对于频繁变化的比赛表现属性,这些属性值可能经常变化,甚至属性本身也是经常变化,例如可能会加上射门次数,突破次数等,所以采用松散的JSON数据结构进行存储。

2 六个步骤

工程理论总是要落地的,落地也是需要一些步骤和方法的。本文我们一起分析一个足球运动员信息管理系统,目标是管理运动员从转会到上场比赛整条链路信息,这个系统大家应该也都没有接触过,我们一起来分析。

需要说明本实例着重演示DDD方法论如何落地,业务细节可能并不能面面俱到。

2.1 流程梳理

梳理流程有两个问题需要考虑,第一个问题是从什么视角去梳理?因为不同的人看到的流程是不一样的。答案是取决于系统需要解决的是什么问题,因为我们要管理运动员从转会到上场比赛整条链路信息,所以从运动员视角出发是一个合适的选择。

第二个问题是对业务不熟悉怎么办?因为我们不是体育和运动专家,并不清楚整条链路的业务细节。

答案是梳理流程时一定要有业务专家在场,因为没有真实业务细节,无法领域驱动设计。同理在互联网梳理复杂业务流程时,一定要有对相关业务熟悉的产品经理或者运营一起参与。

假设足球业务专家梳理出了业务流程,运动员提出转会,协商一致后到新俱乐部体检,体检通过就进行签约。进入新俱乐部后进行训练,训练指标达标后上场比赛,赛后参加新闻发布会。

2.2 四色建模

(1) 时标对象

四色建模第一种颜色是红色,表示时标对象。时标对象是四色建模最重要的对象,可以理解为核心业务单据。在业务进行过程中一定要对关键业务留下单据,通过这些单据可以追溯出整个业务流程。

时标对象具有两个特点:第一是事实不可变性,记录了过去某个时间点或时间段内发生的事实。第二是责任可追溯性,记录了管理者关注的信息。现在我们分析本系统时标对象有哪些,需要留下哪些核心业务单据。

转会对应转会单据,体检对应体检单据,签合同对应合同单据,训练对应训练指标单据,比赛对应比赛指标单据,新闻发布会对应采访单据。根据分析绘制如下时标对象:

(2) 参与方、地、物

这三类对象在四色建模中用绿色表示,我们以电商场景为例进行说明。用户支付购买商家的商品时,用户和商家是参与方。物流系统发货时配送单据需要有配送地址对象,地址对象就是地。订单需要商品对象,物流配送需要有货品,商品和货品就是物。

我们分析本例得到「参与方」包含总经理、队医、教练、球迷、记者,「地」包括训练地址、比赛地址、采访地址,「物」包含签名球衣和签名足球。

(3) 角色对象

在四色建模中用黄色表示,这类对象表示参与方、地、物是以什么角色参与到业务流程。

(4) 描述对象

增加对象相关描述信息,在四色建模法用蓝色表示。

2.3 划分领域

在四色建模过程中我们体会到时标对象是最重要的对象,因为其承载了业务系统核心单据。在划分领域时我们同样离不开时标对象,核心是通过收敛相关时标对象划分业务领域。

2.4 领域事件

当业务系统发生一件事情时,如果本领域或其它领域有后续动作跟进,那么我们把这件事情称为领域事件,这个事件需要被感知。

例如球员比赛受伤了,这是比赛子域事件,但是医疗和训练子域是需要感知的,那么比赛子域就发出一个事件,医疗和训练子域会订阅。

例如球员比赛取得进球,这也是比赛子域事件,但是训练和合同子域也会关注这个事件,那么比赛子域也会发出一个事件,训练和合同子域会订阅。

通过事件交互有一个问题需要注意,通过事件订阅实现业务只能采用最终一致性,需要放弃强一致性,这一点可能会引入新的复杂度需要权衡。

2.5 项目搭建

(1) API

接口层:提供面向外部接口声明和DTO对象

(2) controller

访问层:提供HTTP访问入口

(3) service

业务层:领域层和业务层都包含业务,但是用途不同。业务层可以组合不同领域业务,并且可以增加流控、监控、日志、权限控制切面,相较于领域层更为丰富,提供BO对象

(4) domain

领域层:提供DMO(DomainObject)、VO、事件、数据访问对象,核心是按照领域进行分包,领域内高内聚,领域间低耦合

(5) dependency

外部访问层:在这个模块中调用外部RPC服务,解析返回码和返回数据

(6) infrastructure

基础层:包含基础功能,例如缓存工具,消息队列,分布式锁,消息发送等功能

我们展开分析领域层,核心是按照领域进行分包,并且提供DMO、VO、事件、数据访问对象,领域内高内聚,领域间低耦合,例如domain1对应合同子域,domain2对应训练子域。

2.6 详细设计

目前为止领域已经确定了,现在可以划分任务了,组内成员分别负责一个或多个领域进行详细设计,这个阶段就是大家熟悉的用例图,活动图,时序图,数据库设计,接口设计的用武之地。需要说明领域驱动设计不是取代详细设计,而是为了更清晰地详细设计。

3 文章总结

本文探讨了DDD落地时需要关注的六个问题,并通过一个足球运动员信息管理系统案例分析落地的六个步骤。在实际应用中各业务形态可能千差万别,但是方法论却可以通用,我们需要明确DDD核心是分而治之各个击破,并配合一些经过检验的有效方法进行建模,希望本文对大家有所帮助。

————————————————

版权声明:本文为CSDN博主「JAVA前线」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。




十张图讲清楚ddd建模六个问题与六个步骤
2.6 详细设计 目前为止领域已经确定了,现在可以划分任务了,组内成员分别负责一个或多个领域进行详细设计,这个阶段就是大家熟悉的用例图,活动图,时序图,数据库设计,接口设计的用武之地。需要说明领域驱动设计不是取代详细设计,而是为了更清晰地详细设计。 3 文章总结 本文探讨了DDD落地时需要关注的六个问题,并通过一...

幼儿园小班数学教案《排序》
4、出示排队标记图:谁会在红线上给这几根纸条排队呢?想想哪根纸条排在最前面,哪根纸条排在后面,要把这几根纸条排得很整齐,一边排一边说:什么纸条请你排在什么地方。 5、请个别幼儿上前操作给纸条排队。 6、请大家说说他是怎么跟纸条排队的? 二、幼儿操作 1、每个小朋友从桌子中间拿一张排队标记图,拿一个...

口袋妖怪的玩法(红宝石版)
在看完通关画面进入游戏,在主角家里会得到一张船票,不过这张船票并不能到前作的世界,而是只能在カイナシティ市,ミナモシティ市,バトルタワ一着3个地方来回通行,バトルタワ一是通关之后有的新地方,就和水晶里的战斗塔是一样的,可以用自己LV50或者是LV100以下这两中等级的妖怪与电脑对战,首先选择男\/女主...

面试的窍门是什么?面试时,企业最看重的是什么?
封装了持久化操作)、资料传输物件(DTO,封装了失血\/贫血领域物件),三者之间的关系是事务指令码类组合(聚合)资料访问物件,这二者都依赖了资料传输物件正向工程(UML类图生成Java程式码)和逆向工程(Java程式码生成UML类图)资料库物理设计(ER图转换成表间关系图、建库和建表、使用工具插入测试资料);...

家庭教师炎之命运2.入江研究室的问题
接下来是大食堂剧情过后去找拉尔(训练室 B8F) 是说山本都还没出现拉尔教啥阿-.- 接下来出去外面(入口的楼梯 选有"森"字的那个) 出去之前可以去竞技场买水(右边那位白色衣服的 明明就是你们的首领还收钱= =) 此时人物可以跟索特调换往下走 是神社再往下走就是并盛市右边不能走 请走左边~~ 过去一张地图后 ...

科技小发明制作方法(简单的),急!!!
制作方法见下面:首先我们要准备的工具有电池、磁铁和铜线圈。将同极的小磁铁(同为N或者同为S)分别贴在电池的正负极上。再将这个制作好的电池放入铜线圈中。这时候就会发现,电池不停的穿梭在铜线圈中了。小磁铁是这个实验的关键点,它们既产生了磁场,又充当了导体的作用,使铜线圈和电池的正负极...

我有个问题:古代山水诗歌的形成和当时的人的心理,社会时代个因素的关...
讨论山水诗的阶级性问题,自然会涉及到山水诗的产生和发展问题,这个问题弄清楚了,对山水诗的阶级性的理解自然也是有帮助的。在讨论中,许多人从文学史的角度论述了其产匕的基础和条件,但大家的见解也是各说不一的。 朱光潜文强调了社会消极因素对山水诗产生和发展的作用。他认为,山水诗于晋宋时代出现,是与当时汉族...

南湖区17137608821: 6岁的孩子说话总是说不出来,一遍遍的重复,好像是结巴 -
帛盲西洛: 西安华夏语言学校口吃矫正姚会宁老师温馨提示:对于孩子说话嗑巴的情况,父母不必太过紧张,首先要进行环境调整,避免孩子与口吃的人接触,父母或家人要能够接受和容纳孩子的“口吃”,消除对其说话的干涉和限制.下面老师把口吃的...

南湖区17137608821: 如何做好绩效管理?绩效反馈六大基本原则须遵守 -
帛盲西洛: (联合电讯/广东)--绩效反馈是绩效管理过程中的一个十分重要的环节.管理者要向员工传达组织的期望,双方达成对评估结果一致的看法.本期,培训网(peixw.com)总结绩效反馈须遵守六大基本原则.(1)经常性原则 绩效反馈应遵循经常性...

南湖区17137608821: 总是偏头痛怎么回事 - 偏头痛 - 复禾健康
帛盲西洛: 苹果是国粉们炒作,国人崇洋媚外.支持国货!我就用华为非常给力

南湖区17137608821: vbddd6是什么?是什么软件?我要具体一点的答案
帛盲西洛: Visual Basic是近年来在国内外得到迅速推广应用的可视化程序设计语言,具有简单易学,功能强大,软件费用支出低,见效快等特点.它提供了开发Windows应用程序最迅速,最简捷的方法,不但是专业人员得心应手的开发工具,而且易于被非...

南湖区17137608821: 什么叫“道可道,非常道”? -
帛盲西洛: 老子《道德经》八十一章中的第一章第一句就是:“道可道,非常道.”这是老子写《道德经》的开宗明义之句,其分量是极重大的.如果这个开宗明义的第一句话没有弄清楚,那么以下整本《道德...

南湖区17137608821: 为什么“0*077c17010”指令引用的“0*7c81ddd6"f内存.该内存不能为”written". -
帛盲西洛: 内存不能为read 有时Windows会频繁弹出xxx.exe应用程序错误∶该内存不能Written的对话框,然后应用程序被关闭了,特别是在赶制一份工作报告的时候,工作成果还没有得到及时的保存,肯定让你恨死系统了.解决办法∶程序及时更新很重...

南湖区17137608821: ...b和y之间的交换值为10%.在没有干扰的条件下,此杂合体能产生几种类型的配子?在符合系数为0.26时,配子的比例如何?求解题思路,主要第二问,麻烦... -
帛盲西洛:[答案] 产生了ABy,abY,Aby,aBY,ABY,aby,aBy,AbY等八种配子有题可知,其实际交换值=0.26*0.06*0.1*100%=0.156%,所以牌子比例为ABy42.078,abY42.078,Aby2.922,aBY2.922,ABY4.922,aby4.922,aBy0.078,AbY0.078...

南湖区17137608821: 把一张纸剪成6块,从所得的纸片中取出若干块 -
帛盲西洛: 6块取一块剪成6块,总块数增加了5,再任意选一块,还是剪成6块,还是增加了5,所以总的块数应该是5n+1 所以有可能是2001,其他几个数都没有可能.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网