2012-02-17 8 views
2

私はプライベートフィールドとしてSortelListのクラスを持っています:このリストの各要素は、キーとしてstringと値としてカスタムデータを持っています。私は私のクラスのUpdateメソッドを呼び出すと、私はキーとデータを指定し、:カスタムメソッドで間違った引数値を処理するにはどうすればよいですか?

  • リストが指定されたキーが含まれていない場合、新しいエントリがリストに追加されます。
  • 現在のデータは指定されたデータで更新されるため、例外はスローされません。結果として

    public class Cache 
    { 
        private SortedList<string, Data> _list; 
    
        // ... constructors and other methods 
    
        public void Update(string key, Data value, int number) 
        { 
         Data data; 
         if (this._list.TryGetValue(key, out data)) 
         { 
          // update data using value and number 
          // 
          // ... 
    
          _list[key] = data; // overwrite the previous data with the updated data 
         } 
         else 
         { 
          _list.Add(key, value); 
         } 
        } 
    } 
    

、このクラスには、重複するキーを指定した場合でも、例外をスローすることはありません。しかし、number引数の値は正でなければならず、ゼロ以下の値は無視する必要があります。これらの値を除外するより良い方法は何ですか?

  • I未満またはゼロに等しい値を無視することができ:if (number <= 0) return;
  • を私はUpdate方法がそう、ブール値を返す作ることができる:if (number <= 0) return false;
  • Iは場合Updateメソッドが例外をスローすることができ正の数ではない。上述のよう
+2

ネガティブが許可されていて無視するだけの場合は無視してください。ネガティブがエラーの場合は、番号を符号なしにすることによってその可能性を排除するか、コード契約を使用して確実にするか、例外をスローします。 –

+0

IMHOあなたが考えているすべての選択肢は実行可能で、このコードから好む振る舞いに依存します。 –

+0

@JoachimIsaksson uintの最大値がintの値の2倍であることを忘れないでください。それを使用する場合は、int.MaxValueより小さいかどうかをチェックする必要があります。値をintにキャストします。また、ゼロを許容する。 –

答えて

1

私はこのように、ArgumentOutOfRangeExceptionをスローします:

public void Update(string key, Data value, int number) 
{ 
    if (number <= 0) 
    { 
     throw new ArgumentOutOfRangeException("number must be positive"); 
    } 
    // Rest of the method 
} 

これは、引数の検証時に.NETフレームワークの大半が続く模様です。

代わりに、Updateメソッドが、操作が成功したかどうかを示すブール値を返すようにすることもできます。これは、APIのユーザが(TryParseメソッドのように)例外をスローすることなくメソッドを呼び出すことができるようにするのに便利ですが、この場合、メソッドのユーザが単純に例外をスローすることを避ける必要はありません。メソッドを呼び出す前に引数numberの値をチェックしてください。

1

、あなたは多くのオプションを持って、私はあなたがBOOLとそれが更新されていない状態や例外ArgumentOutOfRangeExceptionをスローするようにfalseを返すための戻り値を変更するのいずれかのことを示唆しています。

戻り値の利点は明らかに例外がスローされないことですが、消費者は更新が行われたことを確認するか、値にアクセスして更新されていないことを混乱させる必要があります。

例外メソッドを使用すると、メソッドにxmlコメントを追加して、ゼロまたはそれ以下の数値が返されると例外がスローされることがあります。これはビジュアルスタジオのツールチップとオブジェクトブラウザに表示されるので、消費者はこれが起こる可能性があることを知ることができます。

/// <summary> 
/// Updates the value in the cache for the supplied key. 
/// </summary> 
/// <param name="key">The key in the cache.</param> 
/// <param name="number">The the number to store.</param> 
/// <exception cref="ArgumentOutOfRangeException">Thrown if number is less than 1.</exception> 
public void Update(string key, Data value, int number) 
+0

問題ドメインでは負の値とゼロが無意味なので、主アプリケーション( 'Cache'クラスを使用する)は間違ったパラメータを無視しなければなりません。メインアプリケーションのユーザーは、エラーメッセージを表示せずに引き続きアプリケーションを使用する必要があります。間違った値がログファイルに書き込まれる可能性があります。 – enzom83

関連する問題