当前位置: 首页 > news >正文

25.DDD数量关系

学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid=1940048&ctype=0

文章目录

  • 关系型数据库的数量关系
  • 领域模型的数量关系
  • 实现聚合数量关系
    • 聚合内
    • 聚合间
    • 具体说明
      • 代码
  • 数量关系是本质吗?
    • 领域对象之间的数量关系是不变的吗?
    • 为什么领域对象之间存在这样的数量关系?

关系型数据库的数量关系

在设计关系型数据库的时候,我们会设计很多的表,每个表都是一个实体。表和表之间或者说实体和实体之间数量可能会存在某种约束,比如一对一、一对多、多对多。

领域模型的数量关系

在面对象的设计的时候,对象和对象之间也会存在这种数量关系。因为在领域驱动设计中,是采用面向对象的方法设计领域模型,所以领域模型中也会具有这种数量关系,而且这个数量关系很重要。不过我们会更关心它是如何产生的这种数量关系,而不只是关心它们之间的数量关系是什么。

实现聚合数量关系

在实现的时候,聚合内和聚合间的数量关系是存在很大差别的

聚合内

  • 导航采用对象引用实现。因为在同一个聚合内,所以需要同时载入内存,同时持久化。
  • 尽量隐藏聚合内部对象的数量关系
    通过定义函数,维护数量关系,不要直接把暴露出去让外部操作

聚合间

  • 导航采用持有id实现。避免载入A聚合时导致载入了B聚合。

具体说明

up主视频里说的有点抽象了,我这里画了张图具体说明一下。如下图,聚合内会有多个对象,也就是图中的聚合根、实体、值对象。订单作为聚合根,直接持有和它在同一个聚合内的对象引用。而订单和商品作为不同的聚合,订单持有的是商品聚合根的唯一标识,比如商品id。
在这里插入图片描述

代码

@Data
public class Order {private Long orderId; // 订单id// 聚合内private List<OrderItem> orderItemList;private Money money;private Address address;// 聚合间private List<Long> productIdList; // 商品id列表// 通过构造函数,使得必要的对象可能同时载入内存public Order(Long orderId, Money money) {this.orderId = orderId;this.money = money;}// 通过定义函数,维护数量关系,不要直接把暴露出去让外部操作public void addOrderItem(List<OrderItem> orderItems) {if (orderItems.size() > 10) {throw new RuntimeException();}//  ...//  ....}
}@Data
public class Product {// 聚合内private List<ProductDetail> productDetailList;private Color color;private Comment comment;private Size size;
}

数量关系是本质吗?

领域对象之间的数量关系是不变的吗?

答案显然是否,它们之间的关系会随着业务场景发生变化。比如一个订单刚开始对应一次支付,但随着业务的发展,可能会变成一个订单可以支持多次支付,也有可能变成多个订单可以合并,被一次支付掉。

为什么领域对象之间存在这样的数量关系?

数量关系不是本质,功能才是。领域之间之所以是存在这样的数量关系,是因为这样的数量关系为了实现某个功能而特意设计的。当功能变更的时候,数量关系就可能发生变化。
所以我们在设计领域模型的时候,不会一上来就去谈两个领域对象之间的数量关系,我们更关心在哪个动作、哪个命令执行的时候,它需要在这个时刻从一个领域对象,找到另外一个领域象。怎么找?找了多少个?是关心这个具体场景下的这些问题。所以我们是以业务功能作为切入点的。如果在这个功能需要,我们就把这个关系数量加上;如果这个功能不需要,我们就不加,因为加了没有意义。不仅是数量关系,聚合内持有的哪些数据也是由功能决定的。领域对象之间数量关系是一个结果,它可以帮助别人理解领域模型,但它不是领域对象之间存在这样的数量关系的原因。
这里我加个具体的例子,比如一个订单可能对应多次支付记录,如果没有功能需要使订单和支付关联起来,我们不需要维护二者的关系,不需要在订单中持有支付记录的引用或者id列表。但是如果新加了一个功能,比如需要支持查看某个订单下关联的支付记录,这样二者就发生了联系,那么这时候我们就需要加上这个数量关系,让订单持有支付记录的引用或者id列表。

