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

Domain driven design 域驱动设计-值对象不可变,domain-driven-design,value-objects,Domain Driven Design,Value Objects,我试图理解价值客体的概念。值对象的一个方面是不可变的。我想知道,我们必须实现一个管理价值对象的东西吗?例如,Person是实体,Address是值对象。两个人有相同的地址 +我们可以为每个人分配相同的实例地址吗 +我们如何知道地址已经存在,所以不需要创建新地址 +我们如何管理价值对象 我不知道我对不变方面的理解是否正确。关于Eric Evans的领域驱动设计:解决软件核心的复杂性,value object的一个关键属性是它们通常是暂时的(即短暂的),为特定操作创建,然后被丢弃。如果您使用的编程语

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

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

  • 我不知道我对不变方面的理解是否正确。关于Eric Evans的领域驱动设计:解决软件核心的复杂性,value object的一个关键属性是它们通常是暂时的(即短暂的),为特定操作创建,然后被丢弃。如果您使用的编程语言没有任何内置的自动垃圾收集机制(如C、C++),则必须在其生命周期结束时手动释放内存。否则,您不需要任何繁重的实现来管理它们。(Eric Evan在比较
    实体
    值对象时也谈到了垃圾收集。)

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

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

  • 如果值对象经常更改
  • 它们的创建和/或删除过程在计算上非常昂贵
  • 它们的替换(而不是修改)破坏了系统的稳定性
  • 等等
  • 值对象的另一个方面是,它们没有概念标识。但这并不意味着它们不能具有低级标识符,例如在关系数据库中标记为主键的列。Eric Evans还谈到了实体和值对象之间的关联。因此,如果您决定在两个
    个人
    实体之间共享
    地址
    值对象,则可以通过查询数据库或实体可访问的任何共享内存数据结构来确定该地址是否已存在