IDDD 6 ValueObject

<< 实现领域驱动设计 >> 六: 值对象

值对象易于开发、测试和维护。
尽量使用值对象来建模,而不是实体。


img

MindMapping Source:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

* 值对象
** 特征
*** 度量或描述
度量或描述领域中的一件东西
*** 不变性
**** 只读,创建后不改变
**** 只通过构造函数赋值
*** 概念整体
**** 整体值对象
(Whole Value aka Value Object)
*** 可替换性
*** 相等性
*** 无副作用行为
**** 无副作用函数
(Side-Effect-Free Function)
** 最小化集成
*** 更少的职责假设
** 表示标准类型
*** Java里可用枚举来表示
** 测试
*** TDD
** 实现
*** 2个构造函数
**** 1.接受所有参数的
**** 2.浅复制其他值对象的
Shallow Copy
** 持久化
*** 拒绝数据建模泄露
**** 数据建模式次要的
根据领域模型来设计数据模型,
而不是根据数据模型来设计领域模型
*** 与ORM
**** 单个值对象
***** 直接映射
**** 保存多个值对象
***** 序列化到单个列
****** 缺点
******* 列宽限制
MySQL Varchar limit :65535
******* 不能查询
其内在属性不能作为SQl查询条件
******* 需自定义类型
***** 使用数据库实体
****** 缺点
******* 对象-关系抗阻
***** 使用联合表
****** 缺点
******* 需满足数据库范式
******* 每一个属性都不应该为NULL
******* 不能包含嵌套的集合
**** 枚举状态对象