6

特定のオブジェクト (それらのオブジェクトのフィールド) のバリデーターの設計に取り組んでいます。これらのオブジェクトは、1 つの大きなオブジェクト (コンテナ) に含まれています。

例: コンテナとしての自動車。ホイール、エンジン、ボディで構成。ホイールの直径が正しいか、エンジンの容量が正しいか、ボディに特定の長さがあるかなどを検証する必要があるとしましょう。

理論的には、コンテナ (車) を構築する前にすべてを検証する必要があると思います。

これを達成するための最良の方法は何ですか?validate() メソッドを使用して抽象バリデーター クラスを作成し、それをすべての囲まれたクラスに実装する必要がありますか? コンテナーについてはどうですか? 検証プロセスにまったく含めないのですか? 手伝ってくれてありがとう。

4

3 に答える 3

3

検証するクラス に検証ロジックを配置しないことをお勧めします。

これらのクラスを単なる値オブジェクトとして保持し、バリデーターの並列階層を作成する方が良いと思います。バリデーターは、検証されるエンティティごとに大まかに 1 つずつです。または、すべてのエンティティを検証できる単一のバリデーターを作成することもできます。ただし、このソリューションはスケーラビリティが低く、新しいエンティティを追加する必要がある場合にオープン/クローズの原則に違反する可能性があります (たとえば、車のバックミラー)。

このアプローチを選択するとone entity : one validator、コンテナのバリデータは最初にコンテナ内のコンポーネントを検証し、次にそれらが適合するかどうかを検証します。

定型コードを書く手間を省けるApache Commons Validatorなどのバリデーター フレームワークを使用する可能性も検討してください。ただし、どのような複雑な検証を実行する必要があるのか​​ わからないため、それがニーズに合っているかどうかはわかりません.

さらに、構築する前にすべてを検証することを心配する必要はないと思います。それを構築して後で検証するだけです。検証規則に違反している場合は、破棄できます (つまり、どこにも永続化しないでください)。

于 2013-01-14T12:05:13.010 に答える
2

gd1の答えを裏切るピギー、同意します。そのような方法の 1 つは、値オブジェクトごとに ValidatorAdapter を用意することです。したがって、次のようになります。

public class GreenCarValidator {
   public GreenCarValidator(Car car) {
      // save reference
   }

   @Override 
   public boolean isValid() {
      return car.getColor().equals("green");
   }
}

public class RedCarValidator {
   public RedCarValidator(Car car) {
      // save reference
   }

   @Override 
   public boolean isValid() {
      // you could compose more validators here for each property in the car object as needed
      return car.getColor().equals("red");
   }
}

1 つのタイプのオブジェクトに対して、動的で実行時に構成可能な多くのタイプのバリデーターを使用できるようになりました。gd1がそうしないようにクラス内に「valid()」メソッドを配置すると、この柔軟性が失われます。

于 2013-04-13T04:15:59.587 に答える
1

検証メソッドを使用して ValidatablePart インターフェイスを作成し、すべてのパーツにこのインターフェイスを実装させてから、コンテナーにすべての閉じたパーツを追加するとき、またはコンテナーのビルドまたは想定されているメソッドを呼び出すときに、コンテナーにすべての囲まれたパーツを検証させることができます。それを構築します。

Container クラスはTemplate Method Design Patternに従うことができます。

于 2013-01-14T12:07:40.000 に答える