スイッチのデフォルトケースでブレーク


88

私はbreak、最後のケースの後に含めるかどうかについて、しばしば困惑していますdefault

switch (type) {
    case 'product':

        // Do behavior

        break;
    default:

        // Do default behavior

        break; // Is it considered to be needed?
}

break唯一の目的は、コードが残りのswitchケースを実行しないようにすることです。

break一貫性のために最後を持っているのがより論理的であると考えられbreakますか、機能的な使用をまったく適用しないためにそれをスキップしますか?私の意見では、両方とも異なる方法で論理的です。

これは、.phpファイルをで終わることとある程度比較できます?>。私は?>ほとんど空白スペースを出力するリスクのために終わることはありませんが、ファイルを終了することは論理的なことだと主張することができます。

回答:


144

break最後の選択肢の後、技術的には必要ありません(あなたは、そうである必要はありませんdefault:それは完全に合法であり、時にはdefaultブランチを最初に置くことさえ有用です); コードがswitchステートメントの終わりまで落ちるか、breaks最後のブランチの終わりに出るかは同じ結果になります。

ただし、次の3つの理由から、最後のブランチを含むすべてのブランチをreturnor breakステートメントで終了します。

  1. リファクタリング。すべてのブランチがbreakまたはreturnで終わる場合、意味を変更せずにそれらを並べ替えることができます。これにより、このような並べ替えによって回帰が発生する可能性が低くなります。
  2. 一貫性、および最小の驚き。一貫性により、ブランチの意味が実際に異なる場合を除き、ブランチは一貫して終了する必要があります。最小驚きの原則は、似たようなものは似たように見えることを要求しています。switch前のブロックとまったく同じようにブロックの最後のブランチを終了すると、両方が満たされ、読みやすく、理解しやすくなります。明示的breakに省略すると、最後のブランチは視覚的に異なり(クイックスキャンでは特に重要です)、実際に違いがないことを確認するために、読者は個々のステートメントを読むために非常に重要なレベルまで下降する必要があります。
  3. 自分を守る。すべてのswitchブランチをa で終了する習慣をbreak付けると、しばらくすると自動になり、問題のある場所を誤って忘れてしまう可能性が低くなります。breakすべてのブランチの終わりに期待するように自分自身を訓練することは、欠落しているbreakステートメントを検出するのにも役立ちます。これはデバッグとトラブルシューティングに最適です。

これについての洞察をありがとう!ウィルbreak場合aswell :)続く
ロビンCastlin

7
C#では、break(またはを終了する他の制御フローステートメントcase、最後の選択肢の後に技術的に必要です。
dan04

3
@ dan04:はい、良い点です。C#はここでは例外です。おそらく、言語設計者がswitch既存の言語のフォールスルーの問題を知っていて、それを防止したかったためです。C#が課しているルールは、私の答えからの推奨事項とほぼ一致しています。
tdammers

具体的にどの言語について話しているのですか?C?C ++?C#?Java?PHP?
svick

2
優れたコンパイラーは、次の命令breakを生成するのjmpではなく、最終をNO-OPとして扱いますか?
ネイサンオスマン

11

switch-caseほとんどの言語での使用に関する曖昧さを考えると、それを使用するbreakときは、明示的かつ設計上望ましくない場合を除き、常にステートメントを使用することをお勧めします。

これは、すべてのcase呼び出しが同じように見えるためです。しかし、誰かが(あなたでさえ)case後の段階で最後のブロックの後に挿入することを選択した場合、前のブロックをチェックすることに気を配る必要がないことも意味します。


7
あるケースを次のケースにフォールスルーさせたい場合(そして、それはの縮退したケースではありませんcase foo: case bar: ...)、フォールスルーを発生させたいという点で明示的なコメントを入れました。より明確にします。
ドナルドフェローズ

3
はい// no breakbreak;
-Pacerier

または、[[fallthrough]]C ++の場合は属性。
ルスラン

1

最後のケースのbreak後は必要ありません。私は「last」(デフォルトではない)という言葉を使用します。これは必要ではないため、デフォルトのケースは最後のケースです。

switch(x)
{
case 1:
//do stuff
break;

default:
//do default work
break;

case 3:
//do stuff

}

そしてbreak 、2つの連続したcasesの間にa が必要であることを知っています。時々、if(a!=0)他の人がコードを参照するときに読みやすくするためにコードで使用します。使用することを選択できますがif(a)、それは私の選択の問題です


5
私にとっては、「常にブレークを使用する」ことを意味します。何らかのプログラマーが存在することを確認せずにcase最後に新しいものを追加した場合に備えてあなたは6ヶ月でそのプログラマになれるからです)switchbreak
-SJuan76

@ SJuan76はい、同意します。申し訳ありませんが、将来のエラーに備えて保護を維持したい場合は、最後に追加する必要があります。
スワンナパッタイル

1
この引数を念頭に置いて、, 新しい値が挿入される場合に備えて、常に配列の最後に配置することを主張するかもしれません。しかし、それはいくつかのコードを壊し、一般的に
いよう

1
@Robinコンマの入力は異なります。そこになく、誰かが新しい値を配列に追加すると、コンパイルエラーが発生します。ただし、前のcaseステートメントにbreakがない場合、コンパイルエラーは発生しません。そのため、これが欠落し、実行時エラーが発生する可能性があります。
キースミラー

@RobinCastlin言語で,。Incase defaultは、最後のケースになるように設計されました。言語はbreakその後をエラーと見なすかもしれません。仮定breakは、2つのケース間の差別化要因としてのみ許可されました。
スワンナパッタイル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.