真实世界的映照-DDD实体

什么是实体?

实体,官方的解释是:实体(Entity,又称为Reference Object)很多对象不是通过他们的属性定义的,而是通过一连串的连续事件和标识定义的。主要由标识定义的对象被称为ENTITY。

但,这官方的解释,反而将实体玄奥起来了。

很书籍、博客上说,实体一定是具有唯一标识(ID),于是很多人便认为,有唯一标识的就是实体。然而,值对象,也可以有唯一标识。

也有人说,实体与数据库表一一对应,那么,只要是要与数据库做映射的,都是实体。然而,值对象,也可以与数据库表映射。

其实,实体的定义很简单:

实体是有生命周期,能演变,里面的属性值可以随时变化。简单的说,实体有类似set方法,可以在任何时候修改实体的属性。

只要是符合这个本质的,都可以称之为实体。

实体的特征

1、具有唯一标识(世界上没有相同的两片绿叶)

2、具备生命周期,在生命周期内其内部属性可以被改变

3、实体具有行为方法

DDD为啥要提出实体这个概念?

试想一下,我们传统开发的时候,是怎么进行建模的?

我相信,大多团队,都是直接在数据库里面建一张表,就完事了吧。

好一点的团队,会使用PowerDesigner之类的工具构建出物理模型。

再好一点的团队,会构建出逻辑模型,然后通过逻辑模型再生成物理模型。但更多的人会认为逻辑模型是个多余,因为项目一个确定,所使用的数据库就基本已经确定,直接设计物理模型,不香么?

再回想,以上的这些方式设计出来的模型,是不是基本上只有开发人员在参与?因为,业务人员也看不懂这些。

再回想,只有开发人员参与得出的模型,真的是符合业务的模型吗?真的是符合实现世界的模型吗?

很可惜,只有开发人员参与得出的模型,往往只能满足当时的业务需求,一当业务需求发生改变时,这模型便不符合了,严重的,会导致整个项目需要大重构才能满足新的业务需求。

难怪,会有如此多的项目推翻重构,从1.0系统到5.0系统,每一次都是推翻前者进行重构开发。

实体是模拟真实的物理世界,是连接开发人员与业务人员的重要工具。

DDD提倡的是用模型来模拟现实的物理世界,只有符合现实物理世界的模型才是好的模型。

在DDD中,实体与值对象是领域进行建模的重要工具。

实体与贫血模型、充血模型

在实体中,如果只有简单的get、set方法,那么实体表现就是贫血模型。如果实体中有着丰富的行为方法,那么实体表现就是充血模型。

很多DDD的书,都推荐使用充血模型,而反对贫血模型。然而,在工程实践中,往往发现贫血模型更加好用,充血模型使代码看上去臃肿不堪。

首先,需要申明的是,实体与数据库不是映射关系!实体的持久化,不一定得持久到到数据库中,实体可以持久化到文件中、缓存中、甚至内存中!!

而PO(persistant object)才是与数据库一一映射的对象。

在PO中适合贫血模型,在实体中适合充血模型。实体与PO,只通过资源库关联起来。

实体的持久化是通过资源库而实现的,而资源库的具体实现,则是通过依赖倒置和依赖注入的方式在基础设施层实现,PO放在基础设施层与数据库一一映射。实体中丰富的行为方法,操作着资源库对象,通过资源库对象操作着PO对象,直到将数据写入数据库。

如何践行实体?

物理世界中的每一个物体、每一个概念,都与一个实体一一对应。

比如,在线上图书馆中,书籍得对应书箱实体。书籍有编号(唯一标识)、书名、作者、出版社、出版时间、售价、封面、内容等属性,有借出、归还、上架、下架等动作。书籍的生命周期是入库到出库时间段。在物理世界中的书籍对应数字世界中的书籍实体,也是具有和物理世界一样的属性、动作、生命周期。

实体的建模,可以由业务人员来完成,也可以由开发者与业务人员一起完成。

设计实体的工具,可以用简单的Excel表格,也可以用专业的UML软件,甚至,可以在白纸上画一些简单的示意图!

注意的是,实体的唯一标识,不一定是数据库的主键,虽然很多实际上的做法,数据库主键都是等于实体的唯一标识。

注意的是,如果一个物理世界的事物,更适用使用值对象来建模,那么,请使用值对象。DDD的原则是,能用值对象尽量用值对象,不能用值对象时再考虑实体。

