【DDD系列-2】风暴出的领域模型

为什么使用DDD​

三个问题​

1.为什么我们的系统越做越多,越来越庞大,还需要不断的重构?​

2.为什么我们的系统业务越来越复杂,服务层的代码越来越多难以维护,不敢维护?​

3.为什么一旦业务变化或者数据结构变化,我们的开发量是成倍增加的?

熵增定律​

​在一个孤立系统里,如果没有外力做功,其总混乱度(熵)会不断增大。​

​DDD的适应范围​

​DDD适用于“业务复杂”的且“需要维护和扩展”的系统​

数据模型和领域模型的比较

我该如何找出我的服务有哪些领域

三个问题​

1.如何找到系统中的 Domain(领域,子域,核心域,通用域,支撑域)​

2.如何发现系统中的 Aggregate(聚合)​

3.如何划分 Bounded Context(限界上下文)

四种方法

四色建模

时标性对象(moment-interval)

实体对象,人、地点、物(party/place/thing)

角色(role)

描述对象(description)

领域故事讲述

讲述故事(Story telling)

在领域故事Workshop中,要求领域专家使用故事作为示例来解释他完成特定工作流程所采取的步骤。​

整理故事蓝图(Story blueprint)​

根据领域专家讲述的故事来整理故事架构蓝图,人,地点,物​

补充故事细节(Complete the story)​

发生的时间,动作,要求等细节补充​

重构故事(Reconstruction story)​

按时间顺序重构故事

用例分析

事件风暴

事件风暴

什么是事件风暴​

事件风暴是一种快速探索复杂业务领域和对领域建模的实践。​

无限建模空间 无限即时贴 QA​

事件风暴的作用​

1.帮助开发人员,业务人员,设计人员,测试等项目参与者对于业务流程有一个统一的认识,这包括关键的流程,核心的业务规则,系统不同模块的使用者。​

2.帮助开发人员梳理核心的业务对象,从某种程度上来说就是就是领域对象中的聚合。​

事件风暴的流程

准备

参与人员: 组织者 领域专家(运营,产品) 项目成员(产品,技术,测试等愿意参加的项目相关人)​

物料: 便利贴 记号笔 足够长的白板 开放空间​

建立通用语言:确定统一的名词语义

确定便利贴颜色代表的意义:

关注点:重点关注这类业务的语言和行为​

  • 比如某些业务动作或行为(事件)是否会触发下一个业务动作,这个动作(事件)的输入和输出是什么?是谁(实体)发出的什么动作(命令),触发了这个动作(事件)

确定产品愿景

寻找领域事件

描述的形似为宾语+动词的过去式

寻找命令和角色​

既然有了事件必然有产生事件的对象,这就是命令。​

同样的命令也是由对象执行的,这称之为用户

寻找领域模型和聚合​

当一个完整的业务流程通过上述方式写完之后,对于每个用户,命令,事件进行组合,我们就能获得聚合了,用事件风暴的描述就是「用户在 XX 聚合对象上执行了 YY 命令,生成了 ZZ 事件」。例如「组织管理员在组织对象上执行了创建组织,生成了组织已创建事件」。即时贴的效果如下图

划分子域和限界上下文

子业务域领域模型聚合领域对象领域类型
组织组织信息组织信息组织聚合根
绑定用户能力
是否有权限能力
......
机构信息机构聚合根
......
用户信息用户聚合根
......
审计日志日志聚合根
创建日志命令
......
机构机构信息机构信息机构聚合根
创建机构命令
租户信息租户聚合根
申请信息申请单聚合根

服务的拆分与设计

事件风暴常见的问题​

1.在寻找领域事件的时候,事件粒度如何控制?​

2.对某个事件如果有歧义,该怎么办?​

3.一个命令产生了多个连锁事件,该怎么办?​

4.领域模型周围的事件过多,导致模型过大,该怎么办?​

5.命名是事件的动词吗?​

事件的粒度​

事件是领域专家关心的业务事件,所以它不能比领域专家关心的业务更细,因为那将毫无意义,也不不能太粗,否则无法确定领域能力。​

对某个事件有歧义​

