验证数据

时间:2013-01-28 09:52:45

标签: java dependencies validation

我有两个验证员课程。让我们说:Car Validator和Wheel验证器,第二个是第一个。

CarBodyValidator.validate(){
    WheelValidator.validate();
}

我在CarBodyValidator中有更多验证器,fe EngineValidator等.valid()应该只返回true或false,并且我一次想要打印尽可能多的错误(如果验证对某些类返回false,我想验证其他课程,如果他们不相互依赖)。 现在,让我们说Wheel validator返回一个有用的信息,我需要在CarBody验证器中。 F.e如果车轮直径太大,那么我需要汽车验证器中的信息来验证其他内容。 我如何传递这些信息。我可以在Wheel验证器中创建一个存储参数的字段,但是可以像这样访问它:

carBodyValidator.validate(){
    wheelValidator.validate();
    if (WheelValidator.getSmomething() == somethingElse){
      ...
    }

}

似乎错了(我的意思是验证器应该只验证而不做其他任何事情)。这是正确的方法,还是我应该做的不同。

4 个答案:

答案 0 :(得分:1)

有多种方法可以做到这一点。一个就像你说的那样。让validate()返回一个布尔值并保留验证期间发生的一组错误。如果需要,您可以稍后询问这些错误。

更优雅的解决方案可能是使用validate()方法返回名为ValidationResults的特定类的实例。该类可以包含验证状态和错误集。

第三种选择可能是在validate()中抛出异常。虽然有人反对这种方法,因为不建议使用Exceptions来决定应用程序的执行流程,我发现它在某些情况下很有用。

希望它有所帮助,

答案 1 :(得分:1)

这对Visitor pattern来说是一个很好的应用。

这意味着您有一个传递给每个验证器的对象(访问者)。验证器向访问者报告他们的错误消息和/或将其传递给进一步的子验证器。

访问者存储传递给它的所有错误消息。之后,您可以阅读访问者收集的错误消息,并以您认为合适的任何方式处理它们。

答案 2 :(得分:1)

如果对象无效,则可以抛出异常,而不是返回指示验证是否通过的布尔值:

public void validateCar(Car car) throws ValidationException {
    if (car.getEngine() == null) throw new ValidationException("Engine is null", "engine");
}

ValidationException包含有缺陷的字段,然后可以在另一个验证器中重复使用。

但对我来说,当你知道对象无效时,似乎调用另一个验证器似乎有点不对。也许您应该合并这两个验证器并使其返回无效字段列表?

答案 3 :(得分:1)

在这种情况下,我经常依赖观察者模式。请注意这是所有伪代码。

创建ValidatorObserver接口。

public interface ValidatorObserver{
   public void notify(int errorKey);
}

让CarBodyValidator实现此界面。

public class CarBodyValidator implements ValidatorObserver{

    public void notify(int errorKey){
       switch(errorKey){
         //Evaluate cases and do something.
       }
    }
}

在WheelValidator上创建注册方法并设置通知

public class WheelValidator{
    private List<ValdiatorObserver> observers = new ArrayList<ValidatorObserver>();

    public void addObserver(ValidatorObserver observer){
       observers.add(observer);
    }

    public void validate(){
       //if validation fails
       for(ValidationObserver observer: observers){
          observers.notify(1); //1 is an error code
       }
    }
}

您的代码中某处需要注册观察者

CarBodyValiator cbValidator = new CarBodyValidator();
WheelValidator wheelValidator = new WheelValidator();
wheelValidator.addObserver(cbValidator);