【问题标题】:Java - Designing a validator, class hierarchyJava - 设计验证器,类层次结构
【发布时间】:2013-01-14 12:00:23
【问题描述】:

我正在为某些对象(这些对象的字段)设计验证器。这些对象包含在一个更大的对象 - 容器中。

示例:汽车作为容器。由车轮、发动机、车身组成。 假设我需要验证车轮的直径是否正确、发动机的容量是否正确、车身是否有一定的长度等。

理论上我认为我应该在构建容器(汽车)之前验证所有内容。

实现这一目标的最佳方法是什么?我是否使用 validate() 方法创建一个抽象验证器类并在每个封闭类中实现它?容器呢,我是否根本不将它包含在验证过程中?感谢您的帮助。

【问题讨论】:

  • 如果有效组件不匹配,也可能由有效组件制成无效容器,因此您可能需要对整个容器进行严格的验证。

标签: java inheritance validation class-hierarchy


【解决方案1】:

我建议您不要将验证逻辑放入您要验证的类中。

我发现最好将这些类保留为值对象,并创建一个并行的验证器层次结构,每个要验证的实体大致一个。或者,您也可以创建一个可以验证所有实体的验证器:但是,此解决方案的可扩展性较差,并且在您必须添加新实体时可能会违反open-closed principle(例如,您还想处理汽车的后视镜)。

假设你选择one entity : one validator的方式,容器的验证器会先验证容器内的组件,然后再验证它们是否适合。

还请考虑使用验证器框架(例如Apache Commons Validator)的可能性,这可以使您免于编写样板代码。但是,由于我不知道您必须执行什么样的复杂验证,所以我不知道它是否符合您的需求。

此外,我认为您不必担心在构建所有内容之前对其进行验证。只需构造它并在之后进行验证:然后,如果它违反了验证规则,您可以将其丢弃(即不要将其持久存在任何地方)。

【讨论】:

  • 完全。将验证放在类中会破坏 SRP。
【解决方案2】:

我同意 gd1 的回答。一种方法是为每个值对象设置一个 ValidatorAdapter。所以它看起来像这样:

public class GreenCarValidator {
   public GreenCarValidator(Car car) {
      // save reference
   }

   @Override 
   public boolean isValid() {
      return car.getColor().equals("green");
   }
}

public class RedCarValidator {
   public RedCarValidator(Car car) {
      // save reference
   }

   @Override 
   public boolean isValid() {
      // you could compose more validators here for each property in the car object as needed
      return car.getColor().equals("red");
   }
}

现在,您可以为单一类型的对象拥有多种类型的验证器,这些验证器是动态的并且在运行时可配置。如果您将“valid()”方法放入类中,而 gd1 建议您不要这样做,您将失去这种灵活性。

【讨论】:

    【解决方案3】:

    您可以使用 validate 方法创建一个 ValidatablePart 接口,让所有部件实现此接口,然后让容器在将所有封闭部件添加到容器时或在调用容器的构建或任何方法时验证它们应该构造它。

    您的 Container 类可以遵循 Template Method Design Pattern

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-21
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 2014-12-06
      • 1970-01-01
      相关资源
      最近更新 更多