【问题标题】:Domain Driven Design - Value object immutable领域驱动设计 - 值对象不可变
【发布时间】:2015-02-27 05:58:01
【问题描述】:
我正在尝试理解值对象的概念。值对象的一方面是不可变的。我想知道我们是否必须实现一个管理值对象的东西?例如,Person 是实体,Address 是值对象。两个人有相同的地址。
- + 我们可以为每个人分配相同的实例地址吗?
- + 我们怎么知道地址已经存在所以我们不需要创建新地址?
- + 我们如何管理价值对象?
我不知道我对不可变方面的理解是否正确。你能就这件事给我建议吗?
【问题讨论】:
标签:
domain-driven-design
value-objects
【解决方案1】:
参考 Eric Evans 的领域驱动设计:解决软件核心的复杂性,值对象的一个关键属性是它们通常是瞬态(即短-lived),为特定操作创建,然后丢弃。如果您使用的编程语言没有任何内置的自动垃圾收集机制(如 C、C++),您将不得不在其生命周期结束时手动释放它们的内存。否则,您不需要任何繁重的实施来管理它们。 (Eric Evan 在比较 Entities 和 Value Objects 时也谈到了垃圾收集。)
值对象的不可变方面仅仅意味着一旦创建,它们的任何属性都不能被修改,除非完全替换整个对象。因此,如果两个Person 实体共享同一个Address 值对象,其中一个更改了她的地址,则会创建一个新的单独的Address 值对象来表示新地址。
当然,这不是一个顽固的规则。可变值对象的合法案例包括:
- 如果值对象经常变化,
- 它们的创建和/或删除过程的计算成本很高,
- 它们的替换(而不是修改)会破坏系统的稳定性,
- 等
值对象的另一个方面是它们没有概念上的身份。但这并不意味着它们不能具有低级标识符,例如在关系数据库中标记为主键的列。 Eric Evans 还谈到了实体和值对象之间的关联。因此,如果您决定在两个 Person 实体之间共享一个 Address 值对象,则可以通过查询数据库或实体可访问的任何共享内存数据结构来确定该地址是否已存在。