0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

产出领域模型的一个方法:两图两表法

工程师邓生 来源:技术琐话 作者:胡正军 2022-09-20 10:46 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

接一年多前的上篇(小团队也能做DDD),上篇主要讲了为什么,这篇核心讲下怎么做。从上篇的分析可以看出领域模型是一个核心产出物,有了领域模型,限界上下文和代码模型就可以产出,最终落地到微服务和具体的代码。本文先介绍业务系统的核心元素,再讲产出领域模型的一个方法:两图两表法,最后做个总结。

业务系统的核心元素

在讲怎么产出领域模型之前,回顾下一个业务系统最重要的东西是什么,先看1个公式:

计算机程序=算法+数据结构

这个公式是大学课本里见到过,是图灵奖得主:尼古拉斯·沃斯提出的,那我们平常做得多的软件是业务系统,看起来也没什么算法,数据结构用List,Map之外也没用过多么高大上的东西,明显不太符合大师的这个公式。我们换个思路,先做类比,把程序当作一个人的话,数据结构是心肝脾肺肾各种器官,相对静态不动;算法是血液,动态输送到器官,影响器官。从这个角度看业务系统的血液是业务流程,器官是领域模型,业务流程代表业务流转过程,这个过程中操作领域模型,所以我们得出如下一个公式:

业务系统=业务流程+领域模型

这个公式是上一个公式的变种,能较好的描述业务系统,可以说是业务系统的结构化表达,为了梳理出业务系统的这两个核心元素,我们讲下一个领域建模的两图两表法,这个方法相对比较简单,也好操作,方便落地。

两图两表法

这个方法是自己的一个总结,学习了不少专家的文章和书籍,先看定义:

目的 谁产出
业务术语表 统一语言,去歧义 需求分析人员
业务流程图 梳理流程,观大局 需求分析人员
角色目标实体表 用例整理,列实体 需求分析人员或者架构师
领域模型图 实体建模,画结构 业务系统架构师

为了避免扯皮,上面表格里面给了4个产出物由什么角色产出合适。由于业务术语,业务流程偏向需求分析,所以由需求分析人员产出相对合理,角色目标实体表需要两个角色一起产出,领域模型图虽然说也是可以由需求分析人员产出,但这里毕竟跟代码模型牵扯比较紧密,我建议是业务系统架构师产出,再跟需求分析人员和领域专家达成一致,也可以根据团队成员的情况来,有些需求分析人员对软件抽象掌握比较好,产出领域模型也是可以的。

详细步骤如下:

9eeeec12-388d-11ed-ba43-dac502259ad0.png

接下来针对每个产出物做解释。

业务术语表

目的是统一语言,减少沟通障碍,简单说就是名词解释,如果一个术语比较复杂,要用why,what,how来解释清楚,这三个东西不是每个术语都得写,要看某一项是否明确,比如what非常清楚,就可以省略。特别强调的是我们经常忘记写为什么,导致业务术语看不懂

业务术语表的一个简单模板如下:

术语 / 缩略词 英文 说明
XXX XXX XXX (为什么,是什么,怎么做),
购物车 Shopping Cart 用户浏览很多商品时,方便用户暂存感兴趣的商品,通过加入购物车完成商品的暂存

业务流程图

业务流程能描述业务整体流转过程,串起业务活动,是数字化起点。流程图分为两类:业务流程(以人为基础),系统流程(以物为基础)。这两个流程图的出发点不一样,是先有业务流程再有系统流程,两者不可混淆在一起。流程图常用的展现形式是泳道图,对于业务流程,因为是以人为基础,那么每条泳道代表一个业务角色。

流程图有一个难点在于粒度,对于DDD而言,已经到了一个具体问题域的业务分析,这个需要落地到需求开发,流程图粒度直接到具体的业务角色需要干什么事情,才能有效的指导开发。多提一句,企业架构里面对流程有个PCF流程分级方法,我们这里提到的具体流程算是L3级流程。拿中国地图举例说明下流程分级,L1级流程是一个国家省的划分,L2级流程是对某个省做城市的划分,L3级流程是对城市做乡镇的划分。可以看到高阶抽象的流程是为了看范围更大,更复杂的企业级的业务过程,这属于企业架构内容,感兴趣的同学可以学习这块,企业架构+DDD非常配。

下图是一个员工请假的业务流程图:

9f1dcb72-388d-11ed-ba43-dac502259ad0.png

角色目标实体表

