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

news2024/10/19 11:24:37

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博客

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

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

相关文章

MySQL中 truncate、drop和delete的区别

MySQL中 truncate、drop和delete区别 truncate 执行速度快,删除所有数据,但是保留表结构不记录日志事务不安全,不能回滚可重置自增主键计数器 drop 执行速度较快,删除整张表数据和结构不记录日志事务不安全,不能回…

JavaWeb——Maven(3/8):配置Maven环境(当前工程,全局),创建Maven项目

目录 配置Maven环境 当前工程 全局 创建Maven项目 配置Maven环境 当前工程 选择 IDEA中 File --> Settings --> Build,Execution,Deployment --> Build Tools --> Maven 设置 IDEA 使用本地安装的 Maven,并修改配置文件及本地仓库路径 首先在 IDE…

QtCreator14调试Qt5.15出现 Launching Debugger 错误

1、问题描述 使用QtCreator14调试程序,Launching Debugger 显示红色,无法进入调试模式。 故障现象如下: 使能Debugger Log窗口,显示: 325^error,msg"Error while executing Python code." 不过&#xff…

【软件推荐】信创终端上通过kshutdown实现定时关机 _ 统信 _ 麒麟 _ 方德

往期好文:【功能介绍】麒麟2403支持配置任务栏上的图标“从不合并”啦! Hello,大家好啊!今天给大家带来一篇关于如何在信创终端系统上通过kshutdown实现定时关机的文章。在日常使用中,定时关机是一个非常实用的功能&am…

Leetcode 841. 钥匙和房间

1.题目基本信息 1.1.题目描述 有 n 个房间,房间按从 0 到 n – 1 编号。最初,除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。 当你进入一个房间,你可能会在…

uniapp 微信小程序分包操作

1. 在项目根目录创建一个新的目录,名称为分包名称 2. 打开manifest.json,选择源码视图,加入以下代码 "optimization" : {"subPackages" : true } 3. 在pages.json中,pages后面添加分包代码 "subPackag…

tkinter Listbox 列表框实现多列对齐排列并绑定下拉框和滚动条

from tkinter import * from tkinter import ttk, Button, Canvas, Listbox, Entry, LabelFrame, IntVar, Checkbutton, messageboximport win32print root Tk() root.title("tkinter Listbox 列表框实现多列对齐排列") root.geometry(550x450)def callback2(t, eve…

k8s-对命名空间资源配额

对k8s命名空间限制的方法有很多种,今天来演示一下很常用的一种 用的k8s对象就是ResourceQuota 一:创建命名空间 kubectl create ns test #namespace命名空间可以简写成ns 二: 对命名空间进行限制 创建resourcequota vim resourcequ…

Http请求转发服务器实现

Http请求转发服务器实现 需求场景 云服务器通过VPN连接了现场的n台工控机,每台工控机上都在跑web程序,现在我想通过公网直接访问工控机上的web服务,给客户查看现场的具体运行情况,而不是让客户再装一个VPN,简化操作。…

Axure重要元件三——中继器函数

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:中继器函数 主要内容:Item、Reperter、TargetItem 1、中继器的函数:Item\Reperter\TargetItem Item item:获取…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第五篇-着色器投影-投射阴影部分】

投射阴影 最初打算将投影内容放在上一篇中,因为实现非常快速简单,没必要单独成篇。不过因为这里面涉及一些问题,我觉得还是单独作为一篇讲一下比较好。 原理 这里要用到的是 Shadow Pass Switch ,它可以为非不透明的材质替换阴影 某些版本…

ubuntu22.04下GStreamer源码编译单步调试

前言 本文会通过介绍在linux平台下的GStreamer的源码编译和单步调试example实例。官网介绍直接通过命令行来安装gstreamer可以参考链接:Installing on Linux。 这种方法安装后,基于gstreamer的程序,单步调试的时候并不会进入到gstreamer源码…

架构师:Nginx 实现负载均衡的技术指南

1、简述 NGINX 是一种高性能的 HTTP 服务器和反向代理服务器,广泛应用于 web 服务器场景中。负载均衡是 NGINX 的重要功能之一,能够将请求分发到多个服务器上,提高应用的可用性和性能。 NGINX 负载均衡的主要策略: 轮询 (Round Robin): 将请求依次分发到后端服务器,每个…

中国移动机器人将投入养老场景;华为与APUS共筑AI医疗多场景应用

AgeTech News 一周行业大事件 华为与APUS合作,共筑AI医疗多场景应用 中国移动展出人形机器人,预计投入养老等场景 作为科技与奥富能签约,共拓智能适老化改造领域 天与养老与香港科技园,共探智慧养老新模式 中山大学合作中国…

Web应用程序的设计与前端开发

我们的客户专门从事自动化系统的开发和支持,用于分析、报告、规划和其他业务任务,以及集成外部产品。 任务 我们的客户开始开发一个用于企业业务分析的web应用程序。他们自己处理后端,而我们的团队负责界面和前端。界面不仅在视觉上具有吸引…

论文阅读(十六):Deep Residual Learning for Image Recognition

文章目录 1.介绍2.基本原理3.两种残差块4.网络结构 论文:Deep Residual Learning for Image Recognition   论文链接:Deep Residual Learning for Image Recognition   代码链接:Github 1.介绍 在ResNet网络提出之前,传统的卷…

医疗领域的RAG技术:如何通过知识图谱提升准确性

在医学领域,准确的信息检索和处理至关重要。随着大型语言模型(LLMs)的兴起,检索增强生成(RAG)技术在医学信息处理中的应用越来越受到关注。本文将探讨RAG技术在医学领域的应用,特别是如何利用知…

动态规划 - 完全背包问题

文章目录 题目描述题解思路题解代码 题目描述 题解思路 完全背包问题和01背包问题不同的地方就是完全背包问题中每个物品能选无数次,而01背包问题中每个物品最多只能选择一次 如果你还没有学过01背包,请先看这篇博客学习01背包:https://blo…

基于Javaweb的医院挂号预约管理系统

系统展示 用户前台界面 管理员后台界面 医生后台界面 系统背景 在现代社会,随着医疗需求的不断增长,病患挂号成为医院面临的一大挑战。传统的挂号方式不仅耗时耗力,还容易引发混乱和不满。病患需要排队等候,挂号过程繁琐&#xff…

杨氏矩阵(有一个数字矩阵,矩阵的每行从左到右的递增的,矩阵从上到下是递增的请编写一个程序,在这样的矩阵中查找某个数字是否存在)

//杨氏矩阵 //有一个数字矩阵&#xff0c;矩阵的每行从左到右的递增的&#xff0c;矩阵从上到下是递增的 //请编写一个程序&#xff0c;在这样的矩阵中查找某个数字是否存在 // 1 2 3 // 4 5 6 // 7 8 9 #include<stdio.h> int main() {int a[3][3] { 0 };int i 0, j …