领域事件驱动DDD(一) 值对象以及实体

news2024/11/24 3:20:24

对领域事件驱动的一些知识的梳理(以下内容是从内到外进行梳理)
在这里插入图片描述

值对象:一个没有标识符的对象。

值对象通常不会被修改,而是通过创建新的值对象来表示不同的状态。
没有自己的生命周期,它们随着所属的实体或聚合根的生命周期而存在。它们更多地用于描述和表示数据,而不是行为。

订单作为聚合根,而其中的一些属性可以被抽象为值对象。例如,收货人信息可以被封装成一个值对象。

public class ShippingAddress {
    private String street;
    private String city;
    private String state;
    private String postalCode;
}

通过使用值对象ShippingAddress,我们可以将收货人信息与订单关联起来,同时减少代码的冗余和复杂性。

public class Order {
    private String orderNumber;
    private LocalDateTime orderDate;
    private BigDecimal orderAmount;
    private ShippingAddress shippingAddress;
}

实体:

实体应该是富有业务行为且具有唯一标识符的对象。在不同的设计阶段实体是可以改变的,但是根据唯一标识符始终能定位到这个唯一对象。

贫血模型

贫血模型是指领域对象里只有get和set方法(POJO),所有的业务逻辑都不包含在内而是放在Business Logic层。

充血模型

充血模型是指数据和对应的业务逻辑被封装到同一个类中。因此,这种充血模型满足面向对象的封装特性,是典型的面向对象编程风格。

引入新的问题
什么样的逻辑应该放在Domain Object中,什么样的业务逻辑应该放在Business Logic中?

Rod Johnson提出原则是“case by case”,可重用度高的,和domain object状态密切关联的放在Domain Object中,可重用度低的,和domain object状态没有密切关联的放在Business Logic中。

把一个logic放到domain object中以后,这个domain object应该仍然独立于持久层框架之外,这个domain object仍然可以脱离持久层框架进行单元测试,这个domain object仍然是一个完备的,自包含的,不依赖于外部环境的领域对象,这种情况下,这个logic才是domain logic。

public class Order {
    private String orderNumber;
    private LocalDateTime orderDate;
    private BigDecimal orderAmount;
    private ShippingAddress shippingAddress;
     // 封装业务行为
    public void cancelOrder() {
        // 执行取消订单的逻辑
    }
    
    public void updateShippingAddress(ShippingAddress newAddress) {
        // 执行更新收货地址的逻辑
    }
}

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

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

相关文章

自动化测试-Selenium

目录 什么是自动化测试 Selenium介绍 Selenium是什么 Selenium特点 Selenium工作原理 SeleniumJava环境搭建 1.下载chrome浏览器,查看版本号. 2.下载chrome浏览器驱动 3.配置环境变量 4.创建java项目,在pom文件中添加依赖 5. 验证环境是否搭建成功 Selenium常用API…

libevent实践08:实现定时器第二季

