DDD重构-实体与限界上下文重构
DDD重构-实体与限界上下文重构
概述
DDD 方法需要不同类型的类元素,例如实体或值对象,并且几乎所有这些类元素都可以看作是常规的 Java 类。它们的总体结构是
Name: 类的唯一名称
Properties:属性
Methods: 控制变量的变化和添加行为
一般来说,DDD的实体、值对象和聚合根包含

把数据库表转换为Java类。包括类的名称和属性,还包括每个属性的类型,并符合DDD的模型数据库表和列的名称通常用带下划线分隔符的大写字母书写
类
用户需求决定一个类应该是实体、值对象、聚合根还是服务,它为给定的元素提供了或多或少的功能。实体和聚合根需要一个唯一的属性,该属性也是表中的主键列。稍后也可以更改此类型
然而,重新变回值对象或服务会消除唯一的标识。除此之外,聚合根与 Entity 非常相似。它可以被视为数据库中多对多关系的关联表。这里的情况也是为了使关系更容易。聚合根的另一部分是为服务提供方法。服务只包含没有任何属性的方法。服务和聚合根应该提供有界上下文中几乎所有的公共方法和不断变化的对象
添加新类: 如果决定从头创建一个新模型,也可能是这种情况。可以创建三种类型的新元素 实体、 值对象、 聚合根或 服务
属性
所有的属性都必须检查。数据库模型中的类型可能与用户期望的不同。NUMBER 就是这种类型的一个例子,因为它既可以是浮点数,也可以是整数。除了类型,名称也可以改变。此外,还可以添加其他属性或删除其中的一些属性
方法
为类声明简单的CRUD(创建、读取、更新、删除)方法,确保封装和对属性的访问

多数方法都应该在包中或受保护的可见性中,因为聚合根和服务应该向外部提供功能
从数据库中,只加载属性、属性与其他类之间的关系。这就是为什么用户可以声明元素的新方法,包括参数。
限界上下文
有元素都必须在至少一个有界的上下文中组织。这意味着通过避免对其他有界上下文元素的过多依赖来封装类元素。对于DDD,它有助于避免任何修改后不必要的副作用。首先,所有元素都可以放在相同的有限上下文中,但是用户应该考虑这种分离。可能是特定元素自有方法必须在多个有界上下文中使用,应通过在两个或多个有界上下文中复制同一元素来避免复制。因此,它们应该被放入一个共享的内核中
还应该可以将一个元素移动到另一个有界上下文,甚至可以复制该元素以在不同版本中使用。比如用户类。在“预约”有界上下文中,只需知道名称和电子邮件地址。但是,对于支付上下文中需要诸如信用卡号码之类的数据。如果在几乎所有有界上下文中都需要某些数据,那么这个类可能应该移动到共享内核。共享内核存储不同有界上下文的多个元素使用的所有类。它可以被看作是模型的核心部分。另一方面,核心类对更改的灵活性较差,因为它们可能在软件的其他几个地方使用。
关系
关系意味着属性使用关系图中另一个元素的类型。应该尽量减少应用程序之间的关系,并与服务一起使用。
除此之外,关于多样性还有两种关系。通常,它使用一对多关系,这意味着在另一个类中只使用一个元素,但有几个决定要使用哪个元素。另一种关系类型产生集合(例如列表、数组),其中多个元素存储在起始类的属性中。这是一种多对多的关系。可以使用多个元素,并且仍然可以决定将哪个元素添加到此集合中

通用语言
DDD 的另一个关键是在使用模型的每个项目团队之间创建一种统一的语言。然而,支持它的创建和开发是很难处理的。不过,每个元素都可以增加注释。它确保为每个元素保留关于通用语言的这些注释。
通常,通用语言已经在整个项目团队中确定,例如,为什么用这个名称调用这个类,或者为什么有这些属性。共享内核应该具有更高的优先级,因为这里的更改可能会导致比其他有界上下文更多的更改