角色目标实体表是为了梳理业务实体,我们的业务流程跟业务实体到底怎么关联起来,业务实体不是凭空产生的,就是通过这个角色目标实体表,这个方法从Thoughtworks徐昊的文章里面提到过,我觉得比事件风暴要容易学习和落地,毕竟学得会的方法才是好方法。具体方法是把业务角色全部列出来,然后顺着业务流程,梳理出用例,过程中出现的名词,就是涉及的实体。看例子:

角色 目标 干啥(XX地方做XX动作) 实体
员工 请假获得批准 HR系统或者邮件发起申请 请假单
上级 审批员工的请假 根据员工的假期进行请假审批 请假单,员工,员工假期
HR 维护好员工的假期 邮件类申请在HR系统做好员工的假期备案,留下变更记录 员工,员工假期,假期变更记录

上表是个非常简单的场景,企业的业务远比这个要复杂,仅仅用来说明角色目标实体表的形态,可以看到这个表相当于把用例和实体结合起来。

领域模型图

领域模型图是本文的最终目标,是软件的骨架。角色目标实体表产出的实体,用UML图表达出来,就形成了领域模型图。实体和实体的关系大体有3种:继承,聚合,关联。下图是一个例子:

9f3acbdc-388d-11ed-ba43-dac502259ad0.png

具体可以参考如下步骤:

把角色目标实体表的所有实体画出来

根据继承,聚合,关联3种关系对实体进行连线,聚合可以用一个虚线框框出来

多个聚合组合成限界上下文

团队共识消化,对于缺少的实体进行补充等

这个步骤的难点在于第4步,怎么合理的划分出限界上下文。要做到划分后的限界上下文之间的接口最少,这个最优解肯定存在,但比较依赖经验,有经验的架构师深刻理解高内聚低耦合,一把到位。怎么划分这里也给出一些建议:

根据子域来识别限界上下文,那么子域如何得到呢?我们通过分解问题域的方式,将整个问题域分解成若干个更小、更简单、更容易解决的问题子域。

一个限界上下文边界内,实体的含义是不存在二义性的。如果存在两个人对一个实体理解不同,那这个实体说明有二义性,很可能是这个实体要分离成两个实体,放到不同的限界上下文。举个例子,商品管理,销售订单,发货三个业务都有商品的概念,表面看好像是同一个实体,深入分析实际是不同的实体,销售订单里面商品其实是订单项,发货业务的商品关注的是大小,重量等,实际上是货品,所以这里是三个不同的限界上下文,每个限界上下文里面都有一个“商品”实体,命名上要区分开。

9f77c8ca-388d-11ed-ba43-dac502259ad0.png

限界上下文分不清就先别分了,减少扯皮,团队内共识后,迭代演进。

领域模型图产出后,需要拉上领域专家一起共识,当然很多团队要做到这个不现实,那就尽最大范围去共识,形成统一语言。接下来领域模型就可以给代码开发提供输入了,我们可以把梳理的领域模型都放到一个单体系统来实现,每个限界上下文是一个package,这个是最简单的,如果实在要做微服务拆分,限界上下文这个业务边界也是优先考虑的,除此以外还要综合考虑弹性边界,组织架构等问题了,这个属于微服务拆分的话题了。

总结

业务流程和领域模型构成业务系统的核心要素,业务流程升级到业务价值流,领域模型升级到企业级业务对象,这就变成了企业架构的方法(价值流+业务能力+业务对象),所以DDD和企业架构方法是相通的,一个是微观,一个是宏观,两者结合可以更好的认识数字化建设。最后预告下篇内容,上代码模型。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • UML
    UML
    +关注

    关注

    0

    文章

    123

    浏览量

    31501
  • 数字化
    +关注

    关注

    8

    文章

    10317

    浏览量

    66545

