Domain driven design 不应该';在下面的模型中,地址是值对象吗?

Domain driven design 不应该';在下面的模型中,地址是值对象吗?,domain-driven-design,entity,value-objects,Domain Driven Design,Entity,Value Objects,发件人: 假设公司和个人都有相同的邮件地址。 这些陈述中哪一个认为有效? 1.“如果我修改Company.Address,我希望Person.Address自动获得这些更改” 2.“如果修改公司地址,则不得影响个人地址” 如果1为true,则地址应为实体 如果2为true,则地址应为值对象 在上面的模型中,邮件地址不应该是一个值对象,因为即使公司和个人有相同的邮件,该邮件仍然没有概念标识 换句话说,如果最初是公司和个人共享初始值。address@gmail.com,但之后会收到新邮件。addre

发件人:

假设公司和个人都有相同的邮件地址。 这些陈述中哪一个认为有效?

1.“如果我修改Company.Address,我希望Person.Address自动获得这些更改”

2.“如果修改公司地址,则不得影响个人地址”

如果1为true,则地址应为实体

如果2为true,则地址应为值对象

在上面的模型中,邮件
地址
不应该是一个值对象,因为即使
公司
个人
有相同的邮件,该邮件仍然没有概念标识

换句话说,如果最初是
公司
个人
共享初始值。address@gmail.com,但之后会收到新邮件。address@gmail.com,那么我们可以论证邮件地址的首字母。address@gmail.com它本身并没有改变,而是由新的公司和个人取代。address@gmail.com?

因此,就我的理解而言,
地址
是共享的这一事实不足以赋予它个性(即身份)

谢谢

事实上,邮件有一个概念上的标识。问题在于,您并没有真正建模电子邮件地址,而是建模一个人的联系信息和/或一家公司的联系信息。 继续讨论这个主题,价值对象与身份对象更像是一个实现决策,而不是一个“绝对真理”

您可以使用一个不可变的值对象,当您告诉系统“将地址a更改为地址b”时,搜索person和company中地址a的所有实例,并立即将它们更新为指向地址b。(或者您可以只更新其中的一个)

使用非值联系人信息对象更强大。 与:

实际上,您可以让个人和公司都指向同一个联系人信息对象,因此当您更新其中一个对象时,您也会更新另一个对象。或者,您可以让它们中的每一个指向不同的联系人信息对象,这样当您更新其中一个对象时,您就不会修改另一个对象

顺便说一句:电子邮件具有概念上的身份,因为更改电子邮件地址实际上是谷歌上周对我所做的事情,当时他们将我的电子邮件地址从@googlemail.com改为@gmail.com。。。因此,如果有人同时拥有我和我公司的电子邮件,只需一次更新就可以同时更改这两个实例,因为在该会话中,我的电子邮件地址会自动更改。。。另一方面,如果我开始使用不同的电子邮件地址,我的联系信息会发生什么变化。。。我的旧电子邮件地址将仍然存在并保持不变


我的建议是使用identity对所有对象进行建模,除非它是一个非常好的域对象,无论出于何种原因(例如数字、字符串等),您都希望优化它作为值对象的使用。但请记住,这通常是一个实施决策,而不是某个领域的决策。

是的,您的理解是正确的。地址几乎总是一个值对象,因为在大多数域中,地址实际上只是一个值

今天,一家公司和一个人拥有相同的地址并不意味着如果一个地址发生变化,另一个地址也应该发生变化。如果存在这样的关系,则应通过显式约束对其进行建模,而不是将Address设置为实体


Eric Evans在其优秀的著作《地址论》中谈到了这一点,甚至提供了一个具体的例子,其中地址可能是一个实体——邮政服务,其领域围绕地址,个人地址的标识非常重要。

这是一个断章取义的典型案例

最初的问题(值对象如何存储在数据库中)并没有质疑模型的有效性,我的示例也没有强调这些问题。我的答案是关于持久性与实体/VO的比较

我使用了
Customer
Person
Address
这样的例子,纯粹是为了让我能与OP分享同样普遍存在的语言(我没有时间想出更好的例子)


我会按照这个建议(向上投票)

在什么情况下,一个人和一家公司会共享同一个邮件地址,这样一个人就会关心你提到的重复?作为一个价值对象建模的原因是地址概念和行为的反复出现。我刚刚开始学习模式和设计,现在我还不能给出任何有意义的完整示例。我的问题是从另一个帖子的引述中得到启发的,在帖子中,海报(比我经验丰富得多)建议,如果公司和个人都共享邮件地址,那么邮件地址就是实体。无论如何,你们似乎在建议地址应该是实体,我应该有一个很好的理由把它改为VO,但你们并没有详细说明原因。据我所知,“对象应该是一个值对象,除非证明不是这样”不,我并不是建议将地址建模为一个实体(这里并不是想把你们搞糊涂)。我的意思是,只有适当的需求/故事/用例/场景才能为您提供所需的反馈。您已经回答了我最初的问题,因此我会将其标记为已回答(在一天内),但如果您确实找到时间,您还可以帮我回答以下问题吗:我假设user1494736关于联系人信息对象是一个实体的说法是正确的,因为据我所知,联系人信息对象本身是可以修改的?如果答案是肯定的,您是否可以考虑将联系人信息对象视为值对象的情况?@user1483278:同样,这取决于您的需求。如果您不需要识别联系人信息,那么它肯定是一个有价值的对象;它也可以是一个实体,如果它将由多人共享,例如,“我的建议是用身份来建模所有东西…”嗨,根据,它应该是另一种方式-模型电动汽车
Contact Information
{
    string email;
}