2009-03-27 6 views
5
Switch(some case) { 
    case 1: 
      // compute something ... 
      return something; 
      break; 
    case 2: 
      // compute something ... 
      return something; 
      break; 

/* some more cases ... */ 

    case X: 
      // compute something ... 
      return something; 
      break; 
    default: 
      // do something 
      return something; 
      break; 
} 

このスイッチのステートメントは悪いですか?私の意見で

このswitch文は、リターン正当であるとちょうどdoesntの右に見えるか、右に感じる破ると仮定。

ブレークは明らかに重複していますが、省略形が貧弱です(または、この貧弱なスタイルが最初から始まっていますか?)。


私は個人的にこれを行ういけないが、仕事でのコードベースでは、このうちのいくつかはあります。そして、いいえ、私は独善になるつもりはなく、コードベースを修正してください。

+0

LOLLLL @ the "code-smell"タグ! – Poni

答えて

11

C#コンパイラは、ブレークが到達不能コードであることを通知すると警告を出します。だから私の本では、復帰と休憩の両方を持つのは悪い形です。

+0

翻訳された言語を使用する人々のための思考のための素晴らしい食品 –

5

私の意見では、私は 'break'キーワードを省略します。私は個人的に、「実行が終了しました!これ以上見ることはありません! ' -が悪いスタイルです含める

switch(some case) { 
    case 1: 
      // compute something ... 
      break; 
    case 2: 
      // compute something ... 
      break; 
/* some more cases ... */ 
    case X: 
      // compute something ... 
      break; 
    default: 
      // do something 
      break; 
} 
return something; 
5

は、私は小さな変更になるだろう。それらは到達不能なステートメントです。それらを取り除く。

私は、ローカル変数を設定してからちょうど戻り値を返す代わりに、ケースが直接返されるのが好きです。つまり、のコードを読んでいるときにはそれが信じられないほど明確です。つまり、は、それだけです。最初の場所でのスイッチングの面で

余談:switch文を使用すると、ここで行うには正しいことであるかどうかについては

、それは実際に他のものに依存します。代わりに多態型を使用するのは理にかなっていますか?あなたがJavaであれば、スマートな列挙型を使用できますか? (あなたは、C#でこれらを模倣することができますが、できるだけ多くのサポートはありません。)

は、私は、これは、少なくともプロンプト異なるデザインを考慮しなければならないと言うだろう - しかし、それはよくあなたが欲しいものを行う最も簡単な方法かもしれません。

+3

これは、何か他のことが起こっているかどうかを確認するためにcase文全体を読む必要があることを意味しています。あなたがちょうど戻ってきたら、すぐに分かります。いいえ、何もしません:-) – MPritchard

+0

あなたはそれぞれのケースの終わりにbreakステートメントを持っているので、それ以外のものは変更できません。しかし、他の答えのいくつかを読んで、私は代替案がreturn文で各ブレークを置き換えることになることに同意するでしょう。 – Elie

+0

エリー - あなたがどこから来ているのか分かりますが、私はこれをテキストブックの回答と考えています –

21

いいえ、不作為が悪いのスタイルではありません。

+0

帰りの声明をすべての場面に入れることは、あなたがもう一度「何か」をすることを決める日まで戻ります。例えば、あなたが何かを記録したいと言ってください。あなたのルーチンの一番下にある1つの中心的な場所の代わりに、すべてのケースを歩き回り、おそらく考え直さなければなりません。誰もがそうであるように、私は必ずしも "一点返り"のガイドラインに従うとは限りませんが、それには理由があります。 –

+0

その時点で別の方法に抽出するか、ローカル変数を使用するように変更します。あなたが実際にそれを必要とするまでそれを残すことに害はありません...そして、それは結局機械的なリファクタリングです。 –

0

コード臭は設計上の問題を意味します。これは単なるフォーマットの問題です。ほとんどの人は、休憩を省略したバージョンが優れていることに同意すると思います。

0

ブレークは冗長です。

いくつかの経験則では、常に1つの場所で機能を終了するのは良いことですが、このルールが作成されてからTry-Catchが発明されました(oop goto)。

アプリケーション全体で同じスタイルを維持している場合は、スイッチでリターンを生かすことができます。

1

私はコードはあなたがこの私のように本当にハードコーディングnumersならそうこれらの観察のいくつかは...

「ケース1」 適用できない場合がありますことを意図していることをどのようにリテラルわかりませんそれが貧弱なスタイルだと思って、あなたは列挙を使って調べるべきです。

単純に何かを返すだけで、ケースのサブセットに追加のロジックがない場合は、配列や辞書に "somethings"を入れ、switch文を使用するのではなくインデックスでアドレスするだけです。 ..

戻り代[インデックス]

0

ここでコードのにおいがcase文にハードコードされた値です。

返品については、味と判断の問題です。もちろん、あなたのケースが複数のページにまたがっている場合は、リターンがケースに入っていれば読むのが簡単ですが、問題は大きなスイッチで始まります。

Personnaly私は、これまで以上に処理を追加する必要がある場合は、すべてのケースを訪問するよりもリファクタリングが安価なので、単一戻りオプションを使用します。また、リファクタリングのために他の人に与えられた場合、彼らはすべての場合にコードを貼り付けるという誘惑を持っていないだろう、少なくとも私はそう望むだろう...彼らが彼らのコードレビューをしている人ではない明らかにコピーペースト)。

+1

ハードコードされた値について冗談を言っていましたか?あなたは私が擬似コードを使っているのを見ることができませんか? –

+0

はい私はあなたが擬似コードを使用しているのを見ることができます。また、ケースの値は定数ではなく数字であることもわかります。私が言っているのは、大文字小文字の値が悪いほど悪い数字であり、通常は注意が必要なものを示しているということです。 – Newtopian

+0

リターン...ブレーク;コードの匂いではなく、フォーマット上の問題です。どちらの方法でスライスしてもエラーは発生しません。したがって、ここでコードの匂いがある場合は、コードの匂いにはならない残りの部分については数字でなければならないということです。 – Newtopian

0

スイッチステートメント自体がコードの匂いです。

l99057jの行に沿って、入力を一定値にマッピングするだけであれば、これは適切な検索構造のための場所です。たとえば、順次入力の配列/リストスイッチ文ではなく、疎なものです。あなたが何かを計算しているならば、その値はあなたが入力で呼び出す代理人になります。

0

他は、他の側面についてコメントしています。戻り値の後で冗長なブレークについては、ボディーが単一のステートメントの周りに{}と同じ理由でそれらを保持します。すべてのプログラマーがそれらのブレークをそこに置くのは第二の性質でなければなりません。無意識に欠けているものよりも冗長な休憩が100回ある方がよい。

関連する問題