概述
值对象由两个word组成:值+对象。值对象=值+对象,即一个值用对象的方式进行表述,来表达一个具体的固定不变的概念:
- 值是什么或者有什么特点?
固定不变,表述一个具体的概念。如数字1、2、3,字符串“hello world”,地址(北京市海淀区中关村)。 - 对象是什么或者有什么特点?
一切皆为对象,是对现实世界的抽象,用来描述一个具体的事物。
值的特征
- 表示一个具体的概念
- 通过值的属性对其识别
- 属性判等
- 固定不变
值对象的特征
- 描述了领域中的一件东西
- 不可变的
- 将不同的相关属性组合成了一个概念整体
- 当度量和描述改变时,可以用另外一个值对象予以替换
- 和其他值对象进行相等性比较(属性判等)
- 对协作对象没有副作用
综上所述,值对象包含了值所具有的全部特征。
值对象的持久化
- 单个值对象
将值对象中的属性作为所属实体的数据列来存储(比如,我们可以将地址的属性映射到用户实体中)。 - 多个值对像序列化到单个列
当每个用户只有一个地址时,用上面的方案即可。但如果有多个地址时,可以把一个集合序列化后塞到外层实体表的某一列中,极大的简化了系统的设计。 - 使用数据库实体保存多个值对像
使用数据库实体的形式保存值对象,这个比较符合传统的设计方式,但不是DDD推崇的方式,因为这种方式让值对象有了实体的影子。
因此,在进行持久化设计时,需谨记:
根据业务来驱动技术,即根据领域模型来设计数据模型,而不是根据数据模型来设计领域模型。
值对象的作用
- 有利于使用通用语言,简单明了表达业务领域,使设计更加简洁,充分提升系统的性能。
- 有利于使用建模值对象,领域中的某些对象,只需知道它是什么而无需关心它是哪个。所以建模值对象要结合通用语言的表述看其是否有值的含义和特征。
总结
In a word, 值对象就是将一个值用对象的方式进行表述,来表达一个具体的固定不变的概念。