http://blog.sina.com.cn/s/blog_493a84550101534t.html
领域模型-谈实体对象和值对象
(2012-05-21 20:01:10)
对于实体Entity和值对象Value Object是领域驱动设计里面两个重要的模型对象。所以有必要对两者的关系和区别进行理解。以下部分内容直接引用自《领域驱动设计》一书相关内容。
首先对于实体Entity,实体核心是用唯一的标识符来定义,而不是通过属性来定义。即即使属性完全相同也可能是两个不同的对象。同时实体本身有状态的,实体又演进的生命周期,实体本身会体现出相关的业务行为,业务行为会实体属性或状态造成影响和改变。
真正的现实世界,每个事物都一定会有唯一的标识,关键点是我们实际的业务场景和需求是否需要管理到唯一标识。书里面举了一个例子,当我们发放的门票上有座位号的时候,座位需要作为独立的实体,座位号是唯一的标识。而当先到先座模式下,我们只关心剩余座位数,那么座位号并不是唯一标识。这跟我们的业务需求有关。
一个对象不由属性来定义,那么看人这个对象,身份证号是属性,其实也是对于人的唯一标识。不考虑本身身份证号的位数升级,一个身份证号会跟随你一辈子。但是对于人我们一般仍然会作为实体Entity来看待,因为人有状态,有对象演进的生命周期,会主动产生各种行为。
对于企业内信息系统,很多时候我们把员工工卡号作为唯一标识来使用,但是要意识到工卡号只是人员的一个属性。虽然工卡号本身不会出现两个重复的,但是该属性仍然可能演变,如果将工卡号作为唯一标识和ID,那么在该属性变化时候所有其余关联对象都将受到影响。从这个层面来看,一个唯一的内码ID才是可信的唯一标识。
而对于值对象Value Object,它用于描述领域的某个方面本身没有概念标识的对象,值对象被实例化后只是提供值或叫设计元素,我们只关心这些设计元素是什么?而不关心这些设计元素是谁。书里面谈到颜色,数字是常见的值对象。这种对象无状态,本身不产生行为,不存在生命周期演进。
也就是一个值。
首先对于实体Entity,实体核心是用唯一的标识符来定义,而不是通过属性来定义。即即使属性完全相同也可能是两个不同的对象。同时实体本身有状态的,实体又演进的生命周期,实体本身会体现出相关的业务行为,业务行为会实体属性或状态造成影响和改变。
真正的现实世界,每个事物都一定会有唯一的标识,关键点是我们实际的业务场景和需求是否需要管理到唯一标识。书里面举了一个例子,当我们发放的门票上有座位号的时候,座位需要作为独立的实体,座位号是唯一的标识。而当先到先座模式下,我们只关心剩余座位数,那么座位号并不是唯一标识。这跟我们的业务需求有关。
一个对象不由属性来定义,那么看人这个对象,身份证号是属性,其实也是对于人的唯一标识。不考虑本身身份证号的位数升级,一个身份证号会跟随你一辈子。但是对于人我们一般仍然会作为实体Entity来看待,因为人有状态,有对象演进的生命周期,会主动产生各种行为。
对于企业内信息系统,很多时候我们把员工工卡号作为唯一标识来使用,但是要意识到工卡号只是人员的一个属性。虽然工卡号本身不会出现两个重复的,但是该属性仍然可能演变,如果将工卡号作为唯一标识和ID,那么在该属性变化时候所有其余关联对象都将受到影响。从这个层面来看,一个唯一的内码ID才是可信的唯一标识。
而对于值对象Value Object,它用于描述领域的某个方面本身没有概念标识的对象,值对象被实例化后只是提供值或叫设计元素,我们只关心这些设计元素是什么?而不关心这些设计元素是谁。书里面谈到颜色,数字是常见的值对象。这种对象无状态,本身不产生行为,不存在生命周期演进。
也就是一个值。