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

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

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

相关文章

大数据Azkaban(二):Azkaban简单介绍

文章目录 Azkaban简单介绍 一、Azkaban特点 二、Azkaban组成结构 三、Azkaban部署模式 1、solo-server ode(独立服务器模式) 2、two server mode(双服务器模式) 3、distributed multiple-executor mode(分布式多…

Threejs 实现3D 地图(01)创建基本场景

"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" <script setup> import { onMounted,ref } from vue import * as THREE from three import * as d3 from "d3"; //莫开托坐标 矫正地图…

Vertx实现一个通用的MqttServer

mqtt协议介绍 简介 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅范式的“轻量级”消息协议&#xff0c;由 IBM 发布。 IoT 设备要运作&#xff0c;就必须连接到互联网&#xff0c;设备才…

数据分析-Apache_hive

任务一 创建库及外部表 在 comm 数 据 库 下 创 建 一 个 名 为 dws_behavior_log的外部表&#xff0c;如果表已存在&#xff0c;则先删除&#xff1b;分 区字段为dt&#xff0c;即根据日期进行分区&#xff1b;另外&#xff0c;要求指定表的存 储路径为HDFS的/behavior/dws/d…

java让系统直接播放音频/java获取音频流输送到播放设备SourceDataLine

Java Sound API支持常见的格式&#xff1a; WAV&#xff08;Waveform Audio File Format&#xff09; 常见的无损音频格式&#xff0c;支持 PCM&#xff08;脉冲编码调制&#xff09;编码。 AIFF&#xff08;Audio Interchange File Format&#xff09; 主要用于 Macintosh 系统…

OpenCV视觉分析之运动分析(2)背景减除类:BackgroundSubtractorKNN的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 K-最近邻&#xff08;K-nearest neighbours, KNN&#xff09;基于的背景/前景分割算法。 该类实现了如 319中所述的 K-最近邻背景减除。如果前景…

058_基于python时尚女装抖音号评论数据分析系统

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

智慧城管综合管理系统源码,微服务架构,基于springboot、vue+element+uniapp技术开发,支持二次开发

智慧城管源码&#xff0c;智慧城管执法办案系统源码 智慧城管综合执法办案平台是智慧城市框架下&#xff0c;依托物联网、云计算、多网融合等现代化技术&#xff0c;运用数字基础资源、多维信息感知、协同工作处置、智能化辅助决策分析等手段&#xff0c;形成具备高度感知、互联…

C++共同体

共同体是一种数据格式&#xff0c;他能储存不同的数据类型&#xff0c;但是同一时间只能储存其中的一种类型。 语法&#xff1a; union 共同体名 { 成员一的数据类型 成员名一&#xff1b; 成员二的数据类型 成员名二&#xff1b; 成员n的数据类型 成员名n&#xff1b; }

目标检测算法-YOLOV11解析

原文首发于微信公众号 微信公众号-人工智能与图像处理&#xff1a;目标检测算法-YOLOV11解析 一&#xff0c;YOLOV11概述 YOLOv11是由Ultralytics公司开发的新一代目标检测算法&#xff0c;它在之前YOLO版本的基础上进行了显著的架构和训练方法改进。整合了改进的模型结构设计…

Redis Search系列 - 第四讲 支持中文

目录 一、支持中文二、自定义中文词典2.1 Redis Search设置FRISOINI参数2.2 friso.ini文件相关配置1&#xff09;自定义friso UTF-8字典2&#xff09;修改friso.ini配置文件 三、实测中文分词效果 一、支持中文 Redis Stack 从版本 0.99.0 开始支持中文文档的添加和分词。中文…

Django+Vue智慧分析居家养老系统统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作者&…

【学习笔记】强化学习

李宏毅深度强化学习 笔记 课程主页&#xff1a;NTU-MLDS18 视频&#xff1a;youtube B站 参考资料&#xff1a; 作业代码参考 纯numpy实现非Deep的RL算法 OpenAI tutorial 文章目录 李宏毅深度强化学习 笔记1. Introduction2. Policy Gradient2.1 Origin Policy Gradient2.2…

基于大型语言模型的智能网页抓取

Google Gemini 是 Google AI 创建的大型语言模型 (LLM) 系列&#xff0c;可提供最先进的 AI 功能。Gemini 模型包括&#xff1a; Gemini Ultra — 最大、最强大的模型&#xff0c;擅长处理编码、逻辑推理和创意协作等复杂任务。可通过 Gemini Advanced&#xff08;原名 Bard&a…

【Linux】基础IO-上

1、共识原理 1、文件 内容 属性 2、文件分为打开的文件和没打开的文件 3、打开的文件是谁打开的&#xff1f; 答案是&#xff1a;进程&#xff01;---本质是研究进程和文件的关系 文件被打开必须先被加载到内存&#xff0c;一个进程可以打开多个文件。因此&#xff0c;在OS内…

NVR小程序接入平台/设备EasyNVR多个NVR同时管理的高效解决方案

在当今的数字化安防时代&#xff0c;视频监控系统的需求日益复杂和多样化。为了满足不同场景下的监控需求&#xff0c;一种高效、灵活且兼容性强的安防视频监控平台——NVR批量管理软件/平台EasyNVR应运而生。本篇探讨这一融合所带来的创新与发展。 一、NVR监测软件/设备EasyNV…

mysql 13 MySQL基于规则的优化

01.条件化简 我们编写的查询语句的搜索条件本质上是一个表达式&#xff0c;这些表达式可能比较繁杂&#xff0c;或者不能高效的执行&#xff0c; MySQL的查询优化器会为我们简化这些表达式。为了方便大家理解&#xff0c;我们后边举例子的时候都使用诸如 a 、 b 、 c 之类的简…

shell——正则表达式入门

目录 一、常规匹配 二、特殊字符 ^ $ . * 字符区间 \ 三、示例 shell中总是会需要对文本字符串做各种各样的剪切拼接等操作&#xff0c;除了 basename 和 dirname 这种简单的函数外&#xff0c;还可以用正则表达式&#xff0c;定义模糊匹配的筛选规则 一、常规匹配 管…

Pyqt5设计打开电脑摄像头+可选择哪个摄像头(如有多个)

目录 专栏导读库的安装代码介绍完整代码总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——> 一晌小贪欢的博客主页求关注 &#x1f44d; 该系列文…

【C++】——list 容器的解析与极致实现

人的一切痛苦&#xff0c;本质上都是对自己的无能的愤怒。 —— 王小波 目录 1、list 介绍 2、list的使用 2.1 list 的构造 2.2 iterator 的使用 2.3 list 的修改 2.4一些特殊接口 2.5 迭代器失效问题 3、实现list 3.1底层结构 结点类 list类 迭代器类 3.2功能接…