应该先前面说的那样,用一个醒目的标记记下来,后面再回过头来充分讨论​

一个命令产生多个连锁事件​

这个是正常的,一个命令可能会触发一个事件或者多个事件。也有可能一个事件触发了另一个事件,只需要把它们贴在一起即可。​

领域模型周围的事件过多​

这个时候你们应该警惕了。一个领域模型不应该包含过多的领域事件,因为这会让这个模型变得很大,很复杂。​

感觉命令就是事件的动词​

很多时候其实就是这样的​

成员完全不熟悉业务怎么办?​

可以由领域专家(运营,产品)先进行业务大概流程的讲解,就像讲需求流程一样

我该如何落地我的服务

结语​

这场仗如果我们不打,就会留给后续的人去打

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 系统建模 4.2 YALMIP工具箱 4.3 CPLEX工具箱 5.完整工程文件 1.课题概述 基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真。通过YALMIP和cplex这两个工具箱,完成微电网的最优调…

visual studio导入cmake项目后打开无法删除和回车

通过Cmakelists.txt导入的项目做删除和回车无法响应,需要点击项目,然后选择配置项目就可以了

npm安装时无法访问github域名的解决方法

个人博客地址:npm安装时无法访问github域名的解决方法 | 一张假钞的真实世界 今天在用npm install的时候出现了github项目访问不了的异常: npm ERR! Error while executing: npm ERR! /bin/git ls-remote -h -t https://github.com/nhn/raphael.git np…

解锁豆瓣高清海报(三)从深度爬虫到URL构造,实现极速下载

脚本地址: 项目地址: Gazer PosterBandit_v2.py 前瞻 之前的 PosterBandit.py 是按照深度爬虫的思路一步步进入海报界面来爬取, 是个值得学习的思路, 但缺点是它爬取慢, 仍然容易碰到豆瓣的 418 错误, 本文也会指出彻底解决旧版 418 错误的方法并提高爬取速度. 现在我将介绍…

一维差分算法篇:高效处理区间加减

那么在正式介绍我们的一维差分的原理前&#xff0c;我们先来看一下一维差分所应用的一个场景&#xff0c;那么假设我们现在有一个区间为[L,R]的一个数组&#xff0c;那么我要在这个数组中的某个子区间比如[i,m] (L<i<m<R)进行一个加k值或者减去k值的一个操作&#xff…

信息收集-Web应用JS架构URL提取数据匹配Fuzz接口WebPack分析自动化

知识点&#xff1a; 1、信息收集-Web应用-JS提取分析-人工&插件&项目 2、信息收集-Web应用-JS提取分析-URL&配置&逻辑 FUZZ测试 ffuf https://github.com/ffuf/ffuf 匹配插件 Hae https://github.com/gh0stkey/HaE JS提取 JSFinder https://github.com/Threez…

Python基础语法精要

文章目录 一、Python的起源二、Python的用途三、Python的优缺点优点缺点 四、基础语法&#xff08;1&#xff09;常量和表达式&#xff08;2&#xff09;变量变量的语法&#xff08;i&#xff09;定义变量&#xff08;ii&#xff09;变量命名的规则 &#xff08;3&#xff09;变…

测试方案整理

搜索引擎放在那里&#xff1f;研发 查看问题样本或者在提取再批量入录等情况&#xff0c;一旦我没有勾选或者全选中已经批量入录的样本&#xff0c;那么在直接点击批量提取或查看问题样本的后&#xff0c;会自动默认为选择全选样本还是按照输入错误处理&#xff1f; 批量查看返…

开启对话式智能分析新纪元——Wyn商业智能 BI 携手Deepseek 驱动数据分析变革

2月18号&#xff0c;Wyn 商业智能 V8.0Update1 版本将重磅推出对话式智能分析&#xff0c;集成Deepseek R1大模型&#xff0c;通过AI技术的深度融合&#xff0c;致力于打造"会思考的BI系统"&#xff0c;让数据价值触手可及&#xff0c;助力企业实现从数据洞察到决策执…

政策赋能科技服务,CES Asia 2025将展北京科技新貌

