【问题标题】:Abstract properties as own value objects作为自有值对象的抽象属性
【发布时间】:2018-07-17 13:55:49
【问题描述】:

举个例子:

class Person {
  Integer age
  String lastName
  String firstName 
}

age 属性应受限于特定的验证规则:
- 高于 0

lastNamefirstName 相同:
- 这些字符串不应包含特殊字符(例如数字、下划线、...)
- 长度应 > 0


为了抽象出这个验证策略,我是否应该创建诸如agename之类的值对象来封装验证:

class Age {
  Integer value
}

class Name {
  String value
}

class Person {
  Name lastName
  Name firstName
  Age age
}

确实,我也可以保持代码 DRY 并重用我的值对象,但这似乎是“过度抽象”

【问题讨论】:

    标签: oop domain-driven-design abstraction value-objects


    【解决方案1】:

    侧边栏:falsehoods programmers believe about names.

    我是否应该创建值对象(例如年龄和姓名)来封装验证

    这是一种权衡:创建值类型允许您限制程序中需要验证的位置数量。

    使用强类型检查器,使用特定类型允许编译器保护程序员免受一类错误。

    此外,值类型的创建为您提供了与状态相关的方法的自然归宿。

    它还将 Age 的消费者与内存中的表示隔离开来;例如,如果您稍后决定要更改年龄的单位,或者该年龄应跟踪年龄 = 0 的特定时间,那么您可以在一个地方进行更改,而不是无处不在。这来自Parnas——Age 是决定在内存中使用整数表示的边界。

    当年龄不仅仅是与领域无关的类型时,“我们在代码中哪里使用年龄”的问题更容易回答。

    与此相反 - 它确实增加了引入值类型的一些复杂性。

    在许多情况下,定义特定领域类型的好处大于成本。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多