DDD学习笔记三

模型的构造块:实体、值对象、领域服务

  • (1)实体的领域特征

  • 在领域中,一个由身份而不是属性值定义的客观概念就是实体,这个身份可以由一个唯一标识确认。
    一个概念是否是实体取决于系统的应用场景,一个标识是否能保证唯一性取决于系统的范围

  • 判断是否把一个领域概念建模为实体:
    当它被替换为另一个具有同样属性值的对象时,是否影响业务的正确性?
    这些概念是否有状态的变化,如“使用前”“使用后”“被确认”等?
    如果答案是其中一条或两条,则概念应建模为实体

  • (2)实体的实现
    1)基础模型。在类图上,用自定义关键字<>来标识这个类是实体。
    实体一般都会继承一个实体基类,实体基类一般位于类继承结构的最上端。
    从领域概念诞生的子类,要继承体现自己对应领域概念的抽象类,而不用继承实体基类
    2)代码。实体的本质特征是通过身份(标识符)来判断是否为相同的事物

  • 值对象
    通过其特性所定义的,它不需要身份,相同特性的值对象是完全等价的
    值对象拥有以下领域特征:
    总是与另一个对象相关联,用于描述或度量另一个领域对象。
    将不同的相关属性组合成一个概念集体。
    可以被另一个值对象替换,不会影响业务的正确性。
    没有任何状态,它本身其实就是不可变的(一个值对象在创建之后便不能被改变了)。

    值对象总是与一个或多个实体类型相关联,可以作为一个属性容器描述和度量实体的某些特征。
    比如邮寄地址,它将省、市、区、小区、楼栋、门牌、电话等相关属性组合在一起,用来描述实体“顾客”的某个特征

  • (2)值对象的实现
    1)基础模型。可以用自定义关键字<>来标识一个类是值对象,
    2)代码。通过所有属性值相同来判断相等的,而不是特定的身份标识符

  • 实体与值对象的比较

  • 两者的不同点
    (1)两者相等的判定逻辑不一样
    实体对象而言,只要身份一致,即标识符一致,那么它就是同一个事物
    值对象没有标识符,它们之间所有的属性值一致才能判定为是同一个事物
    (2)两者的生命周期不同
    实体有状态变化,为连续统一体。因为有ID相关联,它们拥有“历史”,串联起一系列数据,
    描述了发生在它们身上的事情,以及它们整个生命周期中的变化

     值对象的生命周期为零,我们可以随时创造和摧毁它们。这是可互换的必然结果。比如一张一元的钞票和另一张一样,那何必费心区分它们呢?我们可以用刚刚实例化的对象替换现有对象,然后完全忘记它值对象不能独立存在,它们应该始终属于一个或多个实体。值对象表示的数据仅在它所指的实体的上下文中才有意义。如人和钱的例子中,“多少钱”没有任何意义,因为它没有传达正确的上下文。只有问题变成“付款有多少钱”或“退款有多少钱”、“你有多少钱”或“我有多少钱”才是完全有效的
    

(3)两者在持久化机制上的区别和联系
领域中的值对象也不需要自己的表,不要为值对象创建单独的表,只需将它们内联到父实体的表中即可

  • 领域服务
    (1)领域服务的领域特征
    领域服务表示一个无状态的操作,之所以给其单独建模,是因为这类操作不适合放在实体或值对象中。
    强行放入会破坏上述模型的内聚性,并且也增加了用户发现服务的难度

    如果一个操作需要的信息超出了一个类能提供的数据的范围,那么它就不适合放在该类中

    适合建模为领域服务的操作特征总结如下:
    操作过程涉及多个领域对象。
    对领域对象进行转换。
    以多个领域对象作为输入,结果产生一个值对象(如统计计算逻辑)。
    操作本身是无状态的。

领域服务包含业务规则,应用服务则是满足用例和通用规则

(2)领域服务的实现
用一个单独的服务类来封装操作
为操作独立出一个接口,然后让实现类来实现该接口(取决于你对操作多态性的需要,即是否有不同的操作逻辑需要灵活地替换)

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

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

相关文章

ORA-00903: invalid table name\nORA-06512: at line 1\n

错误信息 ORA-00903: invalid table name\nORA-06512: at line 1\n原因 ORA-00903: invalid table name 解释: 这个错误表示在 SQL 语句中使用了无效的表名。 由于在建表中出现了以数字开头的表名,所以出现以下错误 解决方案 表名不能以数字开头

RabbitMQ交换器类型

直连交换机&#xff08;Direct Exchange&#xff09; 直连交换机的工作方式是最简单的路由模式&#xff0c;它会根据消息的routing key将其精确地路由到与之绑定的队列上。每个队列通过一个特定的routing key与交换机绑定。如果一条消息的routing key与队列的绑定键完全匹配&am…

AWT的菜单组件

AWT的菜单组件 前言一、菜单组件的介绍常见的菜单相关组件常见菜单相关组件集成体系图菜单相关组件使用小要点 二、AWT菜单组件的代码示例示例一示例二实现思路 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&…

【Python】Pickle:Python对象序列化与反序列化的利器

在Python编程中&#xff0c;我们经常需要在程序的不同运行之间保存和加载数据&#xff0c;这时候&#xff0c;Python标准库中的pickle模块就派上了用场。pickle模块可以将Python对象序列化为字节流&#xff0c;便于存储到文件或通过网络传输&#xff1b;同时&#xff0c;它也可…

CentOS 7 和 CentOS Stream 8 的主要区别

