0

私は時々使用します

if (this._currentToolForeColor.HasValue)
    return this._currentToolForeColor.Value;
else
    throw new InvalidOperationException();

他の時に私は使用します

if (this._currentToolForeColor.HasValue)
    return this._currentToolForeColor.Value;
throw new InvalidOperationException();

この2つは同等ですが、どちらが最適で、その理由はわかりません。

ブレーキや続行などの他の実行制御ステートメントを使用できるため、これはさらに進んでいます。

while(something)
{
    if(condition)
    {
        DoThis();
        continue;
    }
    else
        break;
}

while(something)
{
    if(condition)
    {
        DoThis();
        continue;
    }
    break;
}

編集1:はい、ループの例は、実用的な最初の例とは異なり、合成されている(つまり、この質問を補っている)ため、最悪です。

4

7 に答える 7

5

早く失敗します。

メソッドの上部で検証を行い、それを超えた場合は、(相対的な)安全性の値を使用できます。

public void SomeFunction(object someParameter)
{
    if (someParameter == null) throw new ArgumentNullException("someParameter", "Value cannot be null");

    // Use the parameter here for stuff
    SomeOtherFunction(someParameter, Whichway.Up);
}

同じことがreturnステートメントにも当てはまります。ifメソッドが完了したら、大きなステートメントで何かをラップするのではなくreturn、そこから抜け出します。

この概念の他の例については、循環的複雑度の低減を参照してください。私の例では、コードパスが1つしかないことに注意してください。これは、特定のパラメーターを使用してどこまで到達できるかという問題です。ネストされたif中括弧と中括弧(例のように中括弧を使用しない場合でも)はすべて、例間の違いよりも読みやすさに大きな影響を与えます。

于 2009-09-22T10:33:05.503 に答える
3
while(something) {
    if(condition)
    {
        DoThis();
        continue;
    }
    else
        break; }

次と同じです:

while(something && condition)
{
     DoThis();
}

あなたの質問に対して:たとえそれが冗長に見えるとしても、制御がどのように流れるかをより明確にすることは常により良いです(例えば、余分な他の接続はとにかく最適化されます)。したがって、(cond)return x elsethrowyは適切です。

ただし、メソッド引数のエラーチェックの場合は、メソッドの開始時にすべてのチェックを実行する必要があるため、ここに他のものは必要ありません。

于 2009-09-22T11:03:46.297 に答える
3

1番目と2番目のオプションは、コンパイラーと同等です。しかし、コードを読んでいる人間にとって、最初のオプションは意図についてより明確であり、読みやすくなっています。

人間の読者が、意味を伝えるためではなく、主に機能するように設計された数千行のテキストから吸収できるものには限界があります。タスクを簡単にする小さな努力はすべて良いことです。

于 2009-09-22T10:37:08.843 に答える
1

それはあなたの好みによると思います。最初のオプションは冗長性が少ないため、個人的には最初のオプションを好みます。幸い、Resharperと私はこれに同意しているので、R#に短いバージョンのコードを変更させるのは簡単です。

于 2009-09-22T10:34:22.623 に答える
1

より良い、よりクリーンなコードのために、私は常にこの形式を選択する方が良いと思います:

if(condition)
{
   //do stuff
}
else
{
   //do stuff
}

..等々。

それは単なる「味」の問題ですが、コードの行が多い場合でも、解釈や理解の必要がないため、コードの流れを指で簡単にたどることができるため、これははっきりと読みやすくなります。したがって、私にとっては、returnが次のコードへのフォールバックを妨げている場合でも、常にelseを使用し、1行のif / elseがある場合は、常にeventを囲みます。

私が覚えている限り、これはフレームワーク設計ガイドラインでも提案されています。これは、「これを行う」および「これを行わない」ガイドラインがたくさんある非常に簡単な本です。

于 2009-09-22T10:34:46.023 に答える
1

この場合、読みやすさが主な関心事だと思います。

同じ方法で広告を上にスクロールしたり、実行フローを見失ったりした場合は、おそらく書き直す必要があります。上記の中断は、while条件が十分なチェックではなかったことを示しています。

用途はありますが、チーム内の別の開発者からコメントが表示されないように注意してください。

ここにドラゴンがいます!!!

于 2009-09-22T10:35:44.010 に答える
1

Resharperは、これを使用することをお勧めします。

if( someCondition )
   return foo;

throw new InvalidArgumentException();

しかし、それはそれゆえそれがより良いことを意味するのでしょうか?知らない。個人的には、次の解決策がより明確であると思うので、私はそれがより好きです。しかし、それは個人的な選択です。

if( someConditiion )
{
   return foo;
}
else
{
   throw new ....
}

'while'の例について。私見、両方のコード例は最悪です。このように書いてみませんか:

while( something )
{
    if( !condition ) 
        break;

    DoStuff();
}
于 2009-09-22T10:36:33.383 に答える