4

参照としてint[]配列を使用しています。私のcaseステートメントの使用は適切なのか、それとも今後エラーが発生するのか疑問に思います。

これは私のコードです:

    int switcheroo = intarray[0];
    int foo = intarray[1];
    boolean size = false; 
    boolean biggersize = false;

    switch (switcheroo) {

    case 0:
        switch (foo) {
        case 1:
            doSomething(switcheroo); //change switcheroo somehow.
            break;
        case 2: 
            doSomethingElse(switcheroo); //change switcheroo differently.
            break;
        }
    case 1:
        size = true;
        break;
    case 2: 
        biggersize = true;
        break;
    default:
        break;
    }

偶然でない限り、これは、ネストされたcaseステートメントから他のcaseへの変更を必要に応じて波及させるように機能しています。

私の質問は次のとおりです。

この入れ子は、さらに問題を引き起こしますか?

休憩の欠如です。ケースの悪い習慣の後?

ありがとう。

編集:switchステートメントの途中でswitcherooを変更するメソッドは、それに応答するためにそこに配置されました。私はこれをしませんこれは私のプログラムです。

4

8 に答える 8

8

ネスティングが問題を正確に引き起こすわけではありませんが、読みにくい場合があります。コメントやその他のドキュメントを追加すると、将来のコーダー (および 1 週間後のあなた自身) がこれを見て理解するのに本当に役立ちます。

ブレークがないこと自体は悪い習慣ではありませんが、ほとんどの場合のステートメントに含まれているものであるため、最後に のようなコメントを追加し// no break, allow fall-throughます。

したがって、どちらの場合も、優れたドキュメントに要約されます。

これらの点は、このコードがあなたが思っていることを実行するとは思わないという事実とは垂直です。

case句は、遭遇するたびに再評価されるわけではありません。それらは、切り替えのためにジャンプするためのポイントに過ぎません。したがって、あなたの例では、で開始すると常に終了します - fromで終了することはありません。case 1case 0case 2case 0

これを再構成するとしたら、次のようにします。を使用する代わりにint、次を使用しますenum

enum Foo { GOOD_FOO, BAD_FOO }
enum Switcharoo { BAR, BAZ, BAQ, ESCAPE }
enum Size { NONE, REGULAR, BIGGER }

Foo foo = ... // assigned somewhere
Switcharoo roo = ... // assigned somewhere
Size size = NONE;

// use a while loop to reevalulate roo with each pass
while(roo != Switcharoo.ESCAPE) {
    switch(roo){
        case BAR:
                switch(foo) {
                    case GOOD_FOO: foo = doSomething(foo); break;
                    case BAD_FOO: foo = doSomethingElse(foo); break;
                }
            break;
        case BAZ:
            roo = Switcharoo.ESCAPE;
            size = Size.REGULAR;
            break;
        case BAQ:
            roo = Switcharoo.ESCAPE;
            size = Size.BIGGER;
            break;

    }
}
于 2012-07-26T15:05:53.167 に答える
1

RE:休憩不足です。ケースの悪い習慣の後?

各 case ステートメントの後にブレークを含めない場合、フローは次のステートメントまで続くため、複数のオプションのコードが実行されます。

Java チュートリアルから:

もう 1 つの興味深い点は、break ステートメントです。各 break ステートメントは、囲んでいる switch ステートメントを終了します。制御フローは、switch ブロックに続く最初のステートメントから続行されます。break ステートメントがないと、switch ブロック内のステートメントが失敗するため、break ステートメントが必要です。一致する case ラベルの後のすべてのステートメントは、後続の case ラベルの式に関係なく、break ステートメントに遭遇するまで順番に実行されます。

switch ステートメントの詳細については、http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.htmlを確認してください。

于 2012-07-26T15:05:33.993 に答える
1

1でも2でもない場合foo、switcherooは続けるべきcase 1ですか?はいの場合、コードは正しいです。そうでない場合は、前にブレークを追加する必要がありますcase 1

于 2012-07-26T15:06:04.183 に答える
0

ネスティングとフォールスルーの組み合わせを避けることをお勧めします。少なくとも個人的には、すべてcaseが で終わることを期待する傾向があるbreakため、フォールスルーは、非常に簡単に見つけられ、 よりも明確なコードにつながる場合にのみ使用しますif..else。たとえば、次のようになります。

switch (foo) {
    case 0:
    case 1:
        doSomething();
        break;

    case 2:
        doSomethingElse();
        break;

    default:
        break;
}

つまり、空または非常に単純な (1 つのステートメント)case本体のいずれかです。あなたの場合、最初の本体をcaseメソッドにリファクタリングすると、おそらくうまくいくでしょう:

void changeSwitcheroo(int foo, int switcheroo) {
    switch (foo) {
        case 1:
            doSomething(switcheroo); //change switcheroo somehow.
            break;
        case 2: 
            doSomethingElse(switcheroo); //change switcheroo differently.
            break;
    }
}

// ...

int switcheroo = intarray[0];
int foo = intarray[1];

switch (switcheroo) {
    case 0:
        changeSwitcheroo(foo, switcheroo);
    case 1:
        size = true;
        break;
    case 2: 
        biggersize = true;
        break;
    default:
        break;
}

(これは主に可読性とスタイルについての議論です。スイッチの意味は、「もし switcheroo が1の場合、ケースの真ん中に飛び込む」のまま0です。)

于 2012-07-26T15:23:21.357 に答える
0

switchoperator は一種の条件if演算子です。また、多数の if 演算子が、if-switch 演算子を連続して作成する代わりに、コードにオブジェクト ポリモーフィズムを含める必要があると報告する場合があります。

データをクラス/オブジェクトに再配置し、ポリモーフィズム アプローチを使用してそれらを処理することを検討してください。これにより、コードの信頼性と管理性が向上し、さらに美しくなります。

于 2012-07-26T15:08:28.313 に答える
0

あなたの最初の質問を理解できたかどうかわかりませんが、もう少し情報を提供してもらえますか (具体的なものかもしれません)。

2 番目の質問に関しては、コードが break ステートメントを見つけるまで実行し続けることがわかっている限り、case の後に break ステートメントがなくても問題はありません。

于 2012-07-26T15:08:49.847 に答える
0

選択肢が 2 つしかない場合は、if/else を優先します。コードの行数が少なく、break問題はありません。

この入れ子は、さらに先に問題を引き起こしますか?

問題は、そのようなスイッチのネストが読みにくいことです。ネストされたスイッチを使用していることに気付くまでに、コードを 2 回見なければなりませんでした。これはメンテナンス上の問題になる可能性がありますが、ネストされたスイッチを使用しない理由にはなりません。これは控えめに使用し、インデントを調整して何が起こっているかを明確にし、使用法についてコメントしてください。

休憩の欠如です。ケースの悪い習慣の後?

を省略して失敗する breakと、メンテナンス/デバッグの問題が発生する可能性もありますが、悪い習慣だとは思いません。結局のところ、それはswitchステートメントのデザインに内在しています。次の人、または数か月後にコードを再訪するあなたが、フォールスルーが意図的であることを理解できるように、 フォールスルーのコメントはいつでも歓迎されます。

于 2012-07-26T15:09:17.920 に答える