2011-12-08 10 views
-4

は、私はthis questionがprarametersがテストされるかのために考慮されることに注意したいと思います。両方の方法は、方法の内部の仕組みに同じ保護を達成するパラメータを検証する正しい順序は何ですか?参考のため

public void DoSomething1(Dictionary<string, string> param1, Object param2) 
{ 
    if (null == param1) 
     throw new ArgumentNullException("param1"); 
    if(!param1.Keys.Contains("somekey")) 
     throw new ArgumentException("param1 must contain key \"somekey\""); 
    if(null == param2) 
     throw new ArgumentNullException("param2"); 

    // now we do some stuff 
} 

public void DoSomething2(Dictionary<string, string> param1, Object param2) 
{ 
    if (null == param1) 
     throw new ArgumentNullException("param1"); 
    if (null == param2) 
     throw new ArgumentNullException("param2"); 
    if(!param1.Keys.Contains("somekey")) 
     throw new ArgumentException("param1 must contain key \"somekey\""); 

    // now we do some stuff 
} 

は、一例として次の二つのスニペットを取ることができます。

私の質問は...(この例のように)メソッドに渡されたパラメータ、なぜをテストするための正しいアプローチ/オーダー

は何ですか?

バックアップへの参照あなたの答えを引用してください。

+3

私はこれに「正しいアプローチ」があるとは思わない。この場合、それは実際に好みの問題のように見えます。 –

+0

正しいアプローチが理にかなっています。たとえば、コードサンプルで行っているように、 'Contains()'を呼び出す前にparam1のnull例外を最初にチェックする必要があります。 –

+0

私は両方の仕事を理解しています。 param2を検証する前にparam1を完全に検証する必要がありますか?あるいは、テストの中で最も簡単な例外からより複雑な例外に進むべきですか? –

答えて

0

には "正しい順序" はありません。

それは完全に実装固有です。言い換えれば、パラメータがヌルであることを報告することが重要ですか、それともパラメータの詳細な検査を行うことが重要ですか?

私はこれをやっていたなら、私は、「パフォーマンス」のアプローチを取るだろう。言い換えれば、まず、必要なすべてのパラメータがnullでないことをテストし、各パラメータを開いて私が望むものを得られるようにします。ヌル参照チェックは、辞書にキーが含まれているかどうかをテストするよりも速く(わずかに)です。もちろん

この方法は、何百回も二呼ばれるように運命、それがnullパラメータを渡される可能性を有していたならば、私もそれを心配したいだけです。限られた影響しか持たないメソッドについては、呼び出し元が最初に知る必要があったものに固執します。

+0

私はあなたと同じ意見の下にいます。しかし、*すべての症例でのパフォーマンスを介して、testinの「ベストプラクティス」を確立するのは公正でしょうか? –

+0

@ davids:いいえ。パフォーマンスを向上させるためにコードに行うことができることはたくさんあります。しかし、高性能なコードは、読みにくいコードにつながります。その観点から、可読性よりもパフォーマンスが高いかどうかを判断するために、ケースバイケースで検討する必要があります。 – NotMe

+0

もう1つの理由は、一方向に書かれたコードと別の方法で書かれたコードとのパフォーマンスの差が、アプリケーションの実行にとって些細なものでもゼロの結果でもあり得ることです。たとえば、サンプル内のコードがたかだか1時間に1回実行されると、この方法でコードを最適化することはできません。ただし、1秒間に数百または数千回実行されると、高度に最適化されていないものと最適化されていないものとの違いが、実際にはパフォーマンス目標を達成するために必要なハードウェアに財務的影響を与える可能性があります。そのため、一般的なベストプラクティスは、必要なときにのみ最適化することです。 – NotMe

関連する問題