【问题标题】:Are these values also Value Objects?这些值也是值对象吗?
【发布时间】:2012-07-11 18:08:54
【问题描述】:

我想我理解 Value Objects(它们没有概念上的身份,其属性集是其定义等)以及它们与 Entities 的区别,但我仍然不知道直接分配给 Entity 属性的原始类型 (int, string ...) 的值是否也被视为配音

例如,在下面的代码中,分配给Person.Name 的对象(类型为Name)是一个VO,但是是分配给Person.FirstNamePerson.LastName 和@987654325 的值@ 也被视为 VO

public class Person
{
    public string FirstName = ...
    public string LastName = ...
    public int Age = ...

    public Name Name = ...
               ...
} 

public class Name
{
    public string FirstName = ...
    public string LastName = ...
    public int Age = ...
}

谢谢

【问题讨论】:

  • 视情况而定。我会说 First/LastName 可能最终出现在 Name VO 中,而 Age 将在它自己的 VO 中表示。但同样,如果没有使其有价值的特定背景和行为,很难说。

标签: domain-driven-design value-objects


【解决方案1】:

值是原始类型(例如stringint)还是由原始类型组成的复杂类型(例如Name)都没有关系。重要的是您将其视为没有任何身份的单纯“价值”——那么它就是一个价值对象。

将其保留为原语还是将其包装在类中的决定是实现细节。与原始类型相比,特定类型在未来更容易扩展/添加功能。

【讨论】:

    【解决方案2】:

    检查这个related question...值对象更像是一个“概念”对象的实现...如果您考虑一下,单例和享元模式是将具有标识的对象转换为值对象优化目的......它也与选择实现可变或不可变的东西有关。你总是可以说 Person 是不可变的,但一段时间后,你是一个具有不同属性的“新”人。这是一个实施决策,而不是领域或概念决策。 (不可变的东西往往是值对象,而可变的东西往往是标识对象)。

    【讨论】:

    • 这实际上违背了领域驱动设计的本质。我认为您将域设计概念(例如作为概念工具的实体和值对象)与标准设计模式(例如作为实现工具的单例和享元)混淆了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多