【领域驱动设计 打通DDD最小闭环】三 模型的建立-领域建模

news2024/12/29 3:55:35

本篇BLOG为DDD流程的第二步,在模型的建立阶段,领域专家与技术人员通过领域建模来完成更为细致的模型建立讨论
在这里插入图片描述

领域建模的目的

领域建模主要有两个目的:

  • 将知识可视化,准确、深刻地反映领域知识,并且在业务和技术人员之间达成一致
  • 指导系统的设计和编码,也就是说,领域模型应该能够比较容易地转化成数据库模式和代码实现

不同于事件风暴仅仅追求“形似”,也就是说业务是怎样运作的,事件风暴就怎样反映,领域建模更要“神似”。也就是说,领域建模不仅要对业务进行直观模拟,更要经过提炼,形成浓缩的知识,使模型中的知识不再停留在业务的表面,而是深入到业务的本质,进而加入技术视角选择最合适的建模方案

领域建模的步骤

我们建立领域模型,主要是要识别领域对象(domain object),领域对象之间的关系,以及领域对象的关键属性,必要的时候还要将领域对象组织成模块

1 识别领域对象

什么是领域对象,我们系统中要处理的各种“事物”就是领域对象(可能是领域名词,也可能是名词化的动词)DDD 中将领域对象又分成实体(entity)和值对象(value object)
在这里插入图片描述
我们可以先假定每个领域名词都是一个实体,把它们用UML图的类的符号画出来,例如
在这里插入图片描述

实体识别注意事项

实体的识别过程中有两点需要注意一下:

  • 领域建模阶段,我们主要关注的是实体和它们之间的关系,所以先不具体描述属性
  • 通过后序分析,我们会进一步识别有些名词不是实体,有些要转换成其他形式

也就是用领域名词来当做实体是第一步。

2 识别领域对象关系

领域对象中的关系主要有如下几种:一对一关系,一对多关系,多对多关系,并应用UML的一些表达技巧将这些关系表示出来,业务事件风暴后我们最终形成了如下的领域对象关系UML,这里有很多要点。
在这里插入图片描述

实体抽象【技巧】

企业、开发中心、开发组、直属部门,其实都是组织结构中的节点而已,从这一点来说,他们是有共性的,都是组织,所以可以抽象为组织和组织类别两个实体,同样管理员、人事人员的共性都是人员,所以可以抽象为人员和岗位两个实体,用于更灵活的扩展

注释与约束【标记】

可以通过增加注释和约束,使模型中的业务知识更加丰富和准确。其中,约束是一种特殊的注释,它的内容必须以某种形式在代码或数据库中实现。约束也属于我们在之前说的业务规则,需要补充到业务规则表中去
在这里插入图片描述

  • 在 UML 中,注释用折角的矩形表示,和被注释的实体之间用虚线连接
  • 约束的内容用大括号括起来了。在 UML 中,用大括号括起来的内容称为“约束”(constraint)

实体自关联【标记】

一个组织可以有多个组织作为自己的下级;而一个组织只能有一个组织作为自己的上级,在这个自关联的两端,有上级和下级两个词。它们在 UML 里称为“角色”(role),没有角色我们无法明确上下级的多重性
在这里插入图片描述

关联多重性【标记】

关联多重性主要表示两个实体之间的数量对应关系,我们通常会更细化一些,例如:
在这里插入图片描述

  • 0..1表示:一个下级可以没有上级,最多只能有一个上级
  • 1..1表示,一个员工最少要属于一个组织,最多也只能属于一个组织
  • 0..*表示:一个组织最少有 0 个员工,最多可以有很多员工

识别操作【标记】

操作(operation)在 UML 里也叫方法(method)。对象的属性是静态的值,而操作是动态的逻辑。在 UML 中,操作用“操作名 + 括号”的方式表示,括号中可以写参数
在这里插入图片描述

实体多关联【标记】

