1

2つのバリデータークラスがあります。たとえば、CarValidatorとWheelValidatorで、2番目のものが最初に囲まれています。

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

CarBodyValidator、fe EngineValidatorなどにさらに多くのバリデーターがあります。validate()はtrueまたはfalseのみを返す必要があり、一度にできるだけ多くの間違いを出力したい(検証が一部のクラスに対してfalseを返す場合、他のクラスを検証したい場合それらは互いに依存していません)。ここで、Wheelバリデーターが、CarBodyバリデーターに必要な有用な情報を返すとしましょう。ホイールの直径が大きすぎる場合は、他の何かを検証するために車のバリデーターにその情報が必要です。その情報を渡すにはどうすればよいですか。Wheelバリデーターにパラメーターを格納するフィールドを作成できますが、次のようにアクセスします。

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

}

間違っているようです(つまり、バリデーターは検証するだけで、他には何もしないでください)。これは正しい方法ですか、それとも別の方法で行う必要がありますか。

4

4 に答える 4

1

これを行うには複数の方法があります。一つはおっしゃる通りです。validate() はブール値を返し、検証中に発生したエラーのセットを保持します。必要に応じて、後でこれらのエラーを確認できます。

より洗練された解決策は、validationResults という特定のクラスのインスタンスを返すように validate() メソッドを使用することです。このクラスには、検証ステータスとエラーのセットを含めることができます。

3 番目のオプションは、validate() で例外をスローすることです。アプリケーションの実行フローを決定するために例外を使用することは推奨されていないため、この方法に反対する人がいますが、状況によっては便利であることがわかりました。

それが役に立てば幸い、

于 2013-01-28T10:00:24.690 に答える
1

これはVisitor パターンに適したアプリケーションです。

これは、各バリデーターに渡されるオブジェクト (訪問者) があることを意味します。バリデーターは、エラーメッセージを訪問者に報告したり、同じことを行う別のサブバリデーターに渡したりします。

ビジターは、渡されたすべてのエラー メッセージを保存します。その後、訪問者が収集したエラー メッセージを読み、適切と思われる方法で処理できます。

于 2013-01-28T10:01:23.917 に答える
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);
于 2013-01-28T10:06:05.453 に答える
1

検証が成功したかどうかを示すブール値を返す代わりに、オブジェクトが有効でない場合に例外をスローできます。

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

ValidationException には faulty フィールドが含まれており、別のバリデーターで再利用できます。

しかし、オブジェクトが有効でないことがわかっているときに別のバリデーターを呼び出すのは少し間違っているように思えます。おそらく、これら 2 つのバリデータをマージして、無効なフィールドのリストを返すようにする必要がありますか?

于 2013-01-28T10:01:53.090 に答える