2013-08-22 13 views
5

スイッチケースにスイッチケースを入れるのは悪い習慣ですか?そうなら、代替案は何ですか?必要がない場合は、実際にif/else ifを使用する必要はありません。代わりに、いくつかなどを行うためのスイッチケースにスイッチケースを入れるのは悪い習慣ですか?

if((this == 1) && (that == 1)){ //something } 
else if((this == 1) && (that == 2)){ //something } 
else if((this == 2) && (that == 3)){ //something } 

私はの線に沿って考えていた:

switch(this){ 
    case 1: 
     switch(that){ 
      case 1: 
       // something 
      break; 
      .... 
     } 
    break; 
    .... 
} 

それはちょうど私には本当に間違って見えます。文法に間違いはないが、適切な練習に関しては間違っている。

+2

私はそれがOKであるケースを見ることができます。しかし、私はそれをかなり見詰めて、もっと簡単なテクニックを見つけることができるかどうかを見ていきたいと思います。 –

+0

実際には詐欺ではありませんが、関連性のある/興味深い情報があります:http://stackoverflow.com/questions/7807970/nesting-switch-cases-in-javascript-any-speed-advantage – Joum

+1

関連する回答を得るには、質問にコードを追加してください... –

答えて

3

避け、次のアプローチ

switch(id) 
{ 
    case 1: 
    { 
     switch (subid) 
     { 
      case 4: 
       // nested code 
     } 
    } 
    case 2: 
     // some code 
} 

望ましいアプローチと、それは読んで、あなたのコードが難しく行った場合、それは悪い方法

switch(id) 
{ 
    case 1: 
     SubSwtich(subid); 
     break; 
    case 2: 
     // some code 
} 

function SubSwtich(int subid) 
{ 
     switch (subid) 
     { 
      case 4: 
       // nested code 
     } 
} 
+0

すてきな答えをありがとうございました。私はすべての洞察に感謝します。 – seroth

3

私はそれを悪いと思うでしょう。ほとんどの場合、これは判読不能です。

「サブ」スイッチケースをメソッドに抽出することができます。

7

さまざまな機能を持つ大量の機能を持つのは悪い習慣です。スイッチのケースにスイッチケースがある場合は、関数が大きすぎる可能性があることを示唆しており、それをより分かりやすい小さな塊に分割することを検討する必要があります。

しかし、厳しいルールはありません。それはすべて正確なシナリオに依存します。

0

悪い練習ですか?いいえ!おそらく、トラブルシューティングになると潜在的な痛みです!すべての「オプション」をもっと整理された共通のものに変えることについて、何ができるかをご覧ください。送信されるパラメータの数によって決まるメソッドのオーバーロードを使用して、独自の関数を記述することさえできます。

at this SO postをご覧になり、いくつかのアイデアがあるかどうかを確認してください。

0

switch文に依存する異なるルーチンでコードを破る必要があります。また、ルーチンではswitch caseも引き続き使用できます。ちょうど次のように。

private void Switch(int value) 
    { 

     switch (value) 
     { 
      case 1: 
       SwitchNest(value); 
       break; 
      case 2: 
       break; 
     } 
    } 

    private void SwitchNest(int value) 
    { 
     switch (value) 
     { 
      case 1: 
       SwitchOtherMethod(value); 
       break; 
      case 2: 
       break; 
     } 
    } 
+0

1回限りの使用のための機能、私はそれは価値がないと主張するでしょう。もちろん、1つの場所ではなくワークフローに従うようにコード内の場所をジャンプしていることは言うまでもありません。 (可読性の観点からは、これはIMHOかもしれませんが、一回限りの機能を追いかけるよりも入れ子にされたスイッチに目を通したいと思います) –

1

にネストされたセクションを移動することで、あなたのコードを改善練習。

あなたの特定の例の場合は、あなたが決めるべきかどうかは定かではありませんが、一般的にはそうかもしれません。あなたは選択肢を求め

...

  1. は、サブ関数にあなたのコードの一部を抽出します。例えば:ここ

    case 'foo' : 
        myVar = 'blah'; 
        break; 
    case 'bar' : 
        myVar = secondLevelFunction(); 
        break; 
    

    secondLevelFunction()は各casemyVarの値を返すの追加switch()声明が含まれています。

  2. アレイマッピングを使用します。例えば:あなたはコードの品質の具体策を探しているならまた

    var mapper = {'foo':'blah', 'bar':'bibble', etc}; 
    
    //now, instead of a big switch(input) { .... } block that sets myVar 
    //for each option, you can just set it directly in a single line, like so: 
    var myVar = mapper[input]; 
    

、あなたはおよそCyclomatic Complexityを学ぶ必要があります。これは、関数の複雑さの尺度です。測定は、関数が持つ「決定ポイント」の数を調べることによって行われます。それぞれcase,if、ループなどは「決定ポイント」です。あなたが多くなるほど、あなたの機能はより複雑になります。

Cyclomatic Complexityはコード品質と優れたコーディング慣行に密接に関連しているため、機能に高いCCスコア(複数のネストされたswitchブロックがある場合)がある場合、コード品質が悪い。上で説明した両方の代替ソリューションは、これを助けることができます。私はあなたにCCの詳細を読むことを任せます。

明らかに代替ソリューションはニーズに合わせて調整する必要がありますが、うまくいけばあなたにいくつかのアイデアを提供します。

関連する問題