我有两个验证员课程。让我们说: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){
...
}
}
似乎错了(我的意思是验证器应该只验证而不做其他任何事情)。这是正确的方法,还是我应该做的不同。
答案 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);