更新频率&#xff1a; CentOS 7&#xff1a;传统的稳定版本&#xff0c;主要用于生产环境&#xff0c;更新频率较低&#xff0c;主要包含安全补丁和重要修复。CentOS Stream 8&#xff1a;滚动发布版本&#xff0c;更新更频繁&#xff0c;包含最新的特性和改进。它处于 Fedora …

springboot汽车租赁管理系统-计算机毕业设计源码08754

目 录 摘 要 第 1 章 引 言 1.1 选题背景和意义 1.2 国内外研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析…

基于线调频小波变换的非平稳信号分析方法(MATLAB)

信号处理领域学者为了改进小波变换在各时频区间能量聚集性不高的缺点&#xff0c;有学者在小波分析基础上引入调频算子构成了线性调频小波变换&#xff0c;线调频小波一方面继承了小波变换的理论完善性&#xff0c;另一方面用一个新的参数&#xff08;线调频参数&#xff09;刻…

Nginx 配置文件

Nginx的配置文件的组成部分&#xff1a; 主配置文件&#xff1a;nginx.conf子配置文件&#xff1a;include conf.d/*.conf 全局配置 nginx 有多种模块 核心模块&#xff1a;是 Nginx 服务器正常运行必不可少的模块&#xff0c;提供错误日志记录 、配置文件解析 、事件驱动机…

46 - 删除重复的电子邮箱(高频 SQL 50 题基础版)

46 - 删除重复的电子邮箱 delete p1 from Person p1,Person p2 where p1.emailp2.email and p1.id>p2.id;

跟着DW学习大语言模型-使用Streamlit构建一个RAG应用

在大语言模型 (LLMs) 的应用中&#xff0c;我们面临众多挑战&#xff0c;包括领域知识的缺乏、信息的准确性问题以及生成的虚假内容。检索增强生成 (RAG) 通过引入外部知识库等额外信息源&#xff0c;为这些问题提供了有效的缓解策略。RAG 在那些需要不断更新知识的知识密集型场…

ios13多窗口(UIWindowScene)学习笔记

ios13引入了UIWindowScene类、UIWindowSceneDelegate协议以便支持多窗口功能&#xff0c;但其适用于ipad&#xff0c;不适用于iphone&#xff0c;因为iphone不支持多窗口功能。注意&#xff0c;这里说的窗口不是UIWindow&#xff0c;而是UIWindowScene。 ios13前后的app的UI架…

2024年【建筑电工(建筑特殊工种)】考试试题及建筑电工(建筑特殊工种)模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【建筑电工(建筑特殊工种)】考试试题及建筑电工(建筑特殊工种)模拟考试题库&#xff0c;包含建筑电工(建筑特殊工种)考试试题答案和解析及建筑电工(建筑特殊工种)模拟考试题库练习。安全生产模拟考试一点通结合…

2024年【广东省安全员A证第四批(主要负责人)】新版试题及广东省安全员A证第四批(主要负责人)考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【广东省安全员A证第四批&#xff08;主要负责人&#xff09;】新版试题及广东省安全员A证第四批&#xff08;主要负责人&#xff09;考试试卷&#xff0c;包含广东省安全员A证第四批&#xff08;主要负责人&am…

Go线程实现模型-P

P 概述 P是G能够在M中运行关键。Go的运行时系统会适时地让P与不同的M建立或断开关联&#xff0c;以使P中的那些可运行的G能够及时获得&#xff0c;这与操作系统内核在CPU之上实时切换不同进程或线程的情况类似 改变P的数量 改变单个Go程序间拥有的P的最大数量有两种方法 调…

Scala编程的瑞士军刀:包对象的威力与应用

标题&#xff1a;Scala编程的瑞士军刀&#xff1a;包对象的威力与应用 在Scala编程中&#xff0c;包对象&#xff08;Package Object&#xff09;是一种非常有用的工具&#xff0c;它允许开发者在包级别共享代码&#xff0c;而无需创建单独的类或对象。包对象是单例的&#xf…

【LLM中不同GGUF格式存储和表示模型参数的用途和硬件要求】

LLM中不同GGUF格式存储和表示模型参数的用途和硬件要求 1. 模型参数类型2. 使用场景 在大语言模型&#xff08;LLM&#xff09;中&#xff0c;GGUF格式是一种存储和表示模型参数的方法。不同的格式和参数类型各有其优缺点&#xff0c;适用于不同的用途和硬件要求。下面是对这些…

Android - 利用 jitpack 免费发布闭源 aar

一、简述 目前(Android/java) library 的主要发布仓库有 MavenCentral 和 jitpack,我之前也对这两种仓库的发布流程做了详细介绍: 发布至 MavenCentral: https://juejin.cn/post/6953598441817636900发布至 jitpack: https://juejin.cn/post/7040733114506674183#heading-…

图灵虚拟机配置

导入虚拟机 点击新建&#xff0c;选择虚拟硬盘文件 环境机器.vmdk 配置网络

浅谈区块链

区块链是一种分布式数据库技术&#xff0c;也被称为分布式账本技术。它的本质是一个去中心化的数据库&#xff0c;使用密码学相关联产生的数据块串连而成&#xff0c;用于验证其信息的有效性&#xff08;防伪&#xff09;和生成下一个区块。区块链具有“不可伪造”“全程留痕”…

【后端面试题】【中间件】【NoSQL】ElasticSearch索引机制和高性能的面试思路

Elasticsearch的索引机制 Elasticsearch使用的是倒排索引&#xff0c;所谓的倒排索引是相对于正排索引而言的。 在一般的文件系统中&#xff0c;索引是文档映射到关键字&#xff0c;而倒排索引则相反&#xff0c;是从关键字映射到文档。 如果没有倒排索引的话&#xff0c;想找…