两个实体之间,可以有多个关联。不同的关联代表不同含义,数量关系也可以不同,可以用角色名来区分
在这里插入图片描述

  • 员工与项目的多对多关系:一个员工(角色为项目成员)可以被分配到多个项目上,一个项目上又可以有多个员工
  • 员工与项目的一对多关系:一个员工(角色为项目经理)可以被分配到多个项目上,一个项目只能有一个项目经理

拆分多对多关联【技巧】

某些情况下我们需要拆分多对多关联为两个一对多关联,一般有如下三种情况:

  1. 关联实体自身也有值得关注的属性【store_with_coop】 商户中的各种实体关系表设计的考虑,独有的包括关系的建立时间、断开时间,关系的状态等
  2. 关联实体本身也有业务关注的独立的含义的时候(常常表现为在业务的术语里面有)
  3. 多对多关系存在业务规则时,需要拆分出来一个承载的关联实体

例如项目管理有一个关于投入百分比的规则,那么投入百分比(关联实体自身的属性)这个属性应该记录在哪个实体上呢?这个百分比既不能记录在员工实体上,也不能记录在项目实体上
在这里插入图片描述
于是原来的项目成员角色演变成了一个独立的实体,来表达员工和项目之间的多对多关联。预计投入百分比也就自然放在这个实体里面了。注意,这时候,员工和项目成员之间的关联是一对多,项目和项目成员之间也是一对多。

3 将领域对象划分模块

当实体和关联复杂化后,就会让我们的认知过载,解决这一问题的方法就是“模块化”。也就是说,把模型中的业务概念组织成若干高内聚的模块(module),而模块之间尽量低耦合,在 UML 中,可以用包来表示模块,包的内部可以包含实体,也可以包含另外的包
在这里插入图片描述
宏观层面我们可以明确大致包间的依赖关系,在 UML 中带箭头的虚线表示依赖(dependency)关系,箭头由依赖方指向被依赖方,例如项目管理依赖组织管理
在这里插入图片描述

领域建模的产出

领域建模的产物主要有两个,一个是统一语言词汇表,一个是事件风暴时的业务规则表的继续完善。

UL词汇表

把事件风暴和领域模型中重要的词汇列成表,这么做主要有两个目的:

  • 我们需要通过词汇表来规范领域模型中的词汇
  • 可以用于后续编程中的命名。按照 DDD 的要求,程序中的各种命名也需要统一,并且需要与领域模型中保持一致
    在这里插入图片描述

业务规则表

我们在做事件风暴时就开始识别业务规则了,在领域建模中又识别出了更多的规则,所以现在我们需要把这些规则补充到业务规则表
在这里插入图片描述

总结一下

同事件风暴一样领域建模也是在模型建立阶段,但更进一步的,领域建模不仅要对业务进行直观模拟,更要经过提炼,形成浓缩的知识,使模型中的知识不再停留在业务的表面,而是深入到业务的本质,进而加入技术视角选择最合适的建模方案。可以理解为是对事件风暴的技术性加工,使用UML图的一些标记例如:注释、约束、多重性、自关联、多关联、角色以及一些技巧如:多对多关联拆分、抽象化实体、模块化来进行领域建模。最后完善业务规则表建立UL词汇表。一个比较深的体会是对于多对多关联拆分的考虑,例如业务事件阶段的【门店、合作】以领域名词的形式候选为实体,在领域建模阶段明确其多重性为多对多关系(一个合作可以有多个门店,附加时间维度一个门店不同时候也可以属于不同合作),但门店的合作包含其特有的合作周期和签约信息,这部分信息放到合作还是门店都不合适,于是需要增加关联实体【门店合作信息】将多对多关联拆分来记录关联特有的属性。

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

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

相关文章

神经网络——非线性激活