可以看到,领域对象是否存在这样的数量关系取决于功能是否需要

相关文章:

25.DDD数量关系

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 关系型数据库的数量关系领域模型的数量关系实现聚合数量关系聚合内聚合间具体说明代码 数量关系是本质吗&#xff1f;领域对象之…...

Linux应用开发————线程池

线程池 定义&#xff1a;简单来说&#xff0c;就是存放多个线程的池子。当创建线程池时&#xff0c;就给池中存放一些线程&#xff0c;如果有任务要执行&#xff0c;就从池中取出一个线程执行任务&#xff0c;依次类推&#xff1b;当所有线程都在执行任务时&#xff0c;其他任务…...

Spring Boot 集成阿里云OSS 完成文件上传下载

前言&#xff1a; 文件上传下载在项目开发中是一个非常常见的业务场景&#xff0c;在云服务上还没有兴起的时候&#xff0c;一般来说都会把文件单独存放到文件服务器上&#xff0c;随着云服务的兴起&#xff0c;各类云服务厂商都提供了 OSS 服务&#xff0c;本篇我们分享 Spri…...

使用ERA5数据绘制风向玫瑰图的简易流程

使用ERA5数据绘制风向玫瑰图的简易流程 今天需要做一个2017年-2023年的平均风向的统计,做一个风向玫瑰图&#xff0c;想到的还是高分辨率的ERA5land的数据&#xff08;0.1分辨率&#xff0c;逐小时分辨率&#xff0c;1950年至今&#xff09;。 风向&#xff0c;我分为了16个&…...

测试脚本并发多进程:pytest-xdist用法

参考&#xff1a;https://www.cnblogs.com/poloyy/p/12694861.html pytest-xdist详解&#xff1a; https://www.cnblogs.com/poloyy/p/14708825.html 总 https://www.cnblogs.com/poloyy/category/1690628.html...

数据可视化的Python实现

一、GDELT介绍 GDELT ( www.gdeltproject.org ) 每时每刻监控着每个国家的几乎每个角落的 100 多种语言的新闻媒体 -- 印刷的、广播的和web 形式的&#xff0c;识别人员、位置、组织、数量、主题、数据源、情绪、报价、图片和每秒都在推动全球社会的事件&#xff0c;GDELT 为全…...

【Linux系列】Linux 系统配置文件详解:`/etc/profile`、`~/.bashrc` 和 `~/.bash_profile`

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

uni-app实现小程序、H5图片轮播预览、双指缩放、双击放大、单击还原、滑动切换功能

前言 这次的标题有点长&#xff0c;主要是想要表述的功能点有点多&#xff1b; 简单做一下需求描述 产品要求在商品详情页的头部轮播图部分&#xff0c;可以单击预览大图&#xff0c;同时在预览界面可以双指放大缩小图片并且可以移动查看图片&#xff0c;双击放大&#xff0…...

游戏引擎学习第45天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们刚刚开始研究运动方程&#xff0c;展示了如何处理当人物遇到障碍物时的情况。有一种版本是角色会从障碍物上反弹&#xff0c;而另一版本是角色会完全停下来。这种方式感觉不太自然&#xff0c;因为在游戏中&#xff0c;…...

electron常用方法

一&#xff0c;,electron设置去除顶部导航栏和menu 1&#xff0c;electron项目 在创建BrowserWindow实例的main.js页面添加frame&#xff1a;false属性 2&#xff0c;electron-vue项目 在src/main/index.js文件下找到创建窗口的方法&#xff08;createWindow&#xff09;&…...

【Spark】Spark Join类型及Join实现方式