注意的是,实体是处于设计阶段,不要急迫地把实体变成代码!因为,你设计好的实体,需要与业务人员一起审核,在审核过程中,业务人员会提出他的问题,指出模型中的缺陷,或者增加一些模型。

注意的是,如果一个实体在真实世界中找不到对照,那么这个实体就肯定是有问题的,需要考虑是否要把实体删除。

import org.ddd.book.domain.book.repository.IBookRepository;
import org.ddd.book.domain.book.vo.AuthorVO;
import org.ddd.book.domain.book.vo.PublisherVO;
import org.ddd.book.domain.factoty.RepositoryFactory;

import java.util.Date;

/**
 * 书籍实体
 */
public class BookEntity {
    // 书籍ID(编号)
    private Long bookId;
    // 书籍名称
    private String bookName;
    // 作者
    private AuthorVO author;
    // 出版社
    private PublisherVO publisher;
    // 出版时间
    private Date publishDate;
    // 售价
    private Long price;
    // 封面
    private String headImg;
    // 内容
    private BookContentEntity bookContent;

    // 持久化
    public void save() {
        RepositoryFactory.get(IBookRepository.class).save(this);
    }

    // 上架
    public void down() {
    }

    // 下架
    public void up() {
    }

    // 借出
    public void lend() {
    }

    // 归还
    public void returnBack() {
    }
}

了解更多,请关注公众号:jgssy01

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能——机器学习概述

1. 人工智能 1.1. 概念 人工智能(Artificial Intelligence,AI),是新一轮科技革命和产业变革的重要驱动力量, [26]是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 人工智能是智能学科重要的组…

ChromeDriver / Selenium-server

一、简介 ChromeDriver 是一个 WebDriver 的实现,专门用于自动化控制 Google Chrome 浏览器。以下是关于 ChromeDriver 的详细说明: 定义与作用: ChromeDriver 是一个独立的服务器程序,作为客户端库与 Google Chrome 浏览…

GFS部署实验---gfs9.6版本---网络源安装

目录 1、部署环境 2、更改节点名称 3、准备环境 4、做主机映射--/etc/hosts/ 5、yum网络源直接安装客户端软件 1.安装公网源 2.安装服务 3.开启服务 6、添加节点到存储信任池中 7、创建卷 1、创建数据目录 2、创建分布式卷 3、创建复制卷 4、创建分布式复制卷 5、…

每天五分钟深度学习:如何理解逻辑回归算法的假设函数?

本文重点 我们在机器学习专栏中已经学习了逻辑回归算法,本次课程我们将重温逻辑回归算法,该算法适用于二分类的问题,本文主要介绍逻辑回归的假设函数。我们在学习线性回归算法的时候,我们已经知道了线性回归算法的假设hθ(x)=θTX(参数θ的转置*X),但是对于逻辑回归而言…

