【问题标题】:DDD - Value Objects Vs. Entity ObjectsDDD - 值对象与。实体对象
【发布时间】:2010-10-04 07:20:51
【问题描述】:

我是 DDD 的新手,正在努力理解一些概念。您如何确定您的域中哪些对象是 Entity 对象,哪些是 Value 对象,以及它们究竟是如何区别对待的?

【问题讨论】:

  • 找到了很好的解释here

标签: design-patterns domain-driven-design value-objects entityobject


【解决方案1】:

在我看来,领域对象基本上代表您的业务领域的名词,并且 确实 具有标识,而值对象对业务没有任何特殊意义(想想 MonetaryAmount)并且没有身份。

【讨论】:

  • 我认为 entity == "thingy that as a noun" 是一种非常幼稚的方式来为您的域建模。值对象对业务可能具有非常特殊的意义。如果您进行货币兑换,MonetaryAmount 可能意味着非常特别的东西,但它仍然是一个价值对象。
【解决方案2】:

来自Jak Charlton's blog

实体“这是我的实体,有很多喜欢它,但这个是 我的”

实体的关键定义特征是它具有 身份——它在系统内是唯一的,没有其他实体,没有 不管同一个实体有多么相似,除非它具有相同的身份。

身份可以在实体上以多种方式表示 - 它可以是 数字标识符(经典的 CustomerID),它可以是一个 Guid( 经典的......哦,没关系),或者它可能是一个自然键(比如 CustomerNumber 您的客户是由您的 CRM 系统提供的,当时他们 首先从您那里购买)。

无论您选择哪种方式来表示它,实体都是由 有一个身份。

值对象 值对象的关键定义特征是 它没有身份。好吧,也许有点简单,但是 值对象的意图是通过它的 属性而已。两个 VO 可能具有相同的属性,在这种情况下 它们是相同的。然而,它们没有任何价值,除了 由于他们的属性。

VO 的另一个共同点是它们可能应该是 不可变的,一旦创建它们就无法更改或更改。你可以 创造一个新的,因为他们没有身份,那是一样的 就像改变另一个一样。

在汽车工厂系统应用程序中的 POO 中的 Car Class 中思考(无牌照)。即使两辆车相同(相同的型号、发动机、颜色、重量等),每辆车都是独一无二的,并且可以通过身份 Vehicle Identification Number 来区分。

两辆车可以相等,因为它的属性Car1.equals(Car2),但不是同一辆车,因为它的VIN Car1 != Car2。如果一辆汽车改变了它的颜色,它不是其他汽车,它是具有其他属性的同一辆汽车。这是一个实体。

现在考虑带有nameRGB 字段的颜色类(用于汽车)。青色名称中有'Cyan'R = 0 G = 255 B = 255。不需要其他身份字段,因为它的属性是它的身份。颜色是 VO 并且必须是不可变的,因为更改名称或 RBG(或两者)代表其他颜色......或者如果名称和 RGB 不匹配,则在这种情况下会出现错误;)

Color1.equals(Color)Color1 == Color2 必须始终具有相同的结果。

【讨论】:

    猜你喜欢
    • 2012-07-08
    • 2012-04-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    相关资源
    最近更新 更多