Вопрос

Например...

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 Заявления в единое соединение оператора, используя и оператор и обрабатывают условия ошибки в одном блоке. Однако в зависимости от ваших потребностей обращения с ошибками, вам может понадобиться снова иметь несколько ifs Чтобы убедиться, что вы правильно обрабатываете ошибку (это зависит от вашего разрешения обработки ошибок, действительно).

К острому:

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
    }
}

Основная предпосылка заключается в том, что функция должна жить на одном слое абстракции, если это возможно, и сделайте одну вещь.

Следующая возможность состоит в том, чтобы извлечь все это, это превосходит ваш начальный вложенный метод, но в основном имеет сходную сложность. Это может быть намного чище, чем функциональный подход, если у вас есть только несколько вариантов, и вы не планируете добавлять больше.

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)];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top