如果觉得这篇文章对您有帮助&#xff0c;别忘了点赞、分享或关注哦&#xff01;您的一点小小支持&#xff0c;不仅能帮助更多人找到有价值的内容&#xff0c;还能鼓励我持续分享更多精彩的技术文章。感谢您的支持&#xff0c;让我们一起在技术的世界中不断进步&#xff01; Sp…...

meta llama 大模型一个基础语言模型的集合

LLaMA 是一个基础语言模型的集合&#xff0c;参数范围从 7B 到 65B。我们在数万亿个 Token 上训练我们的模型&#xff0c;并表明可以专门使用公开可用的数据集来训练最先进的模型&#xff0c;而无需诉诸专有的和无法访问的数据集。特别是&#xff0c;LLaMA-13B 在大多数基准测试…...

JAVA爬虫获取1688关键词接口

以下是使用Java爬虫获取1688关键词接口的详细步骤和示例代码&#xff1a; 一、获取API接口访问权限 要使用1688关键词接口&#xff0c;首先需要获取API的使用权限&#xff0c;并了解接口规范。以下是获取API接口的详细步骤&#xff1a; 注册账号&#xff1a;在1688平台注册一…...

操作系统——内存管理

1、什么是虚拟内存&#xff1f;它是如何实现的&#xff1f;虚拟内存与物理内存之间有什么关系&#xff1f; 虚拟内存是操作系统提供的一种内存管理机制&#xff0c;它使程序认为自己拥有连续的内存空间&#xff0c;但实际上内存可能被分散存储在物理内存和磁盘交换空间中。 虚…...

android studio 模拟器不能联网?

模拟器路径&#xff1a; C:\Users\Administrator\AppData\Local\Android\Sdk\emulator\emulator.exe.关闭所有AVD设备实例 导航至&#xff1a; C:\Users\userName\AppData\Local\Android\Sdk\emulator查看模拟器名称 AdministratorDESKTOP-6JB1OGC MINGW64 ~/AppData/Local/…...

CTF-WEB: 目录穿越与模板注入 [第一届国城杯 Ez_Gallery ] 赛后学习笔记

step1 验证码处存在逻辑漏洞,只要不申请刷新验证码就一直有效 字典爆破得到 admin:123456 step2 /info?file../../../proc/self/cmdline获得 python/app/app.py经尝试,读取存在的目录时会返回 A server error occurred. Please contact the administrator./info?file.…...

数据结构6.4——归并排序

基本思想&#xff1a; 归并排序是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法的一个非常典型的应用。将已有的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&#xff0c;再使子序列段间有序。若将两个有序表合并成一个…...

【html 常用MIME类型列表】

本表仅列出了常用的MIME类型&#xff0c;完整列表参考文档。 浏览器通常使用 MIME 类型&#xff08;而不是文件扩展名&#xff09;来确定如何处理 URL&#xff0c;因此 Web 服务器在响应头中添加正确的 MIME 类型非常重要。 如果配置不正确&#xff0c;浏览器可能会曲解文件内容…...

Linux之vim编辑器

vi编辑器是所有Unix及linux系统下标准的编辑器&#xff0c;类似于Windows系统下的记事本。很多软件默认使用vi作为他们编辑的接口。vim是进阶版的vi&#xff0c;vim可以视为一种程序编辑器。 前言&#xff1a; 1.文件准备 复制 /etc/passwd文件到自己的目录下&#xff08;不…...

【工具介绍】可以批量查看LableMe标注的图像文件信息~

在图像处理和计算机视觉领域&#xff0c;LabelMe是一个广泛使用的图像标注工具&#xff0c;它帮助我们对图像中的物体进行精确的标注。但是&#xff0c;当标注完成后&#xff0c;我们常常需要一个工具来批量查看这些标注信息。 今天&#xff0c;我要介绍的这款exe程序&#xf…...

Unity QFramework 简介

