值对象和实体的区别

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

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

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

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

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

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

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

 

posted @ 2016-05-14 23:33  Excelsior_Li  阅读(6643)  评论(0编辑  收藏  举报