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



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

  1. + 我们可以为每个人分配相同的实例地址吗?
  2. + 我们如何知道地址已经存在,因此我们不需要创建新地址?
  3. + 我们如何管理价值对象?

我不知道我是否正确理解不可变的方面。 你能就这件事给我建议吗?

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

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

当然,这不是一条顽固的规则。可变值对象的合法情况包括:

  1. 如果值对象频繁更改,
  2. 它们的创建和/或删除过程在计算上是昂贵的,
  3. 它们的更换(而不是修改)会破坏系统的稳定性,
  4. 等。

值对象的另一个方面是它们没有概念标识。但这并不意味着它们不能在关系数据库中具有低级标识符,例如标记为其主键的列。埃里克·埃文斯还谈到了实体和价值对象之间的关联。因此,如果您决定在两个Person实体之间共享 Address 值对象,则可以通过查询数据库或实体可访问的任何共享内存中数据结构来确定地址是否已存在。

相关内容

  • 没有找到相关文章

最新更新