質問
例えば...
if ( /* Condition */ ) {
if ( /* Condition */ ) {
if ( /* Condition */ ) {
// Superb!
} else {
// Error 3
}
} else {
// Error 2
}
} else {
// Error 1
}
これを避ける方法を知っていますか?ありがとうございました!
解決
これがライブラリ関数の場合、 throw
適切なアクションかもしれません。
if (!condition1) {
throw "Condition 1 failed.";
}
if (!condition2) {
throw "Condition 2 failed.";
}
if (!condition3) {
throw "Condition 3 failed.";
}
// Superb!
他の許容可能な行動は次のとおりです。
- 戻る
0
,null
, 、 またundefined
. - ユーザーにエラーを表示し、返信します。
ユースケースに適した障害アクションを決定する必要があります。
他のヒント
チェックする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
}
まあ、例外を使用したり、ブロック内で破損したり、複数の関数を使用したりできます。多くの場合、これには、コードが正しい方法で注文されるために条件を反転させる必要があります。
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)ループは、匿名のブロックを許容しない言語で脱出できるブロックを作成する方法です。それは同じくらい簡単に関数であり、リターンを使用するか、例外を備えたトライキャッチを使用することができます。
これが好きですか?
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
}
if ( ! /* Condition */ ) {
Error 1
throw someSortOfException
}
if (! condition 2){
Error 2
throw someSortOfOtherException
}
if (! condition 3){
Error 3
throw another Exception
}
// Success!
状況に応じて、コードが好まれる場合があります。たとえば、どこかでこれらの例外をキャッチしたいと思うでしょう。
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!
はい;あなたは一緒に作曲することができます if
ステートメントとオペレーターを使用して単一の化合物ステートメントに記述し、1つのブロックでエラー条件を処理します。ただし、エラー処理のニーズに応じて、もう一度複数を持つ必要がある場合があります if
sエラーを適切に処理していることを確認します(実際にエラー処理解像度に依存します)。
ウィットに:
if (CondA && CondB && CondC)
{
// Execute success
}
else
{
if (!CondA)
// Do error A
else if (!CondB)
// Do error B
else if (!CondC)
// Do error C
}
}
いくつかの方法がありますが、最も簡単なことは、単にいくつかの機能を破壊し、異なるレイヤーを抽象化することです(これは、自分が深くなっていることに気付いた場合はとにかく実行する必要があります)。
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)];