2

シナリオ: オブジェクトに関するいくつかの入力パラメーターを受け取ります。例: Course

コースには、講師名、受講者数、コース時間、部屋番号などがあります。

入力を検証し (生徒数 > 0、午前 9 時 < 時間 < 午後 9 時など)、オブジェクトを作成する必要があります。無効な入力のエラーの原因を返す必要があります。

2つのアプローチを考えることができました

1) 静的メソッドを使用して別の Validator クラスを作成し、

  • 入力を検証します (validate メソッドは true、または VALID、INVALID_TIME、INVALID_STUDENT_NUMBER などの列挙型を返します)。
  • 入力が有効な場合、Bean をインスタンス化します。

短所:

  • 入力値を検証する前に処理する必要がある場合、上記のパターンでは、入力が有効な場合は 2 回、Validator クラスで 1 回、Bean セッターの前で 1 回処理を行うことになります。無効な場合、validate メソッドはエラーのソースを返す必要があるため、Bean オブジェクトを返すことはできません。

2) Bean クラス自体の内部に検証メソッドを配置し、無効な入力に対して例外を返します。さまざまな種類の例外を通じて、エラーの原因を追跡します。

短所:

  • 複数のカスタム例外を作成する必要があります。
  • ホルダーオブジェクト自体の中に検証メソッドを含めるのは正しい方法ですか??

いくつかの設計パターンを調査しましたが、関連はありませんでした。

上記のアプローチの長所と短所、および従うべきより良い方法を理解するのを手伝ってください。

4

2 に答える 2

2

コメンテーターの 1 人は次のように指摘しています。それは重要です。

私の経験では、モデル オブジェクト内の検証メソッドは機能しません。これは、検証ロジックが頻繁に変更され、ある状況下では有効でないものが別の状況下では有効になるためです。たとえば、検証方法が午後 9 時以降を無効と見なす場合、学校の管理者はルールを変更して、夏学期中のコースを午後 11 時まで実行できるようにすることができます。そのようなことが起こったときに、クラス内の検証メソッドに固執したくはありません。必然的にそうなります。

また、システム内の他のオブジェクトの状態を知らずにオブジェクトを検証することは、多くの場合不可能です。たとえば、ローン オブジェクトがある場合、$100,000 を超えるローンの値は無効である可能性があります。顧客オブジェクトのタイプが機関である場合を想定してください。Loan を正しく検証するには、Loan オブジェクトと Customer オブジェクトの両方について知る必要があります。

私が見た複雑な検証のベスト プラクティスは次のとおりです。

  1. オブジェクトを受け入れる前に有効な単純なもの。これには、数値フィールドの無効な文字または数字以外のチェックが含まれます。

  2. 依存オブジェクトのグループを一度に検証する検証フレームワークを作成します。最初のエラーが見つかった時点で検証ルーチンを停止しないでください。代わりに、ValidationError という名前のクラスを作成し、フレームワークでこれらのオブジェクトのコレクションを作成します。このアプローチにより、オブジェクト内およびオブジェクト間の依存関係を説明できます。また、一度に 1 つずつエラーを修正するようユーザーに強制するのではなく、一度にすべてのエラーをユーザーに提示することもできます。

  3. minimumNumberOfStudents や latestClassTime などの値をハード コードしないでください。代わりに、これらの値をリレーショナル データベース テーブルまたは構成ファイルに入れます。検証フレームワークが正しい値を検索するようにします (そして、それらをキャッシュします)。値が変更された場合 (よくあることですが)、ファイルまたはデータベースを更新するだけで済みます。アプリケーション全体を再構築して再デプロイする必要はありません。この作業を行ったとき、私は Smalltalk でコーディングしていました。Smalltalk や Ruby などの動的言語を使用している場合、実際にソース コードを「検証ブロック」としてデータベースに配置し、実行時に実行するのは簡単です。

検証フレームワークは例外を使用する場合がありますが、これはお勧めしません。例外は、回復が困難な、より劇的なエラーのために予約する必要があります。また、例外によってパフォーマンスが大幅に低下する可能性があります。これは、検証がクライアントではなくサーバーで行われる場合に重要です。さらに悪いことに、一部のプラットフォームでは例外処理が不安定です。

于 2011-11-30T18:52:30.520 に答える
0

上で指摘したように、あなたがそのようなことをすることができる方法は絶対にたくさんあります。

そのようなものを実装している場合は 、ビルダーパターンと組み合わせた流暢なインターフェイスに関するこの記事http://java.dzone.com/news/factories-builders-and-fluent-を参照してください。

おそらくそれはあなたのニーズに合っています。Bean部分の検証には特に注意してください。

それが役に立てば幸い。

于 2011-11-03T00:50:10.457 に答える