我试图理解价值对象的概念。值对象的一个方面是不可变的。我想知道我们必须实现一个管理价值对象的东西吗?例如,Person是实体,Address是值对象。两个人有相同的地址。
我不知道我是否理解不可改变的方面是否正确。你能就此事向我提出建议吗?
答案 0 :(得分:2)
参考Eric Evans' 领域驱动设计:解决软件核心中的复杂性,价值对象的一个关键属性是它们通常是瞬态(即短期),为特定操作创建然后丢弃。如果您使用的编程语言没有任何内置的自动垃圾收集机制(如C,C ++),则必须在生命周期结束时手动释放内存。否则,您不应该需要任何重型实施来管理它们。 (Eric Evan在比较Entities
和Value Objects
时谈到了垃圾收集。)
值对象的不可变方面只是意味着一旦创建,除非完全替换整个对象,否则不能修改它们的任何属性。因此,如果两个Person
实体共享相同的Address
值对象,并且其中一个实体更改了其地址,则将创建一个新的单独Address
值对象来表示新地址。
当然,这不是一个顽固的规则。可变值对象的合法案例包括:
价值对象的另一个方面是他们没有概念身份。但这并不意味着他们不能拥有低级别标识符,例如在关系数据库中标记为主键的列。 Eric Evans还谈到了实体和价值对象之间的关联。因此,如果您决定在两个Address
实体之间共享Person
值对象,则可以通过查询数据库或实体可访问的任何共享内存数据结构来确定该地址是否已存在。 / p>