DDD中子实体和值对象之间的区别

时间:2019-07-06 14:11:18

标签: domain-driven-design

我发现this great articleaggregates' structure的部分中,我可以看到子实体(这里是订购商品)和值对象(此处为地址)。

enter image description here

我不完全确定它们在体系结构级别上有何不同。我想说的是,它们都是值对象(聚集在根 Order 内)。

图片中我缺少什么?

1 个答案:

答案 0 :(得分:2)

值对象比“对象”具有更多的“带有方法的值”。

“地址”作为值,与整数之类的基元没有根本区别。两者之间的重大区别是,大多数通用编程语言都不带有内置地址类型。因此,我们必须自己动手-或从库中重复使用一个。

在许多现代语言中,只能使用“对象”惯用法来创建自己的自定义数据结构和所需的查询语义。

值对象是附加了查询语义的数据。

另一方面,实体会随着时间而变化。思考实体实现的一种方式是,在幕后,该实体是对值的可变引用。

void Entity::onChange(data) {
    // dereference to get the current state value
    val oldState = this.state;

    // use a pure function to compute a new state value
    val newState = stateChange(oldState, data);

    // update the reference
    this.state = newState;
}

用于保持状态的特定数据结构是解决方案中其他元素不感兴趣的实体的实现细节。

子实体是一个实体,也就是说,它是一个对象,负责管理某些隐式数据结构。它是为改变而设计的。

“就像根一样”,但是规模较小-根对整个上下文有更完整的理解。

另请参见