点击上面的芋道源码,选择星标
管她前浪还是后浪?
能浪的浪,是好浪!
每天 更新文章,每天掉1亿点头发...
源代码精品专栏
原创 | Java 2021超神之路,很肝~
中文详细注释的开源项目
RPC 框架 Dubbo 源码解析
网络应用框架 Netty 源码解析
消息中间件 RocketMQ 源码解析
数据库中间件 Sharding-JDBC 和 MyCAT 源码解析
中间调度中间件 Elastic-Job 源码解析
分布式事务中间件 TCC-Transaction 源码解析
Eureka 和 Hystrix 源码解析
Java 并发源码
来源:www.cnblogs.com/xishuai/p/ddd-entity-value-object.html
1. 实体最重要的特征是什么?
2. Message 实体是怎么来的?
3. 为什么发件人和收件人不是实体?
4. 发件人和收件人是值得的对象吗?还是实体?
消息场景:用户 A 向用户发送消息 B,用户 B 给用户回复消息 A。。。
现有设计:新闻设计为实体和聚合根,发件人和收件人设计为值对象。
三个问题:
实体最重要的特征是什么?
Message 实体是怎么来的?
为什么发件人和收件人不是实体?
1. 实体最重要的特征是什么?
5.领域驱动设计.2 实体:
摘录一段:许多对象不是由它们的属性定义的,而是通过一系列 (continuity)和 (identity)从根本上定义。
归纳:
标识(identity)
连续性(continuity)
实体中标志的另一种体现是 ,其概念在许多数据中都有解释,这也是实体最重要的特征。
我有一个双胞胎兄弟。当我们出生时,我们看起来完全一样,所以我们的父母分不清。他们不得不在我们脖子上系一条项链来标记:谁是老板?谁是第二个孩子?事实上,这个标志可以被视为物理标志,只是用项链 就像我们在项目中使用它一样 GUID 同样的方式,目的是用来 ,但无论如何,这个标志必须在这个特定的环境中是唯一的,也就是说,我和我的双胞胎兄弟的项链不能完全一样,否则我的父母就不能 我们俩了。
我和我的双胞胎兄弟一天天长大,但令人惊讶的是,我们的兄弟越长越相似,所以我们互相看着对方,认为我们在照镜子,但唯一不变的是我们脖子上的项链,这也是区分我们兄弟的唯一方法。我刚出生,脖子上的项链和现在一样,这是物理标志 ,也就是说刚出生的我和现在的我是同一个人,项链只不过在我成长的过程中起到“ 作用(当然也可以是手带、脚环等信物),会陪伴我的一生。这个陪伴的过程可以理解为实体的另一个特征—— 。
有一天,我们镇要统计双胞胎的分布情况,然后调查人员来到我们家,问我们的父母:你家有双胞胎吗?几对双胞胎?龙凤胎?还是。。。”,然后我爸妈就报上:“一对双胞胎-两个小子”,然后调查人员就做了笔记走了。在这个过程中,他们没有提到我脖子上的项链。虽然它在我父母眼里是如此重要(用来标记我们的兄弟),但在调查人员眼里却一无所有。他们只需要知道我和我的双胞胎兄弟是什么样的双胞胎,这是实体和价值对象之间的根本区别:
在特定的环境下,区分实体和值对象的例子有很多,如《领域驱动设计》中提到的体育场座位例子和 Custorm-Address 例子等等,但大多数都强调实体的识别特征,但很少提到连续性,那么什么是连续性呢?在《领域驱动设计》5中,这部分内容.实体章节的最后一部分提到了,但都是零碎的概念文字,如果不注意,很容易被忽略。
摘要:只要一个对象能够在生命周期中保持连续性并独立于其属性(即使这些属性对系统用户非常重要),它就是一个实体。
这个内容可以结合我和我的双胞胎兄弟的例子来理解。项链将伴随我一生。这段话可以分为相应的理解: 也就是说,连续性不能理解为生命周期,应理解为: 。
推荐你自己做的 Spring Boot 实战项目:
https://github.com/YunaiV/ruoyi-vue-pro
2. Message 实体是怎么来的?
结合对上述实体特征的理解,Message 很容易理解实体是如何获得的。毫无疑问,新闻场景聚集在一起。新闻实体是如何获得的?可以从另一个角度理解:为什么新闻被设计为实体?首先,看看新闻实体符号是否符合实体的两个特征。
标识(identity):消息场景中的区别是什么?标题?内容?这些都不好,为了保证消息 ,必须用标志来区分,而且必须是不可改变的。在新闻场景中,标题和内容可能相同,但这不是同一个新闻,就像我和我的双胞胎兄弟一样,但不是同一个人,可以说: ,所以。。。
连续性(continuity):有一次我们家吃饭,我不小心把饭碗打碎了,然后我妈打了我一顿。她有记笔记的习惯,记录我们兄弟的日常生活。例如,这次我们需要记录:我今天打了谁?但当时她打了我之后,却不记得打了我?还是我哥哥?然后她一个接一个地看着我们 和 ,确定今天打了谁?这是标志在生命周期中连续性的体现。 ,有时,当识别清楚时,需要连续性,但也有自己的生命周期连续性,如从新闻创建、管理到最终销毁,这个过程是新闻实体的连续性。
以上分析表明,新闻实体符合实体的两个特征,即新闻可以设计为实体。至于如何获得它?可以理解,新闻场景首先考虑的是新闻。就像我们的双胞胎一样,首先考虑的是我和我的双胞胎兄弟。
推荐你自己做的 Spring Cloud 实战项目:
https://github.com/YunaiV/onemall
3. 为什么发件人和收件人不是实体?
在之前的一篇博客文章中,园友有这样一个问题:联系人作为价值对象有点不明白,好处是什么?我回答说:
联系人作为价值对象,因为他不存储在消息系统中,是从外部获取的,它的存在依赖于消息,在消息系统的业务场景中,如果没有消息,它没有意义,对于消息,我只需要知道联系人的内容是什么,不需要具体的,人?还是邮箱?这个不在乎,不是说把联系人当值对象有什么好处,而是在这个业务场景下,设计更合理。
现在回复内容似乎有点牵强,不讨论对错,根据上述消息实体的分析模式,在消息场景中,查看发件人、收件人(统称为 ,发件人和收件人可能是同一联系人)是否具有实体特征。
标识(identity):联系人有标志吗?也就是说,联系人需要区分吗?答案当然是区分,否则收件箱、发件箱不能识别收件人、发件人,联系人可能有相同的名称,但两个不同的联系人,即在整个应用场景中,联系人必须 是的,不管它扮演的角色是发件人还是收件人,这个角色扮演的概念只是针某一具体消息来说,联系人所存在的意义(在这个消息中,这个联系人是发件人,但在另外一个消息中,有可能是收件人),但相对于整个消息场景, 。
连续性(continuity):这个可能没有消息实体的连续性好理解,联系人的连续性其实是依附于消息实体而言,它如果独立出来,自身在消息场景中,是没有连续性概念的,就比如在创建消息的时候,我需要判断收件人是否存在,存在的话就创建收件人对象,并赋予创建消息的收件人属性,还有就是消息在被阅读的时候,需要判断阅读人是否有阅读权限等等,这一些操作,就体现出联系人的连续性依附于消息实体,但不可否认,联系人的创建、使用、舍弃等操作,都可以理解围绕某一具体消息的生命周期,也就是联系人的连续性,而且在这个过程中, 。
在之前的理解中,联系人设计为值对象的想法是,把联系人看作是一个值,一个依附于消息实体的具体值,我只需要知道这个值就行了,具体体现就是 SenderID 或 RecipientID,其实这个就是联系人的标识,只是当时被两点所迷惑:
:在消息场景中,联系人的获取是从外部获得的,也就是说联系人不在消息场景中存储,也不进行管理,只是一个获取操作,这个和一般的实体场景不太一样,但仔细一想,不管它是从哪里获取的,这个不应该在消息场景中所关心,我应该专注于联系人在消息场景中的连续性。
:这个是最重要的迷惑点,或者说是我根本不了解实体和值对象到底应该是什么?联系人独立于消息,在消息场景中,没有任何意义,但不能因为这一点,就把它设计为值对象,有很多实体是依附关系,只要它存在标识和连续性,那它就是实体。
把联系人设计为值对象当然也有“好处”,比如可以减少对联系人的管理,因为如果联系人设计为值对象,那它就是一个值,也就没有对象的概念,但 ,我要加一个用户禁言功能,这个在现有的设计中就不好进行实现。像这种 的场景也很多,比如购物车应用中的 Order 和 Custorm,Custorm 依附于 Order,这个首先需要明确的是 ,如果是其他的场景下,那 Custorm 就不存在依附关系。
我和我双胞胎哥哥出生的时候,在我们的保温箱上,除了需要标明我们两个的”身份“之外,还需要标明我们爸妈的”身份“,具体标识可以用身份证号,这个就像消息实体中的 SenderID、RecipientID 一样,虽然它是一个”值“,但我还需要知道它具体标识的是哪个对象, ,就比如我和我双胞胎哥哥要根据这个身份证号,找到我们的父母一样。
4. 发件人、收件人是值对象?还是实体?
话不言多,总之一句话:发件人、收件人(联系人)需要设计为实体。
消息场景实体和值对象:
Message 消息实体和 Contact 联系人实体。
值对象若干(如 MessageState、MessageType 等)。
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,:
已在知识星球更新源码解析如下:
最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。
提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。
获取方式:点“”,关注公众号并回复 领取,更多内容陆续奉上。
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)