2

私は次のクラスを持っています:

class UserValidator{

     // no constructor , default is fine. 

     void Validate(Request request, Response response){
        // some validation logic on request
        // if fails, add the message to response.
     }

}

同様に、次のように同じことができます。

class UserValidator{

     private Request request;
     private Response response;

     UserValidator(Request _request, Response _response)
     {
         request = _request;
         response = _response;
     }

     void Validate(){
        // some validation logic for request
        // if fails, add the message to response.
     }

}

テストの場合、どちらがより好ましいですか? 2 番目の UserValidator クラスには状態があるため、テストが容易ですが、最初のクラスには状態がなく、テストが難しいと言えますか? 実際のところ、最初のものは他のメソッドに渡すことができない静的クラスにすることもできますが、静的に呼び出された場合は機能しません。

テスト容易性の点でどちらが優れていますか? 状態を含むのはどれですか? どちらがより理想的ですか?

4

1 に答える 1

0

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;
于 2012-08-30T21:17:54.103 に答える