原文标题:小团队也能做DDD

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    openDACS 2025 开源EDA与芯片赛项 赛题七:基于大模型的生成式原理设计

    智能生成。 4. 赛题内容 4.1赛题描述 本赛题要求参赛队伍构建合理规模的知识库,运用提示词工程,构建完整的生成式原理设计系统。 参赛系统需充分发挥大模型在自然语言理解、上下文
    发表于 11-13 11:49

    负压 vs 正压:手机外壳气密性检测仪的种核心技术

    的手机外壳气密性检测仪主要采用种核心技术:负压和正压。二者各有优劣,适用于不同的生产需求和检测场景。正压是通过向手机外壳内部充入
    的头像 发表于 11-05 16:19 249次阅读
    负压<b class='flag-5'>法</b> vs 正压<b class='flag-5'>法</b>:手机外壳气密性检测仪的<b class='flag-5'>两</b>种核心技术

    硬件SPI两个CS操作两个norflash,怎么互斥操作两个norflash?

    硬件SPI两个CS操作两个norflash,怎么互斥操作两个norflash,有
    发表于 09-26 06:18

    电阻测量技术的双生花:线与四线的科学探秘

    公元前3世纪,阿基米德在浴缸中发现浮力定律时,或许未曾想过,千年后的科学家会为测量根发丝粗细的导线电阻而绞尽脑汁。在现代工业的精密仪器里,电阻测量的误差可能引发卫星失联、芯片报废甚至医疗设备误诊
    的头像 发表于 09-15 09:56 1225次阅读
    电阻测量技术的双生花:<b class='flag-5'>两</b>线<b class='flag-5'>法</b>与四线<b class='flag-5'>法</b>的科学探秘

    基本半导体连获两个行业奖项

    近日,基本半导体凭借在碳化硅模块领域的突出表现,连获“国产SiC模块TOP企业奖”和“年度优秀功率器件产品奖”两个行业奖项。
    的头像 发表于 09-05 16:31 890次阅读

    WP4000变频功率分析仪的2V3A线路还是三

    的2V3A接线原理 上图中,连接在A相和C相的两个变频功率传感器相当于两个单相有功功率,构成
    的头像 发表于 07-11 10:58 542次阅读
    WP4000变频功率分析仪的2V3A线路<b class='flag-5'>图</b>是<b class='flag-5'>两</b><b class='flag-5'>表</b><b class='flag-5'>法</b>还是三<b class='flag-5'>表</b><b class='flag-5'>法</b>?

    半导体推出款高压GaN半桥栅极驱动器

    半导体推出款高压GaN半桥栅极驱动器,为开发者带来更高的设计灵活性和更多的功能,提高目标应用的能效和鲁棒性。
    的头像 发表于 06-04 14:44 1021次阅读

    FA模型访问Stage模型DataShareExtensionAbility说明

    DataShareExtensionAbility提供数据库的读写服务。 服务端由FA模型升级到Stage模型后,会导致FA模型的客户端在API 9(含)之后的版本上无法访问服务端。 为了解决上述问题,系统在框架侧提供了
    发表于 06-04 07:53

    PLC梯形程序的设计方法与技巧

    、梯形的经验设计在PLC发展的初期,沿用了设计继电器电路方法来设计梯形,即在
    发表于 05-22 15:18

    光纤线怎么合光纤

    根光纤线合并为根光纤线,通常称为光纤熔接或光纤耦合,主要目的是将根光纤的光信号无缝连接,以实现信号的连续传输。以下是常见的方法及步骤:
    的头像 发表于 05-20 11:15 2356次阅读

    四线测电阻

    1.万用如何测量电阻(线测电阻) 图:万用测电阻电路 万用
    的头像 发表于 03-18 16:34 1791次阅读
    四线测电阻<b class='flag-5'>法</b>

    模型领域常用名词解释(近100

    本文总结了大模型领域常用的近100名词解释,并按照模型架构与基础概念,训练方法与技术,模型优化与压缩,推理与应用,计算与性能优化,数据与标
    的头像 发表于 02-19 11:49 1282次阅读
    大<b class='flag-5'>模型领域</b>常用名词解释(近100<b class='flag-5'>个</b>)

    了解DeepSeek-V3 和 DeepSeek-R1个大模型的不同定位和应用选择

    DeepSeek-V3 和 DeepSeek-R1 是深度求索公司(DeepSeek)推出的两个不同定位的大模型,其核心差异主要体现在目标场景、能力侧重和技术优化方向上。以下是二者的实质性
    发表于 02-14 02:08

    【「基于大模型的RAG应用开发与优化」阅读体验】+大模型微调技术解读

    集对模型进行进步训练的过程。 大模型微调是利用预训练模型的权重和特征,通过在新任务数据集上的训练,对模型进行适应性和优化调整。使
    发表于 01-14 16:51

    【「大模型启示录」阅读体验】如何在客服领域应用大模型

    在客服领域是大模型落地场景中最多的,也是最容易实现的。本身客服领域的特点就是问答形式,大模型接入难度低。今天跟随《大模型启示录 》这本书,学
    发表于 12-17 16:53