2012-01-20 5 views
3

検証ロジックはどこに配置しますか?

いくつかのビジネスオブジェクト(例:個人、ハウスなど)とそれらの間で、ユーザー入力(テキストボックスから入力される)を検証する必要があります。それはどちらかに行くだろう:

  1. 各ビジネス・オブジェクト
  2. のWinFormsは、別々の(?静的)クラス
  3. を分離コード。

おかげ

答えて

2

各ビジネス・オブジェクト。私は古典的に、それぞれがオブジェクトのすべての検証エラーを吐き出すIValidatorインターフェイスを実装するようにしました。

4

このようなシナリオで私が推奨する非常に広く使用されているアプローチは、ビューに表示されるすべてのデータを集約し、このデータに対してどのタイプの検証を実行する必要がありますか。

このアプローチには、いくつかの利点があります:

  • があなたのモデルから検証ロジックをデカップリング(おそらくあなたは今日を強制したいが、あなたのデータ自体に固有ではありません検証シナリオがありますが)。このようにして、同じビジネスオブジェクトが再生されるアプリケーションの別個の部分に対して個別の検証シナリオを定義することができます(たとえば、ビジネスロジックの一部では、それぞれが配偶者を必要としますが、配偶者は固有の財産ではありませんすべての人すべて)
  • プレゼンテーションロジック(ビューのコードビハインド)から検証を分離する。この方法では、ビジネスオブジェクトの検証でプレゼンテーションの振る舞いを具体的に絡ませることを余儀なくされることはありません
  • 検証コードは分離されており、それぞれの特定のタイプの検証のみを対象としています。このようにして、適用可能な場所でアプリケーション全体で検証コードを再利用することができます。

実際に検証を行うコードは通常、別の検証クラスの内部にあります。あなたのビューモデルは、各データにどのように検証を適用するかを指示するだけです。

+2

これに対して、ViewModelの目的はモデルにアタッチできるように、ビューのアダプタにすることです。つまり、WinFormsでは、通常、ViewModelを持っていません。 ViewModelは、その名前にもかかわらず、* view *の一部であり、モデルではありません。したがって、私は検証ロジックをそこに置くことを避けるだろう。 – vidstige

+0

@vidstige:あなたの答えでは、モデル内に検証コードを入れることをお勧めします。そのような制限がない人のための他のフォームがある場合、あなたはどのように大人でなければならない人のためのフォーム(誕生日に基づいて)を扱うでしょうか?あなたはクラス「大人:人」を持つことができますが、ある時点でビジネス要件が変わった場合は、「大人」のこの特定の使用*を特に探して「人」に戻す必要があります。型定義 - すべてではありません。綺麗ではない。 – Jon

+0

興味深い質問!これは、実際にはモデルで簡単に処理できます。おそらくこのコメントフィールドの範囲外ですが、たとえば、このポリシーをViewModelに注入できます。これにより、1つのフォームがあり、ViewModelには* 2つのモデルがあるため、1つのViewModelがあります。 – vidstige

0

ビジネスオブジェクト。その理由は、検証ルールをテスト可能にしたいということです。ルールが重要な場合は、テストでそれらをカバーしたいと思うでしょう - そうでない場合は、最初にそれらを実装しないでください。これを極限まで引き上げると、コードビハインドが非常に薄く、ロジックがほとんどないコードが得られます。これは欲しいものです。

関連する問題