美文网首页
DDD如何区分实体和值对象

DDD如何区分实体和值对象

作者: 后厂村老司机 | 来源:发表于2021-09-17 20:18 被阅读0次

前言

实体和值对象的区分是领域驱动设计中的老大难问题,建模过程中是必然会遇到的问题,我们在落地领域驱动设计过程中就遭遇了这类问题,下面介绍下我们落地过程中的经验。

实体

实体是指在你这个领域存在的一个对象,多数时候这个对象是一个现实世界对象的抽象,比如一个Person、一个User、一个Book、一个Order,就是人、用户、书、订单抽象出来的对象。极少数时候在现实世界中没有这种映射,但无论现实世界有没有映射,在领域通用语言建模的时候、事件风暴的时候,实体都是可以被识别出来的。
实体的特征:

  • 有唯一性,即在领域中这个对象是唯一的,比如person有personid、order有orderid,这个唯一标识不要理解成为数据库做主键的;需要从领域角度考虑它是唯一的
  • 有状态,同一个实体在不同时间或者不同场景下状态可以是不一样的。所谓状态指的就是实体对象的属性是可变的。同一个id的实体属性不同,说明实体的状态不同
  • 有改变状态的方法,一个实体会提供修改其属性的方法,但这些方法可不是简单的setter方法,应该是经过业务建模后识别出的业务逻辑方法,即方法里会做一些业务逻辑,顺便修改属性

值对象

值对象是用来度量和描述事物的对象,比如文本字符串、比如时间、比如数字,还有更加详细的值对象比如外国人全名(姓氏、名字)、比如货币(20 美元),比如电话号、地址等。
值对象的特征:

  • 可以度量和描述领域中的一件东西
  • 可以作为常量
  • 可以把不同的相关属性组成一个概念整体,如全名、金钱、地址等
  • 可以被另一个值对象替换
  • 可以和其他值对象做相等性比较
  • 方法无副作用

实体与值对象的区别

相等性

  • 判断两个实体是否是相同的,只需要比较实体的id是否相同
  • 判断两个值对象是否相等,需要equals方法比较值对象内部的所有属性是否相等

唯一性

  • 实体在领域内是唯一的,即使状态有变化实体还是原来的实体
  • 值对象在领域内是可替换的(可以通过相同属性的另一个对象替换),非唯一的

生命周期

  • 实体有自己的生命周期,有自己的历史,有连续的改变轨迹
  • 值对象没有自己的生命周期,要么被创建、要么被JVM垃圾回收,没有连续的改变轨迹,单独存在没有意义,只有依附到某个实体上才有意义

相关文章

  • DDD如何区分实体和值对象

    前言 实体和值对象的区分是领域驱动设计中的老大难问题,建模过程中是必然会遇到的问题,我们在落地领域驱动设计过程中就...

  • 架构思维学习总结(十九)

    5-3 DDD之战术设计 一、值对象和实体 Value object :从字面理解就是系统中对象的值,描述领域中...

  • 领域模型核心概念:实体、值对象和聚合根(未完工)

    聚合根、实体和值对象 实体有ID标识,有生命周期,有状态(用值对象来描述状态),实体通过ID进行区分聚合根是实体,...

  • DDD之3实体和值对象

    图中是一个别墅的模型,代表实体,可以真实的看得到。那么在DDD设计方法论中,实体和值对象是什么呢? 背景 实体和值...

  • 战术模式--值对象

    值对象虽然经常被掩盖在实体的阴影之下,但它却是非常重要的 DDD 概念。 值对象不具有身份,它纯粹用于描述实体的特...

  • DDD理论学习系列(11)-- 工厂

    DDD理论学习系列——案例及目录 1.引言 在针对大型的复杂领域进行建模时,聚合、实体和值对象之间的依赖关系可能会...

  • 百问中台:基于DDD的中台实体对象

    1 概述 实体对象由两个word组成:实体+对象。在DDD中,实体作为一个领域概念,在设计实体时需要从领域出发。 ...

  • 大话DDD — 服务、实体、值对象、聚合根

    基于DDD的程序设计,就是将前面的领域模型映射成数据架构中的程序设计,从而通过领域驱动提升软件设计质量,那么应该进...

  • JavaScript(三)数据类型的判断

    一、typeof() typeof() 用于区分不同类型的原始值,并区分原始值和对象,但是在区分不同类型的对象(包...

  • DDD

    实体与值对象的区别: 实体拥有标识,而值对象没有。 相等性测试方式不同。实体根据标识判等,而值对象根据内部所有属性...

网友评论

      本文标题:DDD如何区分实体和值对象

      本文链接:https://www.haomeiwen.com/subject/pcgjgltx.html