二、演练领域驱动的设计过程

news2024/11/16 9:38:07

一、业务分析:统一语言与事件风暴

1、统一语言:

客户明白自己的领域知识也就是业务,以及自己需要解决的问题,也叫做痛点,但是不知道技术。技术人员知道技术,但是不了解客户的业务。所以两者交流起来往往会有很多出入,技术人员和客户交流的过程中要去不断建立一种双方都认可的关键词,来深化领域知识,使得领域模型的建立。

2、事件风暴:

一种基于工作坊的事件方法,它可以快速发现业务领域中正在发生的事件,知道领域建模及程序方法。基本思想是将软件开发人员与领域专家(客户)在一起,相互学习。让领域专家更加理解

①领域事件:即领域中发生的事实(过去发生的事实)(fact)

在真实世界中,当满足某个条件的时候,某个发起者会触发某个事件,做某件事情。

②事实(fact):已经发生,很重要

是指哪些过去已经发生过的事件。
鉴于过去已经发生的事件不会发生改变。
建设信息化系统的实质就是:将过去已经发生的事实,存储到数据库中。从而提高管理水平,效率。

③事件风暴会议:

Ⅰ、目标:以完成领域模型的创建
Ⅱ、参会人员:领域专家和软件开发人员
Ⅲ、会议以探讨领域事件开始,从前往后一次梳理,以确保领域中所有事件能够覆盖。
Ⅳ、项目组成语不断增加各种命令和事件,进而思考与之相关的资源,外部系统与时间。
Ⅴ、在分析过程中的人和事相互之间的关系以箭头方式标识,分析有没有聚合关系,如果存在聚合关系,用紫色的便签纸标注出来。
Ⅵ、将模型分配到各个限界上下文中,构建上下文地图。

④案例:在线订餐系统

在这里插入图片描述

Ⅰ、梳理流程,识别领域事件(当达到某个条件,某个发起者发起某个事件)。

注意:领域事件是已经发生,并且很重要(需要存储到数据库里)
在这里插入图片描述
疑问:用户选餐是不是一个领域事件呢?
是过去已经发生的事情,重不重要呢?选餐本质是个查询操作,这些查询的操作是不是一定要记录下来呢?在很多系统是不需要记录的。不考虑分析系统,对于业务系统来说,选餐不是领域事件。

下单,接单,就绪,派送,送达需要记录下来,存储到数据库中,因为已经发生,所以命名是过去式。

Ⅱ、用每一个领域事件作为中心,分析和这件领域事件相关的人和事。

在这里插入图片描述
命令:蓝色
和命令有关的人和事情:黄色便签纸标注
触发者:标注小人
箭头:标识有关系的人和事情,比如用户下有地址。识别对象之间是否有聚合关系。
聚合:整体---->部分。例如,用户有很多数据,地址是用户的一些数据,

在这里插入图片描述
在这里插入图片描述

如何识别聚合?
Ⅰ、整体与部分关系
Ⅱ、部分的生命周期在整体范围内,整体产生之前,部分不能产生。整体被删除了,部分也要被删除。

如果菜单是公用的,每个饭店都是引用菜单。一个饭店没有的时候,菜单就有了。
如果每个饭店有各自的菜单,当前饭店没有的时候,这个饭店的菜单也没有,所以就是是聚合。

Ⅲ、识别限界上下文

在我们整个项目里,有很多业务场景,在每次业务场景里,都有各自不同的领域对象,在不同的领域对象之间,会有各自密密麻麻的关系。那么现在是要绘制成一个个密密麻麻的大图,还是按照业务场景绘制出一个个小图呢?

限界上下文:业务场景就把系统划分了很多部分,这些部分就成为了限界上下文。

各个限界上下文又不是相互孤立的,又有相互的联系,相互之间的联系就是上下文地图。
通过限界上下文划分微服务,上下文地图就是各各微服务之间的接口。

在这里插入图片描述在用户下单的时候,需要用户,用户地址。用户信息来自用户注册的上下文中。
在这里插入图片描述

Ⅳ、微服务的拆分

在这里插入图片描述
用户和饭店是支持域,不管在用户下单还是接单,派送的时候,都需要用到用户和饭店的领域的,所以叫支持域名。

注意:DDD指导的是后端微服务。
前端的设计根据原型

Ⅴ、领域事件的通知:

push主动:上游做了事情以后,下游立马响应。比如上游下了单,下游立即接单。
pull被动:挂号与接诊。挂号暴露接口,医生接诊的时候调用挂号的接口。医生什么时候需要接诊的时候,接口查一下,所以下游不需要存一份 。患者挂号以后,不需要立即通知,所以不需要

Ⅵ、对每一个领域事件,进行领域建模,形成领域模型。

