Domain driven design ddd-如何正确识别值对象?

Domain driven design ddd-如何正确识别值对象?,domain-driven-design,value-objects,Domain Driven Design,Value Objects,我正在为我的实体建模,并且已经为此奋斗了很长时间。这是我的个人实体: Person ID Name Email Password City Phone Biography Rating Description 我尝试将这些属性划分为值对象,但到目前为止,我只能将它们转换为VOs(例如,City是一个包含城市名称和国家名称的VO) 我是否应该尝试创建更大的VO,例如将电子邮件和密码放在凭证VO中?我是否在与VOs的分离中走得

我正在为我的实体建模,并且已经为此奋斗了很长时间。这是我的
个人
实体:

Person
    ID
    Name
    Email
    Password
    City
    Phone
    Biography
    Rating
    Description
我尝试将这些属性划分为值对象,但到目前为止,我只能将它们转换为VOs(例如,City是一个包含城市名称和国家名称的VO)

我是否应该尝试创建更大的VO,例如将
电子邮件
密码
放在
凭证
VO中?我是否在与VOs的分离中走得太深了

非常感谢您的帮助

[编辑]


经过一些讨论,似乎最好的解决方案是将每个属性保留在其自己的VO中,但电子邮件和密码除外,它们应分组在“凭据”VO中。

值对象是由值唯一标识它们的对象,即由值来实现相等,而不是由显式属性(如ID)来提供唯一性。如果两个值对象的所有字段相等,则它们相等

当试图识别它们时,请遵循领域专家使用的语言。他们在讨论人的时候用什么词?它们是指凭据,还是电子邮件和密码

还要注意识别总是一起使用的属性组。例如,如果密码总是与电子邮件一起使用,那么将它们分组到凭据对象中是有意义的,因为您可以将行为推送到那里(即Credentials.Validate())

[更新]

根据需要强制执行的不变量,以下所有属性都是值对象的候选属性

名称

  • 名称是否有最小/最大值
  • 有不允许的字符吗
电子邮件

  • 它是一个有效的电子邮件地址吗
  • 两个人可以有相同的电子邮件地址吗
密码

  • 最小/最大长度
  • 必需的字符
  • 无效字符
电话

  • 这是一个有效的电话号码吗
  • 您如何处理国际拨号代码
评级

  • 额定值是否有允许的最小值和最大值
  • 如何计算?(这是经过计算的吗?)
说明

传记

城市

等等

如果为上述概念创建值对象而不是使用int或string等基本值,则可以将业务规则封装在值对象中


如果将电子邮件和密码结合使用,则可能需要将它们合并到凭据值对象中。i、 e.使用凭据等登录。。。您仍然可以访问凭据。如果需要在凭据对象之外使用电子邮件,请发送电子邮件。

值对象是由值唯一标识它们的对象,即相等是由值实现的,而不是提供唯一性的显式属性(如ID)。如果两个值对象的所有字段相等,则它们相等

当试图识别它们时,请遵循领域专家使用的语言。他们在讨论人的时候用什么词?它们是指凭据,还是电子邮件和密码

还要注意识别总是一起使用的属性组。例如,如果密码总是与电子邮件一起使用,那么将它们分组到凭据对象中是有意义的,因为您可以将行为推送到那里(即Credentials.Validate())

[更新]

根据需要强制执行的不变量,以下所有属性都是值对象的候选属性

名称

  • 名称是否有最小/最大值
  • 有不允许的字符吗
电子邮件

  • 它是一个有效的电子邮件地址吗
  • 两个人可以有相同的电子邮件地址吗
密码

  • 最小/最大长度
  • 必需的字符
  • 无效字符
电话

  • 这是一个有效的电话号码吗
  • 您如何处理国际拨号代码
评级

  • 额定值是否有允许的最小值和最大值
  • 如何计算?(这是经过计算的吗?)
说明

传记

城市

等等

如果为上述概念创建值对象而不是使用int或string等基本值,则可以将业务规则封装在值对象中


如果将电子邮件和密码结合使用,则可能需要将它们合并到凭据值对象中。i、 e.使用凭据等登录。。。您仍然可以访问凭据。如果需要在凭据对象之外使用电子邮件,请发送电子邮件。

您的电子邮件看起来可疑地是数据结构(CRUD)。在适当的DDD中,您从“创建人”这样的业务案例开始,然后找到表示人的模型概念

模型由一组组件和业务规则定义。您的组件通常是VO,因为它们是表示次要概念的模型,可以表示为没有明确标识的简单或复合值,并且封装了特定的业务约束。例如,
Email
VO确保您有一个有效的Email值

你应该让域名告诉你创建更大的VO是否有意义;通常你从一个VO开始,你会发现它是由其他VO组成的。一般来说,我们是自上而下的。您可以创建一个建模示例

当你没有领域专家时,这很困难,但你仍然可以尝试在商业案例中思考,并为每个案例确定任何特定的模型。如果您最终得到的主要是简单的结构和一些数据验证规则,那么您可能有一个足够简单的域,只需要我们