5

複数のリターンポイントを使用するのではなく、1つだけを使用する必要があるとよく言われます。

この関数を例にとってみましょう。

function data($item){
    switch($item){
        case 'one':
            return 1;
        case 'two':
            return 2;
        case 'three':
            return 3;
        case 'different_type':
            return 'Something Different';
        default:
            return false;
    }
}

どうやらこれを書くためのより良い方法は次のようになります。

function data($item){
    $value = false;
    switch($item){
        case 'one':
            $value = 1;
            break;
        case 'two':
            $value = 2;
            break;
        case 'three':
            $value = 3;
            break;
        case 'different_type':
            $value =  'Something Different';
            break;
        default:
            $value = false;
    }
    return $value;
}

どちらか一方の好みの問題ではない理由はありますか?

2つ目は、IDEが戻り値を示唆する型を作成する可能性が高いと思いますか?しかし、ここにもパフォーマンスの問題がありますか?

4

5 に答える 5

5

どちらか一方の好みの問題ではない理由はありますか?

時々ですが、それは具体的なコードに依存します。

2つ目は、IDEが戻り値を示唆する型を作成する可能性が高いと思いますか?

いいえ、通常はそうではありません。

しかし、ここにもパフォーマンスの問題がありますか?

早期リターンは、コード内のより長いパスをショートカットできるため、メリットがあります。

優れたコーディングガイドラインは、通常、これを厳密に管理するものではありません。以前は、言語がそれほど柔軟ではなかったため、厳密なアプローチを維持することが理にかなっている場合があります(関数の最後の行は単一のreturnコマンドである必要があります)。

今日では、循環的複雑度を減らすことがより重要であることが知られています。これは、早期に戻る場合によくあることです。しかし、これを一粒の塩と一緒に取ってください、あなたがこれまでに早く戻った場合、これが自動的に当てはまるというわけではありません。


あなたがコードについて話しているとき、最初の例は私の目にあるはずです:

function data($item) {

    static $map = [
        'one'   => 1,
        'two'   => 2,
        'three' => 3,
        'different_type'
                => 'Something Different',
    ];

    # return @$map[$item] ?: false;
    return isset($map[$item])
        ? $map[$item] 
        : false
        ; 
}

しかし、これはあなたの例に反することにもなります。

于 2012-10-07T11:34:52.060 に答える
2

読みやすさのためだけです。IDEは正常に動作し、パフォーマンスにはそれほど影響しませんので、心配する必要があります。複数のリターンポイントを持つコードは、通常、読み取りとデバッグが難しいというだけです。

しかし、繰り返しになりますが、それは好みの問題でもあり、あなたが慣れていることに大きく依存します。

于 2012-10-07T11:27:55.467 に答える
0

関数が何かを返すと、その関数の残りの行は実行されなくなるため、最初のメソッドでパフォーマンスの問題が発生することはありません。それは何よりも読みやすさでなければなりません。

編集済み: 実際、2回目の反復では、変数に値を割り当ててからその変数を返す必要があるため、技術的にはより多くのリソースを使用する必要がありますが、その違いはごくわずかです。

于 2012-10-07T11:29:24.187 に答える
0

最近のコンパイラは、この種のコードを効率的な方法でコンパイルするのに十分スマートであり、これらの両方が同じ命令のセットに変換される場合があります。個人的には、戻り値が最後にあるため、理解しやすいと思います。働き。

于 2012-10-07T11:32:18.687 に答える
0

私はいつでも1つのリターンポイントを持つアプローチを好みます。その理由は、コードを理解するのがはるかに簡単だからです。これは些細なことのように思えるかもしれませんが、私たちは皆、他の誰かのスパゲッティコードを読んでみたと確信しています。これにより、特にコードパスの理解がより困難になる可能性があるより高度なケースで、メソッド全体で何が起こっているのかを理解しやすくなります。複数のリターンポイントもデバッグが難しいと思います。ただし、非常に単純な方法の場合は、2つのリターンポイントを設定しても問題ないと思いますが、より複雑なシナリオの場合は、それを回避するために最善を尽くします。

パフォーマンスに関しては、ほとんどの場合、違いは最小限だと思います(ただし、リターンポイントになった後に実行する必要のあるコードの量によって異なります)。このような小さな調整よりもはるかに大きなマージンでパフォーマンスを向上させることができる領域は他にもたくさんあるので、読みやすさの向上による利点は、ほとんどの場合、パフォーマンスの側面を上回っていると思います。たとえば、リターンポイントであった可能性のあるものの後にデータベース、Webサービス、またはI / O呼び出しがある場合、パフォーマンスへの影響はさらに大きくなります。この場合、「早期」に戻るとパフォーマンスが大幅に向上しますが、特定のシナリオでこれらの呼び出しが行われないようにすることができるため、複数の戻りポイントを回避できます。ただし、本当に低レベルを最適化したい場合は、単一のリターンポイントでより多くの命令が発生することになります。しかし、私が言ったように、

于 2012-10-07T11:35:05.613 に答える