1 非线性激活 1.1 几种常见的非线性激活: ReLU (Rectified Linear Unit)线性整流函数 Sigmoid 1.2代码实战: 1.2.1 ReLU import torch from torch import nn from torch.nn import ReLUinputtorch.tensor([[1,-0.5],[-1,3]])inputtorch.reshape(…

HT97226 160mW免输出耦合电容的立体声耳机放大器

特点: 输出无需隔直流电容 卓越的低音效果 无咔嗒/噼噗声,50uV (typical) Vos 低THDN:最低0.002% 低噪声,VN: 8.5uV 支持单端输入和全差分输入 2.5V至6V较宽的电源工作范围 输出功率:80mW(fIN1kHz,VDD3.6V,RL32Ω, THDN1%) 160mW(PVDD5V,fIN1kHz,RL32Ω…

Java中的抽象类 abstract

抽象方法: 将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容不一样,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。 抽象类 如果一个类中存在抽象方法,那么该类就必须声…

【软件测试】软件测试-----概念篇

软件测试相关概念 一.需求的相关概念1.1 用户需求1.2 软件需求 二. 开发模型2.1 模型的基本概念.2.2 软件的生命周期2.2.1 理解软件生命周期每个阶段的具体任务 2.3 常见的开发模型.2.3.1 瀑布模型(适用场景:需求固定的小项目).2.3.2 螺旋模型(适用场景:…

ollama+llama3.1 405B 简介

ollamallama3.1 简介 Llama 3.1是一款来自Meta的最新型号,提供8B、70 B和405 B模型。 llama3.1:latestllama3.1:8bllama3.1:70bllama3.1:405bllama3.1:8b-instruct-fp16llama3.1:8b-instruct-q2_Kllama3.1:8b-instruct-q3_K_Sllama3.1:8b-instruct-q3_K_Mllama3.1…

python如何调用另一个文件中的函数

在同一个文件夹下 调用函数: A.py文件: def add(x,y):print(和为:%d%(xy)) B.py文件: import A A.add(1,2) 或 from A import add add(1,2) 在不同文件夹下 A.py文件的文件路径:E:\PythonProject\winycg B.py文件&a…

构建并升级openssh至OpenSSH_9.8p1

组件说明OpenSSH_9.8p1最新版本(2024年8月)OpenSSL 1.1.1pCentOS7中默认是OpenSSL 1.0.2k-fips 26 Jan 2017版本,OpenSSH_9.8p1不支持CentOS7主要是因为有大量CentOS老版本需要升级RPM,需要适配,故选择此版本。AnolisO…

输入一个正的奇数n(1≤n≤9),打印一个高度为n的、由“*”组成的沙漏图案。当n=5时,输出如下沙漏图案:

输入一个正的奇数n&#xff08;1≤n≤9&#xff09;&#xff0c;打印一个高度为n的、由“*”组成的沙漏图案。当n5时&#xff0c;输出如下沙漏图案&#xff1a; int main(){int i,j,n,m;scanf("%d",&n);m n / 2;for(im1;i<1;i--){ //m1是中间数for(jm1-i;j&g…

音频筑基:为啥一个压缩率概念,中文搜索结果都是错的?

音频筑基&#xff1a;为啥一个压缩率概念&#xff0c;中文搜索结果都是错的&#xff1f; 缘起概念分析小结 缘起 最近看一些数据压缩类的文章&#xff0c;对不同场合下表达的压缩率概念分歧&#xff0c;产生了疑问。有的说&#xff0c;压缩率越小越好&#xff0c;有的又说&…

信刻光盘摆渡机——完全物理隔离,安全合规

信刻光盘摆渡机是一款跨网安全数据摆渡设备&#xff0c;用于不同等级网络之间数据跨网安全传输的需求&#xff0c;采用智能光盘机械手臂&#xff0c;模拟人工取放光盘&#xff0c;在保持物理隔离的条件下&#xff0c;安全合规实现网间信息系统数据库及文件同步、网间信息数据交…

下载B站视频作为PPT素材

下载B站视频作为PPT素材 1. 下载原理2. 网页分析3. 请求页面&#xff0c;找到数据4. 数据解析5. 音频、视频下载6. 合并音频与视频7. 完整代码 其实使用爬虫也不是第一次了&#xff0c;之前从网站爬过图片&#xff0c;下载过大型文件&#xff0c;如今从下载视频开始才想到要写一…

搭建自己的GPT

搭建自己的GPT 文章说明核心代码效果展示源码下载 文章说明 目前GPT的使用比较主流&#xff0c;现有开源大模型&#xff0c;可以拉取到本地进行部署&#xff0c;搭建属于自己的GPT对话工具&#xff1b;主要用于熟悉大模型的本地搭建&#xff1b;本文采用开源的Ollama进行服务提…

MyBatis中的#{}和${}区别、ResultMap使用、MyBatis常用注解方式、MyBatis动态SQL

#{}和${}区别&#xff1a; #{}&#xff1a;是占位符&#xff0c;采用预编译的方式sql中传值&#xff0c;防止sql注入&#xff0c;如果我们往sql中列值传递一般使用 #{}。 ${}&#xff1a;采用字符串拼接的方式直接拼接到sql语句中&#xff0c;一般不用于sql列值传递&#xf…

高可用 Go 服务开发

高可用的含义是尽量减少服务的不可用&#xff08;日常维护或者突发系统故障&#xff09;时长&#xff0c;提升服务的可用时长。如何衡量一个服务的可用性呢&#xff1f;或许你也听说过&#xff0c;通常企业可能会要求服务的可用性能能够达到三个 9(也就是 99.9%)或者 4个 9 &am…

C# 自动化抢购脚本:基于商品链接的实现方案

实现思路&#xff1a; 启动参数: options.AddArgument("start-maximized"); 用于启动浏览器时使其窗口最大化。 创建 EdgeDriver 实例: EdgeDriver driver new EdgeDriver(options); 用于初始化 WebDriver 实例。导航到 URL: driver.Navigate().GoToUrl("请输入…

详谈进程等待

目录 前言1. 进程等待的必要性1.1 进程等待的定义 2. 如何进行进程等待2.1 wait 单进程2.2 wait 多进程2.3 status && 退出情况2.3.1 status 参数构成2.3.2 简证 status 参数构成2.3.3 进程等待失败2.3.4 宏调用查看退出信息 3. 进程等待的原理 前言 本篇文章继上一篇…

一款免费且功能强大的图像查看和编辑软件

IrfanView是一款免费且功能强大的图像查看和编辑软件&#xff0c;以其小巧的体积、快速的运行速度和丰富的功能而闻名。它不仅支持多种图像格式&#xff0c;如JPEG、PNG、BMP、GIF等&#xff0c;还支持视频和音频文件的播放。 IrfanView的主要特点包括&#xff1a; 广泛的文件…

Tomcat启动过程是怎么样的?

一、Tomcat 启动流程 步骤&#xff1a; 1、启动tomcat&#xff0c;需要调用 bin/startup.bat (在linux 目录下&#xff0c;需要调用 bin/startup.sh)&#xff0c;在startup.bat 脚本中&#xff0c;调用了catalina.bat。 2、在catalina.bat 脚本文件中&#xff0c;调用了BootS…

【栈与递归】-------简单了解

1.递归的定义&#xff1a; 若一个对象部分地包含它自己&#xff0c;或用它自己给自己定义&#xff0c;则称这个对象是递归的 例如&#xff1a; 链表的结构&#xff0c;树的结构等等 若一个过程直接地或间接地调用自己&#xff0c; 则称这个过程是递归的过程。 例如&#xf…

不确定性环境下的自动驾驶汽车行为决策方法

在高度交互的复杂驾驶环境中考虑不确定性因素的影响&#xff0c;做出合理的决策&#xff0c;是当前决策规划系统须解决的主要问题之一。本文提出了一种不确定性环境下的自动驾驶汽车行为决策方法&#xff0c;为消除不确定性的影响&#xff0c;将行为决策过程转化为部分可观察马…