给出以下示例:
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并重新使用我的值对象,但这似乎是“过度抽象”
答案 0 :(得分:2)
侧边栏:falsehoods programmers believe about names。
我应该创建年龄和姓名等值对象来封装验证
这是一个折衷:值类型的创建使您可以限制程序中要求验证的位置数。
使用强类型检查器,使用特定类型可以使编译器保护程序员免受一类错误的侵害。
此外,值类型的创建为您提供了与状态相关的方法的自然归宿。
它也将Age的消费者与内存中的表示隔离开来;例如,如果您稍后决定要更改年龄的 units ,或者该年龄应跟踪age = 0的特定时间,则可以在一个地方进行更改,而不是到处都是。 Parnas就是这样-Age
成为在内存中使用整数表示的决策的边界。
当年龄不仅仅是域不可知类型时,“在代码中使用年龄的问题”这个问题容易回答。
反对-它增加了引入值类型的复杂性。
在很多情况下,定义特定于域的类型的好处大于成本。