目录 什么是MVC模式&#xff1f; QFramework 架构提供了 Model 的概念 QFramework 架构引入 Command 的方式 QFramework 架构引入 Event事件机制 四个层&#xff1a;表现层、系统层、数据层、工具层 委托和回调函数的关系 命令和事件的区别 工具篇 QFramework整体基于M…...

[git每日一句]your branch is behind ‘origin/master‘

当 Git 提示 "your branch is behind origin/master" 时&#xff0c;意思是&#xff1a; 你的本地分支落后于远程仓库&#xff08;origin&#xff09;的 master 分支 即&#xff1a;远程仓库有新的提交&#xff0c;而你的本地分支尚未同步这些更新。 如何解决&…...

设备制造行业项目管理难点解析,如何有效解决?

在设备制造行业&#xff0c;项目管理是企业运营的核心环节&#xff0c;直接影响项目交付效率、成本控制和盈利能力。然而&#xff0c;由于行业特性复杂、项目周期长、涉及部门多&#xff0c;企业在实际操作中常常面临诸多管理痛点。金众诚工程项目管理系统&#xff0c;依托金蝶…...

AWTK 嵌入式Linux平台实现多点触控缩放旋转以及触点丢点问题解决

前言 最近涉及海图的功能交互&#xff0c;多点触摸又开始找麻烦。 在PC/Web平台awtk是通过底层的sdl2库来实现多点触摸&#xff0c;但是在嵌入式Linux平台&#xff0c;可能是考虑到性能原因&#xff0c;awtk并没有采用sdl库来做事件处理&#xff0c;而是自己实现一个awtk-lin…...

【清晰教程】查看和修改Git配置情况

目录 查看安装版本 查看特定配置 查看全局配置 查看本地仓库配置 设置或修改配置 查看安装版本 打开命令行工具&#xff0c;通过version命令检查Git版本号。 git --version 如果显示出 Git 的版本号&#xff0c;说明 Git 已经成功安装。 查看特定配置 如果想要查看特定…...

php 中使用MQTT

MQTT 是一种基于发布/订阅模式的 轻量级物联网消息传输协议 &#xff0c;可以用极少的代码和带宽为联网设备提供实时可靠的消息服务&#xff0c;它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。 本文主要介绍如何在 PHP项目中使用composer require php-m…...

Java-代码段-http接口调用自身服务中的其他http接口(mock)-并建立socket连接发送和接收报文实例

最新版本更新 https://code.jiangjiesheng.cn/article/367?fromcsdn 推荐 《高并发 & 微服务 & 性能调优实战案例100讲 源码下载》 1. controller入口 ApiOperation("模拟平台端现场机socket交互过程,需要Authorization")PostMapping(path "/testS…...

iOS 使用CocoaPods 添加Alamofire 提示错误的问题

Sandbox: rsync(59817) deny(1) file-write-create /Users/aaa/Library/Developer/Xcode/DerivedData/myApp-bpwnzikesjzmbadkbokxllvexrrl/Build/Products/Debug-iphoneos/myApp.app/Frameworks/Alamofire.framework/Alamofire.bundle把这个改成 no 2 设置配置文件...

Mac 每日磁盘写入量异常高

为什么你的 Mac 每日磁盘写入量异常高&#xff1f;深度分析与解决方案 文章目录 为什么你的 Mac 每日磁盘写入量异常高&#xff1f;深度分析与解决方案&#x1f50d; 问题现象&#x1f575;️‍♂️ 六大罪魁祸首1. 系统日志疯狂输出典型场景​&#xff1a; 2. 浏览器缓存3. Ti…...

《高等数学》(同济大学·第7版) 的 详细章节目录

上册 第一章 函数与极限 映射与函数 数列的极限 函数的极限 无穷小与无穷大 极限运算法则 极限存在准则 两个重要极限 无穷小的比较 函数的连续性与间断点 连续函数的运算与初等函数的连续性 闭区间上连续函数的性质 &#x1f539; 重点节&#xff1a; 2-3&#xff…...