用户下单领域模型:
在这里插入图片描述
坏处:每一次查询订单的时候都要调用用户注册的接口。
每次查询菜品明细的时候需要菜单名称

**
所以进行一些调整:把用户和用户地址的一些信息冗余到订单对象里,那么在查询订单的时候,就不需要再去访问用户注册服务,只有在查询更详细的信息的时候,再去远程调用。
(如果用户基本信息那边变了的话怎么办呢)
**
在这里插入图片描述

饭店接单领域模型
因为采用了推的方式,所以,饭店接单这边冗余了一份订单对象
在这里插入图片描述
用户订的取消时间字段,饭店的订单也要有取消时间,因为取消时间对于饭店业务是有用的。
用户订单的取消时间字段,对于骑手主题域的是没有业务意义的,因为在骑士派送微服务是没有操作的。

问题:如果用户接单的订单发生了变更,饭店接单和骑士派送冗余的订单需要修改么
思路:订单在不同的主题域里不用完全保持一致,当上游增加了一些字段的时候,对于下游,要看看这些增加的字段对我自己的业务有没有意义。如果没有意义,就不需要同步的修改,如果说这些字段对我当前主题域来说很重要,要进行业务的调整和业务的修改,那么需要同步的修改,进行同步的操作。
目的:在每一次需求变更的时候,每一次修改的范围尽量缩小。每来一个需求,更改一个微服务,但是这样的情况不一定在所有的微服务都能保证,当我们不能保证只改一个微服务的时候,我们的思路是尽量减少微服务修改的范围。

二、领域对象落地到程序设计:落实到三种对象

1、服务Service:

领域建模中表示某些i行为或者操作。接受用户的请求,执行相应的方法。数据在哪的?在实体和值对象中

2、实体Entity:

领域建模中标识每一个业务个体的领域对象。关注事物的每个个体。

3、值对象Value Object:

领域建模中标识某个客观事物的领域对象。等于字典表。关注事物的类型。
注意:不需要特别区分是是实体还是值对象,统一称之为领域对象,因为不分清楚对开发影响也不大。

4、两种设计

①贫血模型设计

在这里插入图片描述

下单:调用完订单service下单,然后调用订单dao,订单明细dao。并且两个dao在一个service里。并且要管缓存。

思考:订单service满足单一职责么?订单管理dao,又要缓存,业务操作,不是单一职责的。

②充血模型设计:service只负责业务操作,只负责save领域对象,那么怎么save具体交给仓库。

在这里插入图片描述

注意:订单service不能单独操作订单明细只能通过聚合根导航。只能操作整体不能操作部分。

5、聚合Aggregate:把整体和部分的关系,通过整体封装起来,整体就是聚合根。

在这里插入图片描述

6、工厂:负责装配,将订单,订单明细,用户信息装配。

7、仓库:类似dao。同时要维护对象之间的关系。

在这里插入图片描述

三、领域驱动设计的使用范围:

1、适用于:事务的增删改,并且在增删改的时候涉及到的查询。

2、不适用,数据统计类。比如统计所有的订单明细预测趋势。所以就不需要遵循领域驱动了。

3、应对方法:CQRS的引入,也就是查询命令相分离。

在这里插入图片描述

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

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

相关文章

[附源码]计算机毕业设计物品捎带系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

finereport公式帮助

1 if(inarray($$$,ds1.select(销售员))<$TOPN,$$$,"其他")&#xff0c;将第 N 个销售员之后的所有销售员合并为其他&#xff0c; 2 "["((roundup($$$/$num)-1)*$num1)"~"(roundup($$$/$num)*$num)"]" 3 SQL语句用if语句&#xff0c…

