9

例えば...

if ( /* Condition */ ) {

    if ( /* Condition */ ) {

        if ( /* Condition */ ) {

          // Superb!

        } else {

          // Error 3

        }

    } else {

      // Error 2

    }

} else {

  // Error 1

}

これを回避する方法を知っていますか?ありがとうございました!

4

8 に答える 8

11

これがライブラリ関数でthrowある場合は、適切なアクションである可能性があります。

if (!condition1) {
    throw "Condition 1 failed.";
}

if (!condition2) {
    throw "Condition 2 failed.";
}

if (!condition3) {
    throw "Condition 3 failed.";
}

// Superb!

その他の許容可能なアクションは次のとおりです。

  • 0、、、nullまたはを返しundefinedます。
  • ユーザーにエラーを表示して戻る。

どの障害アクションがユースケースに適しているかを判断する必要があります。

于 2010-11-24T17:57:10.503 に答える
2

チェックする3つの条件と4つのアクション(3つの異なるエラー+ 1つの成功)があるようです。残念ながら、一般的なケースでは、3つの条件付きチェックと4つのアクションが必要になります。次の構造を使用することで、コードを少しクリーンアップできると思いますが

if (! /* condition 1 */ ) {
  // Error 1
} else if (! /* condition 2 */ ) { 
  // Error 2
} else if (! /* condition 3 */ ) { 
  // Error 3
} else {
  // superb
}
于 2010-11-24T17:59:19.880 に答える
1

例外、ブロック内のブレーク、または複数の関数を使用できます。多くの場合、これには、コードを正しい方法で順序付けるために条件を逆にする必要があります。

do {
    if (! /* Condition 1 */ ) {
        // Error 1
        break;
    }

    if (! /* Condition 2 */ ) {
        // Error 2
        break;
    }

    if (! /* Condition 3 */ ) {
        // Error 3
        break;
    }

    // Superb!
} while (false);

do-while(false)ループは、匿名ブロックを許容しない言語でブレークアウトできるブロックを作成する方法です。それは同じように簡単に関数であり、returnsを使用するか、例外を除いてtry-catchにすることができます。

于 2010-11-24T17:58:00.520 に答える
0

これをご希望ですか?

if ( /* Condition 1*/ && /* Condition 2*/ && /* Condition 3 */) {
  // Superb!
}
else if (! /* Condition 1*/){
  // Error 1
}
else if (! /* Condition 2*/){
  // Error 2
}
else if (! /* Condition 3*/){
  // Error 3
}
于 2010-11-24T17:57:44.230 に答える
0
if ( ! /* Condition */ ) {
Error 1
throw someSortOfException
}

if (! condition 2){
Error 2
throw someSortOfOtherException
}

if (! condition 3){
Error 3
throw another Exception
}

// Success!

状況によっては、コードが優先される場合があります。たとえば、これらの例外をどこかでキャッチしたいと思うでしょう。

于 2010-11-24T17:57:58.337 に答える
0
if (!condition1)
    // Error 1 (and exit scope if necessary)

if (!condition2)
    // Error 2 (and exit scope if necessary)

if (!condition3)
    // Error 3 (and exit scope if necessary)

// Superb!
于 2010-11-24T17:58:01.547 に答える
0

はい; AND演算子を使用して、ステートメントを1つの複合ステートメントにまとめif、単一のブロックでエラー条件を処理できます。ただし、エラー処理のニーズによっては、エラーをif適切に処理していることを確認するために、再度複数のが必要になる場合があります(実際には、エラー処理の解決方法によって異なります)。

ウィットに:

if (CondA && CondB && CondC)
   {
   // Execute success
   }
else
   {
   if (!CondA)
      // Do error A
   else if (!CondB)
      // Do error B
   else if (!CondC)
     // Do error C
   }
}
于 2010-11-24T17:58:31.307 に答える
0

いくつかの方法がありますが、最も簡単な方法は、いくつかの関数を単純に無効にして、さまざまなレイヤーを抽象化することです(これは、自分が深く進んでいることに気付いた場合は、とにかく実行する必要があります)。

if ( /* Condition */ ) {
    value = aFunctionSaysWhat();
} else {
  // value = Error 1
}

....
value aFunctionSaysWhat(){
    if ( /* Condition */ ) {
         return aSecondFunctionHere();
    } else {
      // return Error 2
    }
}

基本的な前提は、関数は可能であれば抽象化の1つの層に存在し、1つのことを実行する必要があるということです。

次の可能性は、それをすべて平坦化することです。これは、最初のネストされた方法よりも優れていますが、基本的に同様の複雑さを持っています。オプションがいくつかあり、それ以上追加する予定がない場合は、機能的なアプローチよりもはるかにクリーンになる可能性があります。

if(ErrorCondition1){
   //Error 1
}else if(ErrorCondition2){
   //Error 2
}else if(ErrorCondition3){
   //Error 3
}else{
   //Superb
}

最後に、必要な回答を含むハッシュまたはマップを保存し、完全に削除することができます。これを実装する機能は、結果をハッシュする機能に依存します。

Results = {'Result1':'Error1', 'Result2':'Error2', 'Result3':'Error3', 'Success':'Superb'}

return Results[ConditionHash(Condition)];
于 2010-11-24T17:59:53.497 に答える