6

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

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

从理论上讲,我认为我应该在建造容器(汽车)之前验证一切。

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

4

3 回答 3

3

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

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

假设您选择了该one entity : one validator方法,容器的验证器将首先验证容器内的组件,然后验证它们是否适合在一起。

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

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

于 2013-01-14T12:05:13.010 回答
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 建议您不要这样做,您将失去这种灵活性。

于 2013-04-13T04:15:59.587 回答
1

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

您的 Container 类可以遵循模板方法设计模式

于 2013-01-14T12:07:40.000 回答