12

ここでは、x、y などと呼ぶ長いステートメントがあります。私の条件文の構造は次のようになります。

if(x || y || z || q){
    if(x)
       do someth
    else if (y)
       do something

    if(z)
       do something
    else if(q)
       do something
}
else
    do smthing

このことを書くためのより良い、より短い方法はありますか? ありがとう

4

6 に答える 6

4

今の書き方に大きな問題はないと思います。単一ステートメントの if ブロックでも、中かっこを使用することをお勧めします。これにより、後でコード行を追加する必要がある場合 (中括弧を追加するのを忘れる可能性があります) に備えて、間違いを避けることができます。私もそれがより読みやすいと思います。コードは次のようになります。

if (x || y || z || q) {
    if (x) {
       do something
    } else if (y) {
       do something
    }

    if (z) {
       do something
    } else if (q) {
       do something
    }
} else {
    do something
}
于 2010-04-07T07:22:12.337 に答える
4

複数のチェックとエラーが発生しやすい複雑な論理式を回避する別のバリ​​アントは次のようになります。

boolean conditionhandled = false;
if (x) {
   do something
   conditionhandled = true;
} else if (y) {
   do something
   conditionhandled = true;
}

if (z) {
   do something
   conditionhandled = true;
} else if (q) {
   do something
   conditionhandled = true;
}

if (!conditionhandled) {
   do something
}
于 2010-04-07T07:24:27.843 に答える
1

たぶん、これは少し読みやすいです。ただし、ここで 1 つの追加チェックを実行します。ミッション クリティカルなコードでない場合は、次のコードを使用できます。

if (x)
  do something;
else if (y)
  do something;

if (z)
  do something;
else if(q)
  do something;

if !(x || y || z || q)
  do something completely different.
于 2010-04-07T07:18:05.003 に答える
1

これは私にはかなり明確に思えます (そして、明確であることは良いことです)。

できることは、最初に x、y、z、q を評価し、それらを変数として保存することです。これを 2 回行う必要はありません。

于 2010-04-07T07:17:59.323 に答える
0

x、y、z、q についていくつかの仮定を立てることができますか? たとえば、そのうちの 1 つだけが真である可能性があります。あなたがそれを州として見ることができたよりも

enum State {
X{
  void doSomething(){
    doItTheXWay();
  }  
},
Y{
  void doSomething(){
    doItTheYWay();
  }  
},
Z{
  void doSomething(){
    doItTheZWay();
  }  
},
Q{
  void doSomething(){
    doItTheQWay();
  }  
};
  void doSomething(){

  }
}

そして、ifステートメントを使用したコードで

状態を割り当てて、正しいことを行うことができます

State state = getAState();
state.doSomething();

列挙型が気に入らない場合は、状態がインターフェイスであり、X to Q がクラスを実装している可能性があります。この場合の利点は、同じ if else 構造を複数回使用できることです。後でいくつかのコードラインを言ってください。

if(x)
  do_the_next_thing_with_X();
...

または、列挙型を別の関数で拡張して、単一の呼び出しを行うこともできます

state.doTheNextThing();
于 2012-08-11T23:23:20.613 に答える
0

実際、あなたが得たものは問題ないと思いますが、次のことはお勧めしません。

s = true;
if (x) {
    do something;
    s = false;
} else if (y) {
    do something;
    s = false;
}
if (z) {
    do something;
    s = false;
} else if (q) {
    do something;
    s = false;
}

if (s) {
    so something;
}
于 2010-04-07T07:22:17.230 に答える