Как прекратить писать код сети?
-
28-09-2019 - |
Вопрос
Например...
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
Заявления в единое соединение оператора, используя и оператор и обрабатывают условия ошибки в одном блоке. Однако в зависимости от ваших потребностей обращения с ошибками, вам может понадобиться снова иметь несколько 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
}
}
Основная предпосылка заключается в том, что функция должна жить на одном слое абстракции, если это возможно, и сделайте одну вещь.
Следующая возможность состоит в том, чтобы извлечь все это, это превосходит ваш начальный вложенный метод, но в основном имеет сходную сложность. Это может быть намного чище, чем функциональный подход, если у вас есть только несколько вариантов, и вы не планируете добавлять больше.
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)];