2

検討:

if (something) {
    // Code...
}

CodeRushをインストールした状態で、次のことをお勧めします。

if (!something) {
    return;
}
// Code...

誰かがこれがどのように優れているか説明できますか?確かに、これまでのところ何のメリットもありません。

4

9 に答える 9

7

あなたがそれを提示したように、孤立している-利益はありません。しかし、mark4oは正しいです:それはネストが少なく、4レベルのネストと言っても非常に明確になります。

public void foo() {
    if (a)
        if (b)
            if (c)
                if (d)
                    doSomething();
}

public void foo() {
    if (!a)
        return;
    if (!b)
        return;
    if (!c)
        return;
    if (!d)
        return;
    doSomething();
}

このような早期の返品により、読みやすさが向上します。

于 2009-05-28T19:04:22.740 に答える
5

場合によっては、メソッドの開始時にすべての入力を検証し、何かが正しくない場合はベイルアウトする方がクリーンです。入力が適切であると確信するまで、より具体的なことを連続してチェックする一連の単一レベルのチェックを行うことができます。そうすれば、メソッドの残りの部分は記述がはるかに簡単になり、ネストされた条件文が少なくなる傾向があります。

于 2009-05-28T18:58:37.323 に答える
4

ネストのレベルが1つ少なくなります。

于 2009-05-28T18:55:59.527 に答える
3

これは、保守性を目的とした従来のリファクタリングです。見る:

http://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html

1つの条件で、それは大きな改善ではありません。しかし、それは「フェイルファスト」の原則に従っており、条件がたくさんあるときに本当にメリットに気づき始めます。関数に単一の出口点を持たせることを通常推奨する「構造化プログラミング」で育った場合、不自然に思えるかもしれませんが、3レベル以上のネストされた条件を持つコードをデバッグしようとしたことがあれば、理解し始めるでしょう。それ。

于 2009-05-28T19:13:11.553 に答える
2

これを使用して、コードを読みやすくすることができます(ネストを少なくすることにより)。良い例についてはここを、メリットについての良い議論についてはここを参照してください。

この種のパターンは、一般的に次の置換に使用されます。

void SomeMethod()
{
    if (condition_1)
    {
        if (condition_2)
        {
            if (condition_3)
            {
                // code
            }
        }
    }
}

と:

void SomeMethod()
{
    if (!condition_1) { return; }
    if (!condition_2) { return; }
    if (!condition_3) { return; }

    // code
}

これは目にははるかに簡単です。

于 2009-05-28T19:01:58.453 に答える
0

CodeRushがそれを推奨しているとは思いません---むしろオプションとして提供しているだけです。

于 2009-05-28T18:56:10.433 に答える
0

IMO、それは例外的なケースであるかどうsomethingかによって異なります。!something発生した場合に大量のコードがある場合は、条件をsomething使用!somethingする方が読みやすさと潜在的なネストの削減に適しています。

于 2009-05-28T19:01:05.913 に答える
0

さて、それをこのように見てください(私は例としてphpを使用します):

フォームに入力して、次のページに移動します:validate.php

例1:

<?php

if (valid_data($_POST['username'])) {

    if (valid_data($_POST['password'])) {

        login();

    } else {
        die();
    }

} else {
    die();
}

?>

vs

<?php

if (!valid_data($_POST['username'])) {
    die();
}

if (!valid_data($_POST['password'])) {
    die();  
}

login();

?>

どちらがより良く、維持しやすいですか?これは2つのことを検証しているだけであることを忘れないでください。これを登録ページなどで想像してみてください。

于 2009-05-28T19:04:28.323 に答える
0

私は大学の仕事でマークを失ったことを非常にはっきりと覚えています。

if (!something) {
    return;
}
// Code...

フォーマット。私の講師は、関数内に複数の出口点を設けることは悪い習慣であると認識しました。私はそれがナッツであり、20年以上のコンピュータープログラミングの後であると思いました、私はまだそうします。

公平を期すために、彼は共通語がCであり、関数がページ長でネストされた条件でいっぱいで、何が起こっているのかを追跡するのが難しい時代に住んでいました。

しかし、当時も今も、シンプルさが重要です。関数を小さく保ち、コメントを付けることが、読みやすく保守しやすいものにするための最良の方法です。

于 2012-04-11T08:40:39.770 に答える