简介 获取libevent的版本号字符串 /**Get the Libevent version.Note that this will give you the version of the library that yourecurrently linked against, not the version of the headers that youvecompiled against.return a string containing the version numbe…

利用RabbitMQ实现消息投递削峰填谷

目录 异步和同步如何选择 异步线程 同步收发消息 一、导入依赖库 二、创建RabbitMQ配置类 三、创建消息任务类 异步和同步如何选择 依靠多线程,Java代码可以同步执行也可以异步执行 RabbitMQ提供了同步和异步两种收发消息模式 我们采用 Java异步线程 MQ同步…

MongoRepository

一、介绍 MongoRepository是一个接口,与HibernateRepository类似,通过继承MongoRepository接口,我们可以非常方便地实现对一个MongoDB集合中的文档数据进行增删改查,示例如下所示: import org.bson.types.ObjectId; import org.springframework.data.mongodb.repository…

[数据结构 -- 手撕排序第一篇] 插入排序

目录 1、常见的排序算法 2、插入排序的思路 2.1 基本思想 2.2 直接插入排序 2.2.1 单趟排序的思路 2.2.2 单趟排序代码实现 3、插入排序代码 4、插入排序打印测试 5、插入排序的时间复杂度 5.1 最坏情况 5.2 最好情况 6、直接插入排序的特性总结 1、常见的排序算法 2、插入排序…

SpringMVC (二) 第一个MVC程序

学习回顾:SpringMVC (一) 什么是SpringMVC Hello,SpringMVC 现在我们来看看如何快速使用SpringMVC编写我们的程序吧! 一、配置版 1、新建一个Moudle , springmvc-02-hello , 添加web的支持&…

Spring面试题--AOP

什么是AOP,你们项目中有没有使用到AOP? AOP称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect&a…

2024中山大学898水文地质与工程地质考研初试复习资料

C8260153[电子书]2024年中山大学898水文地质与工程地质考研精品资料 说明:本套资料由高分研究生潜心整理编写,高清电子书,考研推荐资料。 一、考研真题及重点名校真题 1.附赠重点名校真题 ①重点名校:水文地质学基础2010-2013…

魏副业而战:抖音图文带货玩法,月入5w+

我是魏哥,与其在家躺平,不如魏副业而战! 最近魏哥一直在研究短视频带货,看了很多案例,发现了一些NB的账号。 说真的,视频带货真的可以认真的研究研究,不管是做直播,还是发视频&…

【C++11】左值引用 与 右值引用

定义 左值 / 左值引用 左值(Lvalue): 左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以 对它取地址 可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修…

青少年机器人技术一级核心知识点:机械结构及模型(二)

随着科技的不断进步,机器人技术已经成为了一个重要的领域。在这个领域中,机械结构是机器人设计中至关重要的一部分,它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说,了解机械结构的基础知识,掌…

持续集成工具Jenkins安装和部署

前言 Jenkins的执行流程图如下: 1. 前期准备 1.1 安装JDK 目前新版本的Jenkins对JDK的要求基本上都在JDK11以上,所以我这边将我服务器的JDK版本升级成为JDK11。 具体升级步骤如下: 下载安装包 官网可能需要注册账号,这里我…

微信:如何查询自己名下已实名认证绑定的几个微信账户?

你知道如何查询自己名下已实名认证绑定了几个微信账户吗?微信规则同一个人最多可以注册绑定完成5个微信账户认证,如果想注册新微信号,必须保证实名认证微信账户不足5个。而且通过查询自己名下实名认证微信账户还可以确认,自己的身…

LINUX系统(ubuntu)安装以及应用调试(不定时更新)

一:linux的介绍 Linux是一种基于UNIX操作系统的开源(Open Source)操作系统。它由芬兰计算机科学家 Linus Torvalds 在1991年首次发布,目前已经发展成为最流行和广泛使用的操作系统之一。 Linux以其稳定性、安全性和灵活性而闻名…

07-C++学习笔记-函数

📚 函数的概念 函数是一段可重复使用的代码块,用于完成特定的任务。通过使用函数,可以将程序划分为多个模块,提高代码的可读性、可维护性和复用性。 在C中,函数由函数头和函数体组成。函数头包含函数的返回类型、函数…

日期格式化不起作用 2022-09-18T05:25:30.000+00:00

java->web JsonFormat(pattern “yyyy-MM-dd HH:mm:ss”)一般版本问题或依赖冲突不起作用 解决: spring:jackson:serialization:write-dates-as-timestamps: falsedate-format: yyyy-MM-dd HH:mm:ss这个配置会在java对象传输给web前端的时候对日期的字段进行…

Linux 查看端口占用命令

文章目录 1、lsof -i:端口号2、netstat 命令2.1 netstat -tunlp 命令2.2 netstat -anp 命令 1、lsof -i:端口号 用于查看某一端口的占用情况,比如查看5000端口使用情况: lsof -i:5000常用命令: lsof -i:5000:查看5000端口占用 …

QT或VS2015报错:Error: C2661: QColor::ct::ct: 没有重载函数接受 5 个参数解决方案

安装了QT5.14.2 MSCV2015配置并同时在QT或VS2015测试并运行都提示没有重载函数接受 5 个参数。 同时还会出现C2134错误:QMetaObject::SuperData::operator const QMetaObject *: 调用不会生成常数表达式的错误 搜索了网络上的结果都让换其它版本,没有…

高压线路零序电流方向保护程序逻辑原理(一)

一、微机型零序电流方向保护概念 (一)保护电流元件的配置 零序电流方向保护是反应大接地电流系统的线路发生接地故障时,零序电流分量大小和方向的多段式电流方向保护。在我国大接地电流系统线路上都装设了这种接地保护装置,这种保…

(推荐)Abaqus中C++子程序开发入门

ABAQUS是支持C子程序开发的,相比于传统的Fortran,C作为高级语言的优势不言而喻,再搭配优秀的C程序库,使得我们的编程效率大大提高,尤其是对于熟悉C编程的开发者,不失为一种更好的选择。 1 软件配置 1.1 环…