2010-11-24 9 views
9
例えば

...チェーンコードの作成を停止するには?

if (/* Condition */) { 

    if (/* Condition */) { 

     if (/* Condition */) { 

      // Superb! 

     } else { 

      // Error 3 

     } 

    } else { 

     // Error 2 

    } 

} else { 

    // Error 1 

} 

は、あなたがこの問題を回避する方法を知っていますか?ありがとうございました!

答えて

11

これがライブラリ関数の場合は、throwが適切な処置である可能性があります。

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

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

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

// Superb! 

他の許容アクションは次のようになります。0null、またはundefinedを返す

  • ユーザーにエラーを表示して戻ります。

あなたのユースケースに適した失敗アクションを判断する必要があります。

+0

くそー、あなたの忍者! 47秒? :-( – Dragontamer5788

+2

+1:最初に "else"部分をチェックするために条件を反転させることで、 "矢頭"の入れ子条件を回避するのが良い習慣です。エラーチェックの線形ストリームは、ネストされたものよりも読みやすく、成功チェックのストリーム – David

+2

@David:Nod。私の大学のCS教授の一人は、「戻り」のようなものを憎んでいました。実際に入れ子にされた条件文のばかげたレベルをどのように読むのが好きであることを実際に知った – cdhowie

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 
} 
0
if (! /* Condition */) { 
Error 1 
throw someSortOfException 
} 

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

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

// Success! 

、あなたのコードが好まれます。あなたはたぶんどこかの例外をキャッチしたいと思うでしょう。

1

ブロック内で例外やブレーク、複数の機能を使用できます。多くの場合、コードを適切に整列させるために条件を逆にする必要があります。

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

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

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

    // Superb! 
} while (false); 

DO-しばらく(偽)ループを使用すると、無名ブロックを容認しない言語でから抜け出すことができますブロックを作る方法です。それは、関数として簡単に使うことができ、リターンを使うことも、例外を持つtry-catchを使うこともできます。

+0

これはif/elseよりどれだけ正確ですか? – M2tM

+1

@ M2tM私はそれがより良いと言いました、私はそれが選択肢だと言いました - 私は他の人たちをリストアップし、人々が見たことのない最も珍しいアプローチを示しました。他の答えは他のアプローチを示しています。 if-elseセットは、私が嫌う重複した条件に答えるものです。 – Orbling

+0

重複した条件には答えません。if(!Condition1){ERROR1} else if(!Condition2){ERROR2} else if(条件3){ERROR3} else {SUCCESS} – M2tM

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! 
0

はい。 ifステートメントをAND演算子を使用して1つの複合ステートメントにまとめ、1つのブロック内のエラー条件を処理することができます。しかし、エラー処理の必要性に応じて、エラーを適切に処理していることを確認するために、再度複数の値を設定する必要があります(エラー処理の解像度によって異なります)。ウィットに

if (CondA && CondB && CondC) 
    { 
    // Execute success 
    } 
else 
    { 
    if (!CondA) 
     // Do error A 
    else if (!CondB) 
     // Do error B 
    else if (!CondC) 
    // Do error C 
    } 
} 
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 
} 
+0

通常の言語構造を使用して、エラーの次の条件を適切な順序できちんと整理します。なぜ多くの人々がスローアプローチがより良いと思うのかは私を超えています。 – aaaaaaaaaaaa

+0

@eBusinessエラー条件があり、これが関数である場合、エラーをスローすることは適切なことです。 3つのエラーケースを呼び出し側で区別する必要がある場合は、エラーの詳細を含むオブジェクトを返すか、呼び出し側がこのシナリオをテストする必要があります。私はどちらが好きなのか知っています。 – cdhowie

0

はいくつかの方法がありますけれども、コードは次の構造を使用してビットをクリーンアップすることができ、最も単純には単にいくつかの機能と抽象うち異なる層をバストすることだと思いますあなた自身が深く行く見つけた場合。)

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

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

基本的な前提は、関数が可能な場合は、抽象化の一つの層の上に住んでおり、一つのことを行うべきであるということです。

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

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)]; 
関連する問題