近日&#xff0c;《北京市支持科技服务业高质量发展若干措施》正式印发&#xff0c;为首都科技服务业的腾飞注入了强大动力。 该《若干措施》提出了三方面14条政策措施。在壮大科技服务业市场主体方面&#xff0c;不仅支持科技服务业企业向平台化和综合性服务机构发展&#xf…

2024春秋杯网络安全联赛冬季赛wp

web flask 根据题目描述&#xff0c;很容易想到ssti注入 测试一下 确实存在 直接打payload {{lipsum.globals[‘os’].popen(‘cat f*’).read()}} file_copy 看到题目名字为file_copy&#xff0c; 当输入路径时会返回目标文件的大小&#xff0c; 通过返回包&#xff0c…

Mac os部署本地deepseek+open UI界面

一.部署本地deepseek 使用ollama部署&#xff0c;方便快捷。 ollama介绍&#xff1a;Ollama 是一个高效、便捷的人工智能模型服务平台&#xff0c;提供多样化的预训练模型&#xff0c;涵盖自然语言处理、计算机视觉、语音识别等领域&#xff0c;并支持模型定制和微调。其简洁…

分布式技术

一、为什么需要分布式技术&#xff1f; 1. 科学技术的发展推动下 应用和系统架构的变迁&#xff1a;单机单一架构迈向多机分布式架构 2. 数据大爆炸&#xff0c;海量数据处理场景面临问题 二、分布式系统概述 三、分布式、集群 四、负载均衡、故障转移、伸缩性 负载均衡&a…

基于ssm的超市订单管理系统

一、系统架构 前端&#xff1a;jsp | web components | jquery | css | ajax 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | tomcat 二、代码及数据 三、功能介绍 01. 登录 02. 首页 03. 订单管理 04. 供应…

尚硅谷爬虫note004

一、urllib库 1. python自带&#xff0c;无需安装 # _*_ coding : utf-8 _*_ # Time : 2025/2/11 09:39 # Author : 20250206-里奥 # File : demo14_urllib # Project : PythonProject10-14#导入urllib.request import urllib.request#使用urllib获取百度首页源码 #1.定义一…

在nodejs中使用RabbitMQ(三)Routing、Topics、Headers

示例一、Routing exchange类型direct&#xff0c;根据消息的routekey将消息直接转发到指定队列。producer.ts 生产者主要发送消息&#xff0c;consumer.ts负责接收消息&#xff0c;同时也都可以创建exchange交换机&#xff0c;创建队列&#xff0c;为队列绑定exchange&#xff…

DeepSeek大模型一键部署解决方案:全平台多机分布式推理与国产硬件优化异构计算私有部署

DeepSeek R1 走红后&#xff0c;私有部署需求也随之增长&#xff0c;各种私有部署教程层出不穷。大部分教程只是简单地使用 Ollama、LM Studio 单机运行量化蒸馏模型&#xff0c;无法满足复杂场景需求。一些操作配置也过于繁琐&#xff0c;有的需要手动下载并合并分片模型文件&…

【腾讯地图】录入经纬度功能 - 支持地图选点

目录 效果展示代码引入地图服务地址弹框中输入框 - 支持手动输入经纬度/地图选点按钮地图选点弹框组件 当前文章 - 地图功能与 https://blog.csdn.net/m0_53562074/article/details/143677335 功能类似 效果展示 代码 引入地图服务地址 public/index.html <!-- 互联网地图…

机器学习 - 大数定律、可能近似正确学习理论

一、大数定律&#xff1a; 大数定律是概率论中的一个基本定理&#xff0c;其核心思想是&#xff1a;当独立重复的随机试验次数足够大时&#xff0c;样本的平均值会趋近于该随机变量的期望值。下面从直观和数学两个角度来说明这一概念&#xff1a; 1. 直观理解 重复试验的稳定…

算法很美笔记(Java)——树(知识点)

性质 树 上面的性质因为两个结点由一条边连成 结点数目越多&#xff0c;算法复杂度越高 二叉树 结构 层次遍历&#xff08;bfs&#xff09; 利用队列&#xff0c;弹一个&#xff0c;加N个&#xff08;队列里弹出一个元素&#xff0c;就把这个元素的所有孩子加进去&#xff…