域驱动设计 - 值对象不可变

时间:2014-12-31 04:29:42

标签: domain-driven-design value-objects

我试图理解价值对象的概念。值对象的一个​​方面是不可变的。我想知道我们必须实现一个管理价值对象的东西吗?例如,Person是实体,Address是值对象。两个人有相同的地址。

  1. +我们可以为每个人分配相同的实例地址吗?
  2. +我们如何知道已存在的地址,因此我们不需要创建新的地址?
  3. +我们如何管理价值对象?
  4. 我不知道我是否理解不可改变的方面是否正确。你能就此事向我提出建议吗?

1 个答案:

答案 0 :(得分:2)

参考Eric Evans' 领域驱动设计:解决软件核心中的复杂性,价值对象的一个​​关键属性是它们通常是瞬态(即短期),为特定操作创建然后丢弃。如果您使用的编程语言没有任何内置的自动垃圾收集机制(如C,C ++),则必须在生命周期结束时手动释放内存。否则,您不应该需要任何重型实施来管理它们。 (Eric Evan在比较EntitiesValue Objects时谈到了垃圾收集。)

值对象的不可变方面只是意味着一旦创建,除非完全替换整个对象,否则不能修改它们的任何属性。因此,如果两个Person实体共享相同的Address值对象,并且其中一个实体更改了其地址,则将创建一个新的单独Address值对象来表示新地址。

当然,这不是一个顽固的规则。可变值对象的合法案例包括:

  1. 如果值对象频繁更改,
  2. 他们的创建和/或删除过程计算成本很高,
  3. 他们的替换(而非修改)会破坏系统的稳定性,
  4. 价值对象的另一个方面是他们没有概念身份。但这并不意味着他们不能拥有低级别标识符,例如在关系数据库中标记为主键的列。 Eric Evans还谈到了实体和价值对象之间的关联。因此,如果您决定在两个Address实体之间共享Person值对象,则可以通过查询数据库或实体可访问的任何共享内存数据结构来确定该地址是否已存在。 / p>