知识卡片
值对象的核心特征:无标识、基于属性值、不可变
内容
值对象是通过对象属性值来识别的对象,它把多个相关属性组合成一个概念整体,用来描述领域的某个特定方面,本身没有标识符(ID)。值对象是不可变的:当描述的内容发生变化时,不是去修改这个值对象,而是直接用另一个新的值对象整体替换掉旧的;值对象之间做相等性比较,依据的不是ID,而是属性值本身是否相同。举例来说,一个人员实体原本包含姓名、年龄、性别以及省、市、县、街道等零碎属性,把”省、市、县、街道”这几个描述地址的属性拿出来,单独组成一个”地址”属性集合,这个集合就是一个地址值对象——它没有自己的ID,只是描述”这个人住在哪里”这个特定方面。值对象的价值在于让领域建模时属性归类更清晰、概念更完整,避免实体上堆满零碎的属性;代码层面,单一属性的值对象直接作为实体类的一个字段,多属性的值对象则设计成单独的值对象类(没有ID字段),被实体整体引用。
参考来源
- 位置:第7章《实体和值对象:领域模型的基础单元》"7.2 值对象"(源文件:_epub-src/OEBPS/Text/chapter3-3-2.xhtml)
- 结论依据:原文说明"值对象是通过对象属性值来识别的对象,它将多个相关属性组合为一个概念整体,用于描述领域的某个特定方面,并且是一个没有标识符的对象……当度量和描述改变时,我们可以用另外一个值对象予以替换。它可以和其他值对象进行相等性比较,不过不是基于ID,而是基于值对象的属性",直接支撑本卡片结论。
- 原始内容:值对象是通过对象属性值来识别的对象,它将多个相关属性组合为一个概念整体,用于描述领域的某个特定方面,并且是一个没有标识符的对象……人员实体原本包括:姓名、年龄、性别以及人员所在的省、市、县和街道等属性……我们可以将"省、市、县和街道"等属性拿出来,构成一个地址的属性集合。