2009-10-20 4 views
20

あなたのクラスで爆発を管理するために人々が(もしあれば)どのようなアプローチを取っていますか?例:リファクタリングガード欄

public void SomeMethod<T>(string var1, IEnumerable<T> items, int count) 
{ 
    if (string.IsNullOrEmpty(var1)) 
    { 
     throw new ArgumentNullException("var1"); 
    } 

    if (items == null) 
    { 
     throw new ArgumentNullException("items"); 
    } 

    if (count < 1) 
    { 
     throw new ArgumentOutOfRangeException("count"); 
    } 

    ... etc .... 
} 

私が現在取り組んでいるプロジェクトでは、パブリックメソッドに類似のガード句セットを持つ多くのクラスがあります。

私は.NET 4.0コード契約を認識していますが、現時点ではこのオプションの選択肢ではありません。 、あなたはコードの契約をシミュレートすることができ、いくつかの方法があるがそれよりも

public void SomeMethod<T>(string var1, IEnumerable<T> items, int count) 
{ 
    if (string.IsNullOrEmpty(var1)) 
     throw new ArgumentNullException("var1"); 

    if (items == null) 
     throw new ArgumentNullException("items"); 

    if (count < 1) 
     throw new ArgumentOutOfRangeException("count"); 

    ... etc .... 
} 

その他:

答えて

39

私は静的Guardクラスを使用して見てきた多くのプロジェクト。

public static class Guard { 
    public static void ArgumentIsNotNull(object value, string argument) { 
     if (value == null) 
      throw new ArgumentNullException(argument); 
    } 
} 

私の意見では、コードをもっとクリーンにしています。

Guard.ArgumentIsNotNull(arg1, "arg1"); 
+1

私は同じことを投稿していました。唯一の問題は、スタックトレースの先頭にこのメソッドを置きます。先頭のメソッドは大したことではありません。このパターンは明らかにさまざまな種類の値をチェックするためにさまざまな型に使用できます。 –

+0

ええ、これは私がこれまで持っていた唯一の問題です。元の呼び出しメソッドを見つけるのは簡単ですが。 –

+1

これはコード契約を模倣するクラスと本質的に同じです。 –

5

あなたはコードコントラクトルートを下るしたくない場合は、それを単純化するための1つの方法は、中括弧を削除することです、あなたの異議は、.NET 4.0がまだプライムタイムではないということである場合:

http://geekswithblogs.net/Podwysocki/archive/2008/01/22/118770.aspx

+0

神様のために、これをしないでください!中括弧を使用しないステートメントが、あなた自身の問題を引き起こす大きな方法です。 – EricRRichards

+1

@EricRRichards:* [恥ずかしがり屋] *正直言って、プログラマーが中括弧(特にこのような顕著なコード)を使わずにコードを真っ直ぐに保てない場合、おそらく学校に戻るべきです。 –

3

(完全に除去しない)の数を減らすための一つのアプローチガード句は、その存在の原因を理解することです。多くの場合、引数の型に対して有効な値に対しては保護しますが、受け入れられるメソッドに対しては有効ではありません。つまり、メソッドは引数型で定義されたドメインのサブセットで定義されます。

このカテゴリのケースに対する解決策は、サブタイプ(より限定的なインターフェースなど)を定義し、そのタイプを引数として受け入れることです。この記事では、具体的な例を見つけることができます。Why do We Need Guard Clauses?

もちろん、この手法はすべての場合に当てはまるわけではありません。すべての参照型は、少なくともnull参照を許可します。その結果、ほとんどのメソッドはドメインの一部で定義され、nullへの保護条項が必要になります。

しかし、この手法は、望ましいよりも一般的な引数を受け取るメソッドの認識を高めるのに役立ちます。この穴は一般的にデザインを改善するのに役立ちます。