2009-08-17 8 views
0

現在、私のアプリケーションのカスタムフィールドオブジェクトを検証する必要があります。簡単に言えば、各Fieldオブジェクトは、フィールドの検証に関する情報とフィールドの値で構成されています。 私はバルクでフィールドを検証しているので、現在、それぞれの検証のためのメソッドを持つ検証クラスがあります。 C#カスタムオブジェクト検証デザイン

 private void RequiredFields() 
     { 
      foreach (Field field in allFields) 
      { 
       if ((field.Required == true) && (field.Value == string.Empty)) 
       { 
        field.isValid = false; 
       } 
      } 
     } 

が今私の問題は、私は私が検証に抽象化の層、その代わりに言っすべきであるように感じることです::必要なフィールドの場合、それは次のようになります

if ((field.Required == true) && (field.Value == string.Empty)) 

...私は値を受け入れ、これにそれを回すために、バリデーションクラスを追加します。

if (!validater.RequiredFields(field.Required, field.Value)) 

私はこれを行うとしたら、それは私がフィールドオブジェクトを使用せずに検証クラスを再利用できるようになる、それが希望また、より良い単体テストを可能にします...しかし、それは抽象化のような不必要なレイヤーとやや繰り返しているように思えます...これはすべての検証の中で最も単純です。

提案?

答えて

2

なぜフィールドオブジェクトを自分の検証の対象にしないのですか?

class Field 
{ 
    public bool Required { get; } 
    public string Value { get; set; } 

    // assuming that this method is virtual here 
    // if different Fields have different validation logic 
    // they should probably be separate classes anyhow and 
    // simply implement a common interface of inherit from a common base class. 
    public override bool IsValid 
    { 
     get { return Required && Value != String.Empty; } 
    } 
} 
+0

私はこれをもう一度やっていますが、必ずしも必要ではないフィールドを無効にすることは躊躇しています。 –

+0

さて、私はこれを考慮しました。しかし、私は約100のフィールドを検証していますが、すべてが異なるバリデーションであり、そのうちのいくつかはフィールドオブジェクト固有です。私は一緒に検証を続けたいと思います。 – Jeff

+0

100個のフィールドを検証している場合は、それぞれ異なる検証ロジックが必要であり、そのうちのいくつかだけが独自のカスタムクラスである場合、より深い設計上の欠陥があると言います。 –

関連する問題