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

DDD重构-实体与限界上下文重构

DDD重构-实体与限界上下文重构

概述

     DDD 方法需要不同类型的类元素,例如实体或值对象,并且几乎所有这些类元素都可以看作是常规的 Java 类。它们的总体结构是

Name: 类的唯一名称

Properties:属性

Methods: 控制变量的变化和添加行为

一般来说,DDD的实体值对象聚合根包含

      把数据库表转换为Java类。包括类的名称和属性,还包括每个属性的类型,并符合DDD的模型数据库表和列的名称通常用带下划线分隔符的大写字母书写

用户需求决定一个类应该是实体、值对象、聚合根还是服务,它为给定的元素提供了或多或少的功能。实体和聚合根需要一个唯一的属性,该属性也是表中的主键列。稍后也可以更改此类型

然而,重新变回值对象或服务会消除唯一的标识。除此之外,聚合根与 Entity 非常相似。它可以被视为数据库中多对多关系的关联表。这里的情况也是为了使关系更容易。聚合根的另一部分是为服务提供方法。服务只包含没有任何属性的方法。服务和聚合根应该提供有界上下文中几乎所有的公共方法和不断变化的对象

添加新类: 如果决定从头创建一个新模型,也可能是这种情况。可以创建三种类型的新元素 实体、 值对象、 聚合根或 服务

属性

      所有的属性都必须检查。数据库模型中的类型可能与用户期望的不同。NUMBER 就是这种类型的一个例子,因为它既可以是浮点数,也可以是整数。除了类型,名称也可以改变。此外,还可以添加其他属性或删除其中的一些属性

方法

为类声明简单的CRUD(创建、读取、更新、删除)方法,确保封装和对属性的访问

    多数方法都应该在包中或受保护的可见性中,因为聚合根和服务应该向外部提供功能

    从数据库中,只加载属性、属性与其他类之间的关系。这就是为什么用户可以声明元素的新方法,包括参数。

限界上下文

     有元素都必须在至少一个有界的上下文中组织。这意味着通过避免对其他有界上下文元素的过多依赖来封装类元素。对于DDD,它有助于避免任何修改后不必要的副作用。首先,所有元素都可以放在相同的有限上下文中,但是用户应该考虑这种分离。可能是特定元素自有方法必须在多个有界上下文中使用,应通过在两个或多个有界上下文中复制同一元素来避免复制。因此,它们应该被放入一个共享的内核中

       还应该可以将一个元素移动到另一个有界上下文,甚至可以复制该元素以在不同版本中使用。比如用户类。在“预约”有界上下文中,只需知道名称和电子邮件地址。但是,对于支付上下文中需要诸如信用卡号码之类的数据。如果在几乎所有有界上下文中都需要某些数据,那么这个类可能应该移动到共享内核。共享内核存储不同有界上下文的多个元素使用的所有类。它可以被看作是模型的核心部分。另一方面,核心类对更改的灵活性较差,因为它们可能在软件的其他几个地方使用。

关系

      关系意味着属性使用关系图中另一个元素的类型。应该尽量减少应用程序之间的关系,并与服务一起使用。

      除此之外,关于多样性还有两种关系。通常,它使用一对多关系,这意味着在另一个类中只使用一个元素,但有几个决定要使用哪个元素。另一种关系类型产生集合(例如列表、数组),其中多个元素存储在起始类的属性中。这是一种多对多的关系。可以使用多个元素,并且仍然可以决定将哪个元素添加到此集合中

通用语言

       DDD 的另一个关键是在使用模型的每个项目团队之间创建一种统一的语言。然而,支持它的创建和开发是很难处理的。不过,每个元素都可以增加注释。它确保为每个元素保留关于通用语言的这些注释。

         通常,通用语言已经在整个项目团队中确定,例如,为什么用这个名称调用这个类,或者为什么有这些属性。共享内核应该具有更高的优先级,因为这里的更改可能会导致比其他有界上下文更多的更改

