Getter/Setter またはその他の場所でデータを検証しますか?
-
08-06-2019 - |
質問
作ったほうがいいのか迷っています 検証 で ゲッター そして セッター, 、またはコード内の他の場所にあります。
これには驚かれるかもしれませんが、 最適化 そして スピード違反 コードを見てください。ゲッターとセッターではなく、コード内で検証を行うべきだと思います。 更新中 ファイルまたはデータベース。私が間違っている?
解決
通常、クラスにパブリック ゲッター/セッターを持つプライベート メンバーが含まれる理由の 1 つは、まさにデータを検証できるためです。
1から100までの数値がある場合は、それを検証する何かをセッターに間違いなく入れて、コードによってキャッチされている例外をスローする可能性があります。理由は簡単です。セッターで設定しない場合は、設定するたびに 1 ~ 100 の制限を覚えておく必要があり、コードが重複したり、忘れたときに無効な状態になったりする可能性があります。
パフォーマンスに関しては、私は Knuth と一緒にいます:
「私たちは、97% の確率で、小さな効率のことは忘れるべきです。時期尚早な最適化は諸悪の根源です。」
他のヒント
@Terrapin、再:
あなたが持っているのは、[シンプルなパブリックセット/取得]プロパティの束である場合...彼らもフィールドかもしれません
プロパティにはフィールドに比べて他の利点もあります。これらはより明示的なコントラクトであり、シリアル化されており、後でデバッグすることができ、継承による拡張に最適な場所です。構文が不格好なのは、偶然の複雑さによるものです -- たとえば、.net 3.5 ではこれを克服しています。
一般的な (そして欠陥のある) 実践は、パブリック フィールドから始めて、後で「必要に応じて」ベースでプロパティに変換することです。これにより、クラスを使用する人との契約が破棄されるため、プロパティから始めるのが最善です。
場合によります。
一般に、コードはすぐに失敗する必要があります。コード内の複数のポイントで値を設定でき、値を取得した後でのみ検証する場合は、更新を行うコードにバグがあると考えられます。セッターが入力を検証すると、どのコードが無効な値を設定しようとしているのかがわかります。
最も保守しやすいコードを作成するという観点から、プロパティのセッターでできる限り多くの検証を行うべきだと思います。こうすることで、無効なデータをキャッシュしたり処理したりする必要がなくなります。
結局のところ、これがプロパティの目的です。次のようなプロパティがたくさんある場合...
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
...それらはフィールドであると同じかもしれません
チェックアウトしたいかもしれません ドメイン駆動設計, 、エリック・エヴァンス著。DDD には次のような仕様の概念があります。
...特殊な目的のための明示的な述語様値オブジェクト。仕様とは、オブジェクトがいくつかの基準を満たしているか、満たしていないかを決定する述語です。
迅速に失敗することと、検証のためのロジックをどこに保持するかが問題だと思います。ドメインはロジックを保持するのに適切な場所であり、仕様オブジェクトまたはドメイン オブジェクトの検証メソッドが適切な場所であると思います。
検証は、検証メソッドのゲッターまたはセッターとは別にキャプチャする必要があります。そうすることで、複数のコンポーネント間で検証を再利用する必要がある場合に利用できるようになります。
セッターが呼び出されるときは、そのような検証サービスを利用して、オブジェクトへの入力をサニタイズする必要があります。こうすることで、オブジェクトに保存されているすべての情報が常に有効であることがわかります。
オブジェクトに関する情報はすでに有効であると信頼されているため、ゲッターに対していかなる種類の検証も必要ありません。
データベースが更新されるまで検証を保存しないでください。する方が良いです 早く失敗する.
実装するのが好きです IDataErrorInfo そして、検証ロジックを Error プロパティと this[columnName] プロパティに入力します。そうすることで、プログラムでエラーがあるかどうかを確認したい場合は、コード内でこれらのプロパティのいずれかをテストするだけで済みますし、Web フォーム、Windows フォーム、または WPF のデータ バインディングに検証を渡すこともできます。
WPF の "ValidatesOnDataError" バインディング プロパティを使用すると、これが特に簡単になります。
私はオブジェクトが無効な状態にならないように努めているため、状態を変更するメソッドと同様にセッターにも検証が必要です。こうすることで、扱っているオブジェクトが無効であることを心配する必要がなくなります。メソッドを検証境界として保持すると、あちこちに点在する検証フレームワークや IsValid() メソッド呼び出しについて心配する必要がなくなります。