2番目のものだけが状態を含みます。
個人的には、最初のものを静的に使用します。
class UserValidator{
private UserValidator() { } // no constructor
public static void Validate(Request request, Response response){
// some validation logic on request
// if fails, add the message to response.
}
}
ただし、結果を保存することには利点があります。実際に実行しなくても、何度でも実行できます。
class UserValidator {
public static enum ValidatorState { NOT_RUN, PASSED, FAILED }
private ValidatorState state = NOT_RUN;
private final Request request;
private final Response response;
public UserValidator(Request request, Response response) {
this.request = request;
this.response = response;
}
public ValidatorState validate() {
if(state != NOT_RUN) return state;
if(blah blah)
state = PASSED;
else
state = FAILED;
return state;
}
}
さまざまなバリデーターのリストを作成するには、それを実行するための何らかのインターフェイスが必要になります。
public interface Validator {
boolean validate(Request request, Response response);
}
次に、すべての検証を含む静的メソッドライブラリを作成します。これらは例で構成されていますが、実際のようなロジックが含まれていることに注意してください。
public class ValidationLibrary {
private ValidationLibrary() { }
public boolean validateUsername(Request request, Response response) {
String name = request.getProperty("username");
if(name.length() < 3) return false;
if(name.length() > 12) return false;
if(name.equals(name.reverse()) return false; // who knows?
return true;
}
public boolean validateSecurity(Request request, Response response) {
// what page is the user trying to reach?
SecurityRealm realm = SecurityRealm.realmForPage(request.getProperty("page"));
String username = request.getProperty("name");
return realm.allows(username);
}
}
後で複数のバリデーターが必要になった場合は、これを簡単に行うことができます
List<Validator> validators = new ArrayList<Validator>();
validators.add(new Validator(){
public boolean validate(Request req, Response res) { ValidationLibrary.validateUsername(req,res); }
});
validators.add(new Validator(){
public boolean validate(Request req, Response res) { ValidationLibrary.validateSecurity(req,res); }
});
次に、リクエストを受け取ったら、これを実行して検証します。
for(Validator v : validators) if(!v.validate(request,response)) return false;