コーディングスタイルの原則です。たとえば、単一出口の原則です。
1つの出口か複数の出口かを考えている人々は、まだ1960年代後半に立ち往生しています。当時、このような議論は構造化プログラマーの初期段階にあったため重要であり、Bohm-Jacopini構造化プログラム定理の背後にある発見はすべてのプログラミング構造に普遍的に適用できるわけではないことを宣言する多くのキャンプがありました。
それはずっと前に解決されるべきものでした。まあ、それは解決しました(アカデミアと業界の両方で、正確にはほぼ40年)が、人々(絶対に賛成か反対か)は注意を払っていません。
私の残りの答えに関しては、それはすべて相対的です(ソフトウェアにはないものは何ですか?):
はい。ほとんどの場合、一般的なケースでは、エッジケースおよび言語固有のプログラミング構成に固有の注意事項があります。
常にですか、それとも時々ですか?
ほとんどの時間。
それは実際にどのくらい違いますか?
依存します。
読み取り可能なコードと読み取り不可能なコード。複雑さの増加(これでエラーが発生する可能性が増加する)と単純な複雑さ(そしてエルゴ、エラーの可能性が小さくなる)コンパイラーが暗黙的な戻り値を追加しない言語(Pascal、Java、C#など)とデフォルトはint(CおよびC ++)。
結局、それはキーボードの後ろの人/時間で磨かれたスキルです。次のように、複数のreturnステートメントを使用しても問題ない場合があります(一部のPascal風の擬似コード)。
function foo() : someType
begin
if( test1 == true )
then
return x;
end
doSomethignElseThatShouldnHappenIfTest1IsTrue();
return somethingElse();
end;
意図は明確であり、アルゴリズムは十分に小さく複雑ではないため、単一の戻り点で使用される最終的な戻り値を保持する「フラグ」変数の作成を保証しません。アルゴリズムにエラーがある可能性がありますが、その構造は非常に単純であるため、エラーを検出する労力は(ほとんどの場合)無視できます。
時々そうではありません(ここではCのような擬似コードを使用しています):
switch(someVal)
{
case v1 : return x1;
case v2 : return x2:
case v3 : doSomething(); // fall-through
case v4: // fall-through
case v5: // fall-through
case v6: return someXthingie;
...
...
default:
doSomething(); // no return statement yet
}
ここで、アルゴリズムは単純な構造を持たず、switchステートメント(Cスタイルのステートメント)は、アルゴリズムの一部として意図的に実行される場合とされない場合のフォールスルーステップを許可します。
アルゴリズムは正しいかもしれませんが、不完全に書かれています。
あるいは、プログラマの能力を超えた外力によって、これは合法的に必要なアルゴリズムの実際の(そして正しい)表現です。
たぶんそれは間違っています。
これのいずれかの真実を明らかにするには、はるかに多くの努力が必要です、前の例よりもがです。そして、ここに私が強く信じるものがあります(これをバックアップする正式な研究がないことに注意してください):
正しいと想定されるコードスニペットを想定:
複数のreturnステートメントは、スニペットが本質的に単純なフロー構造を持つ単純なアルゴリズムを表す場合、そのようなコードスニペットの読みやすさと単純さを向上させます。簡単に言うと、私は小さいという意味ではありませんが、本質的に理解できるまたは自明であることを意味します。これは、不均衡な読書努力を必要としません(また、人々がそれを読む必要があるときに嘔吐させたり、誰かの母親を呪ったり、弾丸を飲み込んだりすることもありません)。 )
戻り値がアルゴリズムの実行中に計算される場合、または計算の責任を負うアルゴリズムのステップがアルゴリズムの構造内の1つの場所にグループ化できる場合、単一のreturnステートメントにより、そのようなコードの可読性と単純さが向上します。
単一のreturnステートメントは、1つまたは複数のフラグ変数への割り当てが必要で、そのような割り当ての場所がアルゴリズム全体に均一に配置されていない場合、そのようなコードの可読性と単純さを低下させます。
複数のreturnステートメントは、returnステートメントがアルゴリズム全体に均一に分散されておらず、サイズや構造が均一ではない相互に排他的なコードブロックを区別する場合、そのようなコードの可読性と単純さを低下させます。
これは、問題のコードスニペットの複雑さに密接に関連しています。そして、これは順番にサイクロマティックおよびハルステッド複雑度の測定に関連しています。これから、次のことを観察できます。
サブルーチンまたは関数のサイズが大きいほど、その内部制御フロー構造は大きく複雑になり、複数または単一のreturnステートメントを使用するかどうかという問題に直面する可能性が高くなります。
結論は次のとおりです。関数を1つだけ実行し、1つだけ実行する(および適切に実行する)ように小さくします。それらが名目上小さな循環的およびハルステッド複雑性メトリックを示す場合、それらはおそらく最も正確であり、理解可能なタスクの実装であることに縛られるだけでなく、その内部構造も比較的自明です。
その後、非常に簡単に、また多くの睡眠を失うことなく、どちらの選択でもエラーを引き起こすリスクをあまり冒さずに、単一のリターンと複数のリターンを使用するかどうかを決定できます。
また、このすべてを見て、単一のリターンまたは複数のリターンの問題に苦しんでいるとき、それは-経験不足、愚かさ、または労働倫理の欠如による-きれいなコードを書かず、書く傾向があることを示唆することができますサイクロマティックおよびハルステッド測定を完全に無視した巨大な関数。