值对象和实体的区别

参考:http://culttt.com/2014/04/30/difference-entities-value-objects/

在常见的程序中,对象(Object)代表相关的属性和方法,例如,一个人可以成为一个对象,他有姓名,电子邮件地址和密码,以及其他的属性。在数据库中这个人是由一个ID代表,这意味着,我们可以改变他的姓名,电子邮件地址和密码,但是他仍然是同一个人,当一个对象可以改变他的属性,但仍然是同一个对象,那么我们叫它为一个‘实体’,一个实体是可变的(mutable),因为它可以改变他的属性同时不改变对象的身份。实体对象将维持身份,因为它有一个ID在数据库中。

试想一下,我们的应用程序中允许跟踪人们当前的位置。当人们能成功连接到互联网的时候,我们的应用程序会创建一个新的位置对象,此位置对象包含有经度和维度的属性。该位置的对象是一个‘值对象’,因为我们不关心对象的特定实例,我们只关心它的位置。同时代表这个位置的对象的属性是不能变的,如果它的经度或维度哪怕变了一点,都不能代表这个位置了,如果用户的位置变更了,那么我们可以简单的重新创建一个位置对象。当一个对象的属性不能改变,他被称为‘不可变的’(immutable)。

另外一个重要的区别是,值对象的平等不是基于身份。例如,当你创建一个位置对象,两个位置对象的经纬度是相同的,那么我们认为两个位置对象是相等的。但是实体就不一样了,因为不同ID的人,虽然有相同的名字,但是他们不会是同一个人。

到底什么时候使用实体以及什么时候使用值对象呢?那么真正决定的是应用程序的上下文环境。

试想一下,上面例子中,如果我们的应用不是常见的应用,而是一个对不同位置参观人数的统计的应用程序呢。这时,每个位置都应该有一个唯一的标识符,来作为一个实体存入数据库中,然而人则不是我们关心的实体了,我们关心的只是有人经过这个地方了,这时任何人对于系统来说就是不变的。

因此,无论对象是一个实体或值对象真的取决于你如何在应用程序的上下文中使用它。如位置,日期,数字或货币,一般来说都是值对象,而人,产品,文件几乎都是实体。

时间: 2024-12-26 03:21:15

值对象和实体的区别的相关文章

应用程序框架实战十六:DDD分层架构之值对象(介绍篇)

前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持.本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分. 如果说你已经在使用DDD分层架构,但你却从来没有使用过值对象,这毫不奇怪,因为多年来养成的数据建模思维已经牢牢把你禁锢,以致于你在使用面向对象方式进行开发时,还是以数据为中心. 当我们完成了基本的需求分析以后,如果说需要进行设计,那么你能想到的就是数据库表及表关系的设计,这就是数据建模.数据建模的主要依据是数据库范式设计,根据要求严格程度的递增分为

聚合(根)、实体、值对象精炼思考总结

1.      聚合根.实体.值对象的区别? 从标识的角度: 聚合根具有全局的唯一标识,而实体只有在聚合内部有唯一的本地标识,值对象没有唯一标识,不存在这个值对象或那个值对象的说法: 从是否只读的角度: 聚合根除了唯一标识外,其他所有状态信息都理论上可变:实体是可变的:值对象是只读的: 从生命周期的角度: 聚合根有独立的生命周期,实体的生命周期从属于其所属的聚合,实体完全由其所属的聚合根负责管理维护:值对象无生命周期可言,因为只是一个值: 2.      聚合根.实体.值对象对象之间如何建立关联

[译文] 实体与值对象到底是不是一回事?

[译文] 实体与值对象相同吗? (Is Entity the same as Value Object?) 原文: Is Entity the same as Value Object? In this post, we'll discuss an interesting question about whether the concepts of Entity and Value Object are the same. 在这篇文章中, 我们将讨论一个有趣的问题, 关于实体与值对象的概念是否相

领域驱动设计之实体、值对象、领域服务

建立领域模型的第一步就是需要识别出实体.值对象与领域服务. 一.实体 1.实体是领域中需要唯一标识的领域概念.通常在业务中,需要唯一标识与区分的对象并需要持续对它进行跟踪,这样的对象我们认为是实体. 2.如果两个实体所有状态都一样,但如果标识不一样,就是两个不同实体.比如订单对象就应该是实体,就算两个订单的订单日期.订单总额等信息都一样,只要标识不一样,比如订单号,我们就认为它们是不同的实体. 3.实体只保留必要的属性与行为.比如一个客户实体应该保留客户的基本信息,但像国家.省.城市.街道等信息

DDD领域驱动设计之聚合、实体、值对象

关于具体需求,请看前面的博文:DDD领域驱动设计实践篇之如何提取模型,下面是具体的实体.聚合.值对象的代码,不想多说什么是实体.聚合等概念,相信理论的东西大家已经知晓了.本人对DDD表示好奇,没有在真正项目实践过,甚至也没有看过真正的DDD实践的项目源码,处于极度纠结状态,甚至无法自拔,所以告诫DDD爱好者们,如果要在项目里面实践DDD,除非你对实体建模和领域职责非常了解(很多时候会纠结一些逻辑放哪里好,属于设计问题)以及你的团队水平都比较高认同DDD,否则请慎重...勿喷! 代码在后,请先看D

引用类型变量,对象,值类型,值传递,引用传递 区别与定义

一.Java中什么叫做引用类型变量? 引用:就是按内存地址查询       比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里 new了一个String类型的空间,在运行时是 栈内存里的 s 指向堆内存里的那一块存储空间 基本数据类类型存的是数值本身,而引用类型变量在内存放的是数据的引用,并不是数据的本身, 引用类型变量是以间接方式去获取数据. 引用类型变量都属于对象类型,如:数组.类.字符串等都属于引用类型变量.所以,引用类型 变量里面存

详细介绍VO(值对象)和PO(持久对象)的区别

VO,值对象(Value Object),PO,持久对象(Persisent Object),它们是由一组属性和属性的get和set方法组成.从结构上看,它们并没有什么不同的地方.但从其意义和本质上来看是完全不同的. 1.VO是用new关键字创建,由GC回收的. PO则是向数据库中添加新数据时创建,删除数据库中数据时削除的.并且它只能存活在一个数据库连接中,断开连接即被销毁. 2.VO是值对象,精确点讲它是业务对象,是存活在业务层的,是业务逻辑使用的,它存活的目的就是为数据提供一个生存的地方.

MongoDB学习笔记~MongoDB实体中的值对象

回到目录 注意,这里说的值对象是指在MongoDB实体类中的,并不是DDD中的值对象,不过,两者也是联系,就是它是对类的补充,自己本身没有存在的价值,而在值对象中,也是不需要有主键Id的,这与DDD也是不谋而合的,也是可以理解的,因为它只是对主对象的一种补充说明,自己不存在任何意义,所以要主键也没什么用,呵呵. 看一个MongoDB的值对象contact public class Person { public Person() { Contact = new Test.Contact(); A

DDD实战12 值对象不创建表,而是直接作为实体中的字段

这里的值对象如下风格: namespace Order.Domain.PocoModels { //订单地址 //虽然是值对象 但是不继承ValueObject //因为继承ValueObject会有Id属性 我们不为它创建独立建表不要Id public partial class OrderAdress { public string Province { get; set; } public string City { get; set; } public string Zero { get