将抽象属性作为自己的值对象

时间:2018-07-17 13:55:50

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

给出以下示例:

class Person {
  Integer age
  String lastName
  String firstName 
}

年龄属性应限制为特定的验证规则:
 -高于0

姓氏名字相同:
 -这些字符串不应包含特殊字符(例如数字,下划线等)
-长度应> 0


为了抽象化此验证策略,我应该创建诸如 age name 之类的值对象以封装验证:

class Age {
  Integer value
}

class Name {
  String value
}

class Person {
  Name lastName
  Name firstName
  Age age
}

实际上,我还可以保留代码DRY并重新使用我的值对象,但这似乎是“过度抽象”

1 个答案:

答案 0 :(得分:2)

侧边栏:falsehoods programmers believe about names

  

我应该创建年龄和姓名等值对象来封装验证

这是一个折衷:值类型的创建使您可以限制程序中要求验证的位置数。

使用强类型检查器,使用特定类型可以使编译器保护程序员免受一类错误的侵害。

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

它也将Age的消费者与内存中的表示隔离开来;例如,如果您稍后决定要更改年龄的 units ,或者该年龄应跟踪age = 0的特定时间,则可以在一个地方进行更改,而不是到处都是。 Parnas就是这样-Age成为在内存中使用整数表示的决策的边界。

当年龄不仅仅是域不可知类型时,“在代码中使用年龄的问题”这个问题容易回答。

反对-它增加了引入值类型的复杂性。

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