2016-04-15 5 views
0

私はC#クラス内の関数を持っている:異なるコードブロックの検証を組み合わせる必要がありますか?

class Fun { 
    private string waterGun; 
    private string jacket; 

    void HaveSomeFun(bool summers) { 
     waterGun = <Some Value> 
     jacket = <Some Other Value> 

     validate(); 
     if(summers) { 
      Console.WriteLine("Using {0}", waterGun); 
     } else { 
      Console.WriteLine("Using {0}", jacket); 
     } 
    } 

    private void validate() { 
     ArgumentValidationHelper.ValidateNotNullOrEmpty("WaterGun", this.waterGun); 
     ArgumentValidationHelper.ValidateNotNullOrEmpty("Jacket", this.jacket); 
    } 
} 

私は検証のための変数のインスタンスメンバーを作っています。バリデーションのためだけにメソッドからクラスへ変数の範囲を広げることは理にかなっていますか?

バリデーションを集中化し、変数がクラスメンバである必要がない場合、この機能を実現する他の(より良い)方法はありますか?

+0

あなたが勇気があるなら、[System.ComponentModel.DataAnnotations](https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validator(v = vs.110))を使うことができます。 aspx)。 [ここで](http://stackoverflow.com/q/2109423/6138713)は、データ注釈に関連する回答のある質問です。 –

答えて

0

あなたのコード検証ロジックによれば、すでに集中化されています(私は、あなた/誰かがArgumentValidationHelperクラスを作成したときに全面的な意図だったと思います)。

私は、これらのクラス変数は必須ではないことを知っています。はい、彼らは(A)プライベート(B)コードを呼び出すことによって設定されないため、意味がありません。

私のコードは、

です。
+0

これは私には合理的だと思います。私は、バリデーションのためのメソッドからクラスへの変数の範囲を広げることは、一緒に良い戦略ではないと思います。 – Amber

0

まず、メンバー変数がなぜプライベートであるかわかりません。それはタイプミスですか?ユーザーが変更できない場合は、ユーザーがそれらを検証する必要はありません。

実際にpublicを意味すると仮定して、メンバ変数をプロパティに変換し、セッタ内で検証を行うことを検討できます。次に、エラーをスローするか、デフォルト値に設定します。私はあなたがそれを使用するたびにvalidate()を呼び出すのではなく、あなたのクラスが常に有効な状態にあることを保証するので、このアプローチがより好きです。

あなたが引数としてそれらを残したい場合は、ヘルパークラスを作ることができる:

あなたは、その後、いくつかの方法でお楽しみに渡すことができ
class FunArguments { 
    private string waterGun; 
    public string WaterGun { 
     get { return waterGun; } 
     set { 
      //do some validation check here 
      waterGun = value; 
     } 
    } 
    // etc.. 
} 

+0

私の質問です:バリデーションのためだけにメソッドからクラスへ変数の範囲を広げることは理にかなっていますか?インスタンスメンバーにすることを提案しています。それには理由がありますか? – Amber

+0

それは変数がどこから来たかによって異なりますが、私はあなたのコードからはわかりません。 ''と書くだけではあまり明確ではありません。 – smead

関連する問題