避免两次遍历验证器列表
Avoid two passes over a list of validators
我正在使用以下代码验证传递给文件中一系列命令的参数:
for (Parameter p : s.getCommand(idx).getParameters()) {
for (ValidationFactory.TYPES validationType : ValidationFactory.TYPES.values()) {
validator = ValidationFactory.getValidator(validationType, errors);
try {
validator.validate(p);
} catch (ValidationException e) {
Report.logErrorMessage("Failed to validate: " + validationType);
continue;
}
}
}
然后在 ValidationFactory 中我有:
public final class ValidationFactory {
public enum TYPES {
PROPERTIES,
PORTS
};
private ValidationFactory() {
}
public static AbstractValidator getValidator(TYPES validationType,
ValidationErrors errors) {
switch (validationType) {
case PROPERTIES:
return new PropertiesValidator(errors);
case PORTS:
return new PortRangeValidator(errors);
default:
return null;
}
}}
这段代码工作得非常好,并且允许在以后添加新的验证器。不过有一个相对较小的问题...
外层 for 循环遍历将传递给命令的参数列表,而内层 for 循环遍历可以执行验证的验证器列表。但是,根据参数的不同,可能没有必要继续使用第二个验证器进行验证,第一个验证器可能已经完成了工作……因此,PropertiesValidator 可能已经完成了所需的工作,现在无需调用第二个验证器,但无论如何它都会调用它。我想我可以使用一个变量来维护验证状态,然后如果已经完成就可以跳过。两个验证器都扩展了一个 AbstractValidator class,这将是最好的地方。
我想一次完成验证,同时保持工厂模式的结构。我正在考虑加入某种委托人 class。我正在使用 java 1.6,所以我无法打开字符串参数,这很好。
定义一个Generic Validator,它将对所有验证器通用,并在属性和端口验证中定义特定的验证。因此,现在通过将通用逻辑移至通用验证器并将特定验证移至其他验证器,不会出现重复验证。
我正在使用以下代码验证传递给文件中一系列命令的参数:
for (Parameter p : s.getCommand(idx).getParameters()) {
for (ValidationFactory.TYPES validationType : ValidationFactory.TYPES.values()) {
validator = ValidationFactory.getValidator(validationType, errors);
try {
validator.validate(p);
} catch (ValidationException e) {
Report.logErrorMessage("Failed to validate: " + validationType);
continue;
}
}
}
然后在 ValidationFactory 中我有:
public final class ValidationFactory {
public enum TYPES {
PROPERTIES,
PORTS
};
private ValidationFactory() {
}
public static AbstractValidator getValidator(TYPES validationType,
ValidationErrors errors) {
switch (validationType) {
case PROPERTIES:
return new PropertiesValidator(errors);
case PORTS:
return new PortRangeValidator(errors);
default:
return null;
}
}}
这段代码工作得非常好,并且允许在以后添加新的验证器。不过有一个相对较小的问题...
外层 for 循环遍历将传递给命令的参数列表,而内层 for 循环遍历可以执行验证的验证器列表。但是,根据参数的不同,可能没有必要继续使用第二个验证器进行验证,第一个验证器可能已经完成了工作……因此,PropertiesValidator 可能已经完成了所需的工作,现在无需调用第二个验证器,但无论如何它都会调用它。我想我可以使用一个变量来维护验证状态,然后如果已经完成就可以跳过。两个验证器都扩展了一个 AbstractValidator class,这将是最好的地方。
我想一次完成验证,同时保持工厂模式的结构。我正在考虑加入某种委托人 class。我正在使用 java 1.6,所以我无法打开字符串参数,这很好。
定义一个Generic Validator,它将对所有验证器通用,并在属性和端口验证中定义特定的验证。因此,现在通过将通用逻辑移至通用验证器并将特定验证移至其他验证器,不会出现重复验证。