HTML网页设计作业:文化网站设计——基于HTML古典中国风工艺美术网页设计(9页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

SpringBoot @InitBinder注解绑定请求参数

参考资料 springMVC之InitBinder 和 ValidatorspringMVC之InitBinder的用法1springMVC之InitBinder的用法2 目录一. 作用二. 前期准备三. Get请求 URL传值处理3.1 前台-test16.html3.2 Controller层3.3 效果四. Post请求 表单传值 自定义日期属性绑定器4.1 前台-test16.htm…

华为机试 - 任务最优调度

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 给定一个正整数数组表示待系统执行的任务列表&#xff0c;数组的每一个元素代表一个任务&#xff0c;元素的值表示该任务的类型。 请计算执行完所有任务所需的最短时间。 任务执行规则如下: 任务可…

Springboot RabbitMq源码解析之RabbitListener注解 (四)

文章目录1.RabbitListener注解介绍2.EnableRabbit和RabbitBootstrapConfiguration3.RabbitListenerAnnotationBeanPostProcessor4.对RabbitListener注解的解析5.RabbitListenerEndpointRegistrar1.RabbitListener注解介绍 RabbitListener是Springboot RabbitMq中经常用到的一个…

D-023 DVI硬件电路设计

DVI硬件电路设计1 简介1.1 连接器1.2 接口信号定义1.3 DVI的分类1.4 DVI规格2 硬件设计实战3 硬件设计要点3.1 注意事项3.2 补充说明3.3 VGA 和 DVI 优缺点1 简介 DVI(Digital Visual Interface)是一种数字视频接口&#xff0c;它是基于TMDS (Transition Minimized Differenti…

MFC列表控件的用法(基于对话框的编程)

目录 一、List Control列表控件属性 1.List Control 2.View属性 二、OnInitDialog初始化列表 1.创建List Control的变量 2.找OnInitDialog ​3. InsertColumn插入表头 4. InsertColumn设置对齐方式和列宽 5. 设置List的正文内容 ​6.循环结构创建列表 7.设置列表整行…

Windows内核--子系统(3.5)

到底什么是子系统? 子系统是用户层概念。在Windows内核之上&#xff0c;如果想要执行类UNIX应用程序&#xff0c;就是POSIX子系统&#xff0c;如果要类似OS/2环境&#xff0c;就是OS/2子系统。 如何能模拟出不同子系统呢? 一般需要子系统用户态应用程序和相关DLL支援。 对于W…

腾讯云服务器mysql安装

1.选择mysql版本 2.安装mysql源 sudo wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm 3.下载mysql.rpm源 wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm 4.安装下载好的rpm包 sudo rpm -ivh mysql80-community-rele…

PCB入门介绍与电阻电容电感类元件的创建

摘自凡亿教育 目录 一、PCB入门介绍 二、电阻电容电感类元件的创建 1.绘制电阻的原理图库 2.绘制电容的原理图库 3.绘制电感的原理图 一、PCB入门介绍 1.EDA工具 Cadence Allegro :IC-芯片设计 Mentor PADS:做消费类电子产品、手机、机顶盒、平板电脑 Altium Designer…

多线程初阶(二)

目录 前言&#xff1a; synchronized 解析 可重入和不可重入问题 解析 Java中线程安全类 死锁问题 解析 解决死锁问题 解析 内存可见性 解析 volatile关键字 解析 wait&#xff0c;notify 解析 小结&#xff1a; 前言&#xff1a; 针对上篇文章讲到的线程安全…

VSCode\\VS2017下CPP环境的配置

VSCode下C环境配置一些问题VSCode下配置C环境&#xff1a;VSCode与boost总结&#xff1a;坑位待填&#xff1a;VSCode中3个json文件的作用&#xff1a;环境配置出现的问题以及解决VS2017 配置 C环境VS配置boost库包含项目中的自定义的.hpp文件&#xff0c;.h文件VSCode下配置C环…

公众号网课题库接口

公众号网课题库接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&#xff09;…

4.验证面试高频问题整理(附答案)

目录 Q76.package如何使用 Q77.如何在子类中调用父类中的方法 Q78.bit[7:0]和byte有什么区别 Q79.类中的方法和类外的方法有什么区别 Q80.如何将类中的方法定义在类外 Q81.modport的用途是什么 Q82.struct和union的异同 Q83.$rose和posedge区别 Q84.如何在fork...join结…

[附源码]Python计算机毕业设计Django人事管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

js对象易混淆知识

js对象易混淆知识 __proto__ vs prototype __proto__和constructor属性是对象所独有的。 __proto__属性的作用就是当访问一个对象的属性时&#xff0c;如果该对象内部不存在这个属性&#xff0c;那么就会去它的__proto__属性所指向的那个对象&#xff08;父对象&#xff09;…

三菱FX5U PLSV指令-可变速度输出

三菱FX5U PLSV指令-可变速度输出,程序如下 该指令用于输出带旋转方向输出的变速脉冲。只支持CPU模块 *1 只能使用Y。 *2 输出模式为CW/CCW时&#xff0c;请指定CCW轴。使用Y时&#xff0c;只能指定本轴的SIGN输出或通用输出。 *3 不能使用T、ST、C 以上是指定FX3操作数得情况…

JVM总结全

虚拟机 HotSpot 默认虚拟机 JRockit HotSpot融合了JRockit jdk8初步融合完成 没有解释器&#xff0c;只有编译器 IBM J9 结构图 类加载子系统Q 1.类加载器 ​ 启动类加载器&#xff08;引导类加载器&#xff09;Bootstrap ClassLoader ​ 加载java 核心类库&#xff0c;…

QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器

QT FFmpeg 5.x x264 x265 SDL2 音视频播放器 使用了QT的QML设计界面,人机交互; 使用了FFmpeg 5.x x264 x265 SDL2 完成了音视频的解析到播放; 阅读了ffplay的源码,用到了ffplay的核心思想. 想熟悉ffmpeg和ffplay的朋友,都可以参考学习. 代码自取: https://github.c…