代码之家  ›  专栏  ›  技术社区  ›  Simon Bruneaud

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

  •  0
  • Simon Bruneaud  · 技术社区  · 6 年前

    举个例子:

    class Person {
      Integer age
      String lastName
      String firstName 
    }
    

    财产 年龄 应限于特定的验证规则:
    -大于0

    同样适用于 名字 :
    -这些字符串不应包含特殊字符(例如数字、下划线等)
    -长度应为>0


    为了抽象这个验证策略,我应该创建值对象,例如 年龄 名称 为了封装验证:

    class Age {
      Integer value
    }
    
    class Name {
      String value
    }
    
    class Person {
      Name lastName
      Name firstName
      Age age
    }
    

    实际上,我也可以保持代码的干燥,并重新使用我的值对象,但这似乎是一种“过度抽象”。

    1 回复  |  直到 6 年前
        1
  •  2
  •   VoiceOfUnreason    6 年前

    边栏: falsehoods programmers believe about names .

    我应该创建诸如年龄和姓名这样的值对象来封装验证吗

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

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

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

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

    当年龄不仅仅是一种领域不可知论类型时,“我们在代码中使用年龄在哪里”这个问题更容易回答。

    相反,它增加了引入值类型的复杂性。

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