GEE:基于GEDI-4A 级(L4A)数据和机器学习方法预测地上生物量密度(AGBD;单位为 Mg/ha)

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine (GEE)平台上使用GEDI-4A 级(L4A)数据和机器学习方法预测地上生物量密度(AGBD;单位为 Mg/ha)的方法和代码。 代码包括(1) Landsat 和 GEDI 影像预处理;(2)特征变量(光学/雷达/时序/纹理/物候/地表温度/主…

「44」直播间换脸,揭开神秘的面纱……

「44」换脸神器 让你瞬间秒变「明星脸」带货 DeepFace是Facebook的人脸识别系统之一,旨在在照片和视频中准确识别和标识人脸。它使用深度学习和神经网络技术来进行高度精确的人脸匹配和验证。 DeepFace利用了大量的训练数据和先进的人脸识别算法,能够…

Jmeter02-2:参数化组件其他方式

0、Jmeter组件:参数化概述 0.1 是什么? 参数化是动态的获取并设置数据 0.2 为什么? 比如执行批量操作时,批量插入或批量删除,之前数据都是手写的,每执行完都要修改一次,效率太低 而参数化就是…

监控指标体系:交互延迟上的探索与最佳实践

FID 在互联网高速发展的时代,用户体验已成为企业竞争的关键所在。网页性能作为用户体验的重要组成部分,直接影响着用户的满意度和工作效率。First Input Delay(FID)作为衡量网页性能的重要指标,越来越受到业界关注。今天,让我们一起来深入了解FID,探讨如何优化FID以提升…

Verilog实现手表计时

实现手表的计时功能: 1.具有start启动信号、pause暂停信号,可以自定义其触发机制。 2.具有时间更改接口,可以更改时、分、秒。 3.输出时、分、秒。 Verilog设计 模块端口定义: module watch1(input wire clk …

蓝桥杯加训

1.两只塔姆沃斯牛&#xff08;模拟&#xff09; 思路&#xff1a;人和牛都记录三个数据&#xff0c;当前坐标和走的方向&#xff0c;如果人和牛的坐标和方向走重复了&#xff0c;那就说明一直在绕圈圈&#xff0c;无解 #include<iostream> using namespace std; const i…

软考高级架构师:TCP/IP 协议 和 OSI 七层模型

一、AI 讲解 TCP/IP 协议族是一组计算机网络通信协议的集合&#xff0c;其中TCP和IP是两个核心协议。TCP/IP 协议族通常被用来参照互联网的基础通信架构。与之相对的OSI七层模型&#xff0c;是一个更为理论化的网络通信模型&#xff0c;它将网络通信分为七个层次。 TCP/IP 与…

LeetCode 289.生命游戏————2024 春招冲刺百题计划

根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a; 1 即为 活细胞 &am…

【攻防世界】题目名称-文件包含

看到 include()&#xff0c;想到文件包含&#xff0c;用php伪协议。 知识点 看到 include()&#xff0c;require()&#xff0c;include_once()&#xff0c;require_once() &#xff0c;想到文件包含&#xff0c;用php伪协议 ?filenamephp://filter/readconvert.base64-encode/…

4.9java学习总结

常用API(了解即可,用到了再回来看) API(工具类):已经打包好我们可以根据他提供的格式直接用就好(很像函数) API都可以通过 类名.方法名 进行调用. Math Math类包用于常用的基本数学运算的方法. System: System类包提供了一些与系统相关的方法 Runtime: Runtime类包提供方…

《系统架构设计师教程(第2版)》第9章-软件可靠性基础知识-01-软件可靠性基本概念

文章目录 1. 软件可靠性的概述1.1 定义1.1.1 规定的时间1.1.2 规定的条件1.1.3 所要求的功能 1.2 定义的特点和意义1.3 注意点 2. 软件可靠性的定量描述2.1 规定时间2.1.1 自然时间2.1.2 运行时间执行时间 2.2 失效概率 F(t)2.3 可靠度 R(t)2.4 失效强度 f(t)2.5 平均失效前时间…

modelsim 仿真bmp图片实现RGB_YCrCb

用modelsim_se软件仿真bmp图片&#xff0c;可在modesim中实现一些图片处理算法和查看效果 本文以最简单的仿真一副bmp图像为例&#xff0c;实现RGB_YCrCb的modelsim仿真,带源工程 1、先在本地建立文件夹 2、首先打开moselsim 3、新建库和新建项目&#xff0c;保存到建立的文件…

Android音视频的基础

视频是什么&#xff1f; 视频就是由一系列图片构成的。 视频帧 帧&#xff0c;是视频的一个基本概念&#xff0c;表示一张画面&#xff0c;如上面的翻页动画书中的一页&#xff0c;就是一帧。一个视频就是由许许多多帧组成的。 帧率 帧率&#xff0c;即单位时间内帧的数量&a…

39-性能分析(下):APIServer性能测试和调优实战

在API上线之前&#xff0c;我们需要知道API的性能&#xff0c;以便知道API服务器所能承载的最大请求量、性能瓶颈&#xff0c;再根据业务对性能的要求&#xff0c;来对API进行性能调优或者扩缩容。通过这些&#xff0c;可以使API稳定地对外提供服务&#xff0c;并且让请求在合理…

网络网络层之(7)PPPOE协议

网络网络层之(7)PPPOE协议 Author: Once Day Date: 2024年4月7日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day…

紫叶写作靠谱不 #笔记#学习方法#媒体

紫叶写作是一款非常好用的论文写作工具&#xff0c;它不仅提供了查重降重的功能&#xff0c;还能帮助用户快速完成论文的撰写和格式编辑。通过紫叶写作&#xff0c;用户可以轻松地查重降重&#xff0c;避免论文中出现抄袭和重复的现象&#xff0c;保证论文的原创性和质量。 紫叶…