2012-03-16 58 views
2

我刚开始学习领域驱动设计,和的几件事情之一是让我困惑的最多的是如何确定哪一个应该是实体,它应该是值对象DDD:分类实体/值对象

我知道,以确定实体/值对象,我们要立足于域范围内,在一个方面,一个域对象可以是实体的,在另一个,它可以是值对象,但还是有一些情况下,我不能决定

.eg解决 - 在客户管理应用程序(让我们只说一个应用程序来管理客户,添加/删除/更改状态,客户等)的情况下,地址显然是值对象,因为在这里我们并不需要一个地址来区分另一方面,2个客户可以拥有相同的地址 - 另一方面,在线上预订应用程序的情况下,我可以说地址是一个实体吗?因为现在我们需要他们的帐单地址来区分客户(忽略的情况下2个客户具有相同地址的时刻)

对我来说,地址是唯一的本身,所以它肯定已经有了身份。因此,域对象的身份不会决定它是一个实体还是值对象,如果是的话,那么选择的关键因素是什么?

另外一个例子,我有一个应用程序,它列出一个国家的多个领域,用户可以选择一个区域,并找到所有适合他们的搜索条件在这一领域的餐馆。在这种情况下,区域是一个值对象还是实体?目前我认为它更多的是一个实体,但仍不是很确定。每个区域是唯一的也是

我不知道我的问题是清澈还是不行,我尽我所能来解释我的想法目前

回答

6

,我认为你的一些困难,可能是在一些微妙的含义这些条款。例如,你提到“对我来说,地址本身是独一无二的,所以它肯定有身份”。就大多数人在领域驱动设计中如何使用“身份”而言,您的陈述可能不正确。

值对象的属性集的是其定义。如果你改变它的任何方面,你有一个完全不同的对象。使用你的地址例子,如果你改变了它的任何部分,你会得到一个完全不同的地址。它是不是与它的方面改变了相同的地址。您的客户转移到新地址;他们没有改变同一地址的方面。

但是,如果您是映射应用程序,并且地址本身已更改,则此处的地址将是实体。在这种情况下,城市规划人员可能希望重新在街道上重新编号。在这种情况下,同一地址正在被修改。在这种情况下,我们需要更新实体,而不是值对象。

关于你的帐单地址例如,账单地址很可能还是一个价值实体(至少是它的物理地址部分)。在该例子中,支付方法(例如信用卡)可以是实体,并且可以包括其他值对象(例如帐单地址,信用卡号码等)。

您可能会发现它有用看到检讨这个问题,它的答案,以及:Value vs Entity objects (Domain Driven Design)

希望这有助于。祝你好运!

+2

非常感谢你,你的解释是我正在寻找的东西,现在一切都更清晰 – 2012-03-19 15:42:47

+0

谢谢,Phuong,很高兴它帮助。 – 2012-03-19 21:16:05