验证

    为了进行验证,必须考虑名称、类型和关系。

    现界上下文的每个名称及其内的所有元素都必须是唯一的。这对于包名称来说更为重要,因为两个同名的包也被认为是相等的。如果名称重复,则必须用红色标记上下文名称或包名称,并使用工具提示文本告诉用户验证错误

     必须检查所有类,包括实体、值对象、聚合根和服务。这意味着每个类的名称及其内容。名称在每个包中必须是唯一的,并且所有字符都必须有效。这应该符合Java中命名变量和类的规则。例如,在不使用关键字的情况下,只能使用字母数字字母,每个变量都必须以字母开头。可以用正则表达式检查它,并检查名称是否不等于关键字

     还要检查关系的起点和终点。如果在多个访问非聚合根类的有界上下文中绘制关系线,则将被视为违规错误。应该使用服务。然而,这些关系只显示了属性的依赖关系,没有显示方法的关系。这就是为什么这里不会显示与服务的关系。


延伸阅读

  1. DDD之领域及领域划分

  2. 一图了解领域驱动设计全过程

  3. 落地DDD的方法

  4. CPU占用很高排查方案-CSDN博客

  5. 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)_二进制求和_高精度加法

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 字符串(3)_二进制求和_高精度加法 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…...

《神经网络:智能时代的核心技术》

《神经网络&#xff1a;智能时代的核心技术》 一、神经网络的诞生与发展二、神经网络的结构与工作原理&#xff08;一&#xff09;神经元模型&#xff08;二&#xff09;神经网络训练过程 三、神经网络的应用领域&#xff08;一&#xff09;信息领域&#xff08;二&#xff09;…...

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搜索结果&#xff0c;屏蔽内容农场Github【Video2X】图片/视频超分工具Github 新闻资讯 标题链接分享10个 Claude 3.5 …...

Acrel-1000变电站综合自动化系统及微机在化工企业中的应用方案

文&#xff1a;安科瑞郑桐 摘要&#xff1a;大型化工企业供配电具有的集约型特点&#xff0c;化工企业内35kV变电站和10kV变电所数量大、分布广&#xff0c;对于老的大多大型及中型化工企业而言&#xff0c;其变电站或变电所内高压电气设备为旧式继电保护装置&#xff0c;可靠…...

[Linux] CentOS7替换yum源为阿里云并安装gcc详细过程(附下载链接)

前言 CentOS7替换yum源为阿里云 yum是CentOS中的一种软件管理器&#xff0c;通过yum安装软件&#xff0c;可以自动解决包依赖的问题&#xff0c;免去手工安装依赖包的麻烦。 yum使用了一个中心仓库来记录和管理软件的依赖关系&#xff0c;默认为mirrorlist.centos.org&#xf…...

在Java中创建多线程的三种方式

多线程的创建和启动方式 在Java中&#xff0c;创建多线程主要有以下三种方式&#xff1a; 继承Thread类实现Runnable接口使用Callable接口与Future 下面是这三种方式的简单示例&#xff0c;以及如何在主类中启动它们。 1. 继承Thread类 class MyThread extends Thread {Ov…...

洛谷 AT_abc374_c [ABC374C] Separated Lunch 题解

题目大意 KEYENCE 总部有 N N N 个部门&#xff0c;第 i i i 个部门有 K i K_i Ki​ 个人。 现在要把所有部门分为 AB 两组&#xff0c;求这两组中人数多的那一组的人数最少为多少。 题目分析 设这些部门共有 x x x 个人&#xff0c;则较多的组的人数肯定大于等于 ⌈ …...

力扣2528.最大化城市的最小电量

力扣2528.最大化城市的最小电量 题目解析及思路 题目要求找到所有城市电量最小值的最大 电量为给城市供电的发电站数量 因此每座城市的电量可以用一段区间和表示&#xff0c;即前缀和 二分最低电量时 如果当前城市电量不够,贪心的想发电站建立的位置&#xff0c;应该是在mi…...

【zookeeper】集群配置

zookeeper 数据结构 zookeeper数据模型结构&#xff0c;就和Linux的文件系统类型&#xff0c;看起来是一颗树&#xff0c;每个节点称为一个znode.每一个Znode默认的存储1MB的数据&#xff0c;每个Znode都有唯一标识&#xff0c;可以通过命令显示节点的信息每当节点有数据变化…...

YOLO11 目标检测 | 导出ONNX模型 | ONNX模型推理

本文分享YOLO11中&#xff0c;从xxx.pt权重文件转为.onnx文件&#xff0c;然后使用.onnx文件&#xff0c;进行目标检测任务的模型推理。 用ONNX模型推理&#xff0c;便于算法到开发板或芯片的部署。 备注&#xff1a;本文是使用Python&#xff0c;编写ONNX模型推理代码的 目…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...