验证
为了进行验证,必须考虑名称、类型和关系。
现界上下文的每个名称及其内的所有元素都必须是唯一的。这对于包名称来说更为重要,因为两个同名的包也被认为是相等的。如果名称重复,则必须用红色标记上下文名称或包名称,并使用工具提示文本告诉用户验证错误
必须检查所有类,包括实体、值对象、聚合根和服务。这意味着每个类的名称及其内容。名称在每个包中必须是唯一的,并且所有字符都必须有效。这应该符合Java中命名变量和类的规则。例如,在不使用关键字的情况下,只能使用字母数字字母,每个变量都必须以字母开头。可以用正则表达式检查它,并检查名称是否不等于关键字
还要检查关系的起点和终点。如果在多个访问非聚合根类的有界上下文中绘制关系线,则将被视为违规错误。应该使用服务。然而,这些关系只显示了属性的依赖关系,没有显示方法的关系。这就是为什么这里不会显示与服务的关系。
延伸阅读
-
DDD之领域及领域划分
-
一图了解领域驱动设计全过程
-
落地DDD的方法
-
CPU占用很高排查方案-CSDN博客
-
TOGAF业务架构-CSDN博客
相关文章:
DDD重构-实体与限界上下文重构
DDD重构-实体与限界上下文重构 概述 DDD 方法需要不同类型的类元素,例如实体或值对象,并且几乎所有这些类元素都可以看作是常规的 Java 类。它们的总体结构是 Name: 类的唯一名称 Properties:属性 Methods: 控制变量的变化和添加行为 一…...
MATLAB Simulink (二)高速跳频通信系统
MATLAB & Simulink (二)高速跳频通信系统 写在前面1 系统原理1.1 扩频通信系统理论基础1.1.1 基本原理1.1.2 扩频通信系统处理增益和干扰容限1.1.3 各种干扰模式下抗干扰性能 1.2 高速跳频通信系统理论基础1.2.1 基本原理1.2.2 物理模型 2 方案设计2…...
智能合约分享
智能合约练习 一、solidity初学者经典示例代码: 1.存储和检索数据: // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // 声明 Solidity 编译器版本// 定义一个名为 SimpleStorage 的合约 contract SimpleStorage {// 声明一个公共状态变量 d…...
【MR开发】在Pico设备上接入MRTK3(二)——在Unity中配置Pico SDK
上一篇文档介绍了 【MR开发】在Pico设备上接入MRTK3(一)在Unity中导入MRTK3依赖 下面将介绍在Unity中导入Pcio SDK的具体步骤 在Unity中导入Pico SDK 当前Pico SDK版本 Unity交互SDK git仓库: https://github.com/Pico-Developer/PICO-Un…...
【Java】探秘正则表达式:深度解析与精妙运用
目录 引言 一、基本概念 1.1 元字符 1.2 预定义字符类 1.3 边界匹配符 1.4 数量标识符 1.5 捕获与非捕获分组 二、Java中的正则表达式支持 三、正则表达式的使用示例 3.1 匹配字符串 3.2 替换字符串 3.3 分割字符串 3.4 使用Pattern和Matcher 3.5 捕获组和后向…...
2.6.ReactOS系统中从内核中发起系统调用
2.6.ReactOS系统中从内核中发起系统调用 2.6.ReactOS系统中从内核中发起系统调用 文章目录 2.6.ReactOS系统中从内核中发起系统调用前言 前言 上面我们已经可以看到用户空间(R3)进行系统调用的全过程即两种方法的具体实现。 系统调用一般时从R3发起的…...
chat_gpt回答:python获取当前utc时间,将xml里时间tag里的值修改为当前时间
你可以使用 lxml 库来读取、修改 XML 文件中的某个标签的值,并将其保存为新的 XML 文件。以下是一个示例代码,展示如何获取当前的 UTC 时间,并将 XML 文件中的某个时间标签修改为当前时间。 示例代码: from lxml import etree f…...
机器学习-语言分析
机器学习 1.1人工智能概述 1.2.1 机器学习与人工智能,深度学习 深度学习->机器学习->人工智能; 人工智能:1950,实现自动下棋,人机对弈,达特茅斯会议->人工智能的起点,1956年8月。克劳…...
Oracle 常见索引扫描方式概述,哪种索引扫描最快!
一.常见的索引扫描方式 INDEX RANGE SCANINDEX FAST FULL SCANINDEX FULL SCAN(MIN/MAX)INDEX FULL SCAN 二.分别模拟使用这些索引的场景 1.INDEX RANGE SCAN create table t1 as select rownum as id, rownum/2 as id2 from dual connect by level<500000; create inde…...
字符串(3)_二进制求和_高精度加法
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 字符串(3)_二进制求和_高精度加法 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目…...
《神经网络:智能时代的核心技术》
《神经网络:智能时代的核心技术》 一、神经网络的诞生与发展二、神经网络的结构与工作原理(一)神经元模型(二)神经网络训练过程 三、神经网络的应用领域(一)信息领域(二)…...
pdf内容三张以上转图片,使用spire.pdf.free
一、依赖 <spire.pdf.free.version>9.13.0</spire.pdf.free.version><itextpdf.version>5.5.13</itextpdf.version><dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf.free</artifactId><version>$…...
游戏、软件、开源项目和资讯
游戏 标题链接【白嫖正版游戏】IT之家喜加一website 软件 标题链接【白嫖正版软件】反斗限免website 开源项目 标题链接【Luxirty Search】基于Google搜索结果,屏蔽内容农场Github【Video2X】图片/视频超分工具Github 新闻资讯 标题链接分享10个 Claude 3.5 …...
Acrel-1000变电站综合自动化系统及微机在化工企业中的应用方案
文:安科瑞郑桐 摘要:大型化工企业供配电具有的集约型特点,化工企业内35kV变电站和10kV变电所数量大、分布广,对于老的大多大型及中型化工企业而言,其变电站或变电所内高压电气设备为旧式继电保护装置,可靠…...
[Linux] CentOS7替换yum源为阿里云并安装gcc详细过程(附下载链接)
前言 CentOS7替换yum源为阿里云 yum是CentOS中的一种软件管理器,通过yum安装软件,可以自动解决包依赖的问题,免去手工安装依赖包的麻烦。 yum使用了一个中心仓库来记录和管理软件的依赖关系,默认为mirrorlist.centos.org…...
在Java中创建多线程的三种方式
多线程的创建和启动方式 在Java中,创建多线程主要有以下三种方式: 继承Thread类实现Runnable接口使用Callable接口与Future 下面是这三种方式的简单示例,以及如何在主类中启动它们。 1. 继承Thread类 class MyThread extends Thread {Ov…...
洛谷 AT_abc374_c [ABC374C] Separated Lunch 题解
题目大意 KEYENCE 总部有 N N N 个部门,第 i i i 个部门有 K i K_i Ki 个人。 现在要把所有部门分为 AB 两组,求这两组中人数多的那一组的人数最少为多少。 题目分析 设这些部门共有 x x x 个人,则较多的组的人数肯定大于等于 ⌈ …...
力扣2528.最大化城市的最小电量
力扣2528.最大化城市的最小电量 题目解析及思路 题目要求找到所有城市电量最小值的最大 电量为给城市供电的发电站数量 因此每座城市的电量可以用一段区间和表示,即前缀和 二分最低电量时 如果当前城市电量不够,贪心的想发电站建立的位置,应该是在mi…...
【zookeeper】集群配置
zookeeper 数据结构 zookeeper数据模型结构,就和Linux的文件系统类型,看起来是一颗树,每个节点称为一个znode.每一个Znode默认的存储1MB的数据,每个Znode都有唯一标识,可以通过命令显示节点的信息每当节点有数据变化…...
YOLO11 目标检测 | 导出ONNX模型 | ONNX模型推理
本文分享YOLO11中,从xxx.pt权重文件转为.onnx文件,然后使用.onnx文件,进行目标检测任务的模型推理。 用ONNX模型推理,便于算法到开发板或芯片的部署。 备注:本文是使用Python,编写ONNX模型推理代码的 目…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

