2014-11-10 1 views
0

Я видел аналогичный вопрос, но я хотел получить дополнительную ясность, когда люди считают, что не использовать несколько операторов возврата. (Я считаю, что это вопрос агностики)Лучшие практики - заявления с множественным возвратом

Я всегда очень старался убедиться, что для метода всегда существует только одна инструкция exit.

Пример:

doSomething: function() { 
    for (var i = 0; i < 10; i++) { 
    if (objCars[i].color == "red") { 
     this.carIndex = i; 
     return true; 
    } 
    } 
    return false; 
} 

Раньше я бы переписан что-то вроде этого:

doSomething: function() { 
    var bResult = false; 
    for (var i = 0; i < 10; i++) { 
    if (objCars[i].color == "red") { 
     this.carIndex = i; 
     bResult = true; 
     break; 
    } 
    } 

    return bResult; 
} 

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

Спасибо, -Stephen

+1

Это 100% основанный на мнениях. Я лично считаю, что первый подход более читабельен, но, как я уже сказал, он основан на мнениях. Кстати, в вашем втором подходе вы забыли добавить 'break'. –

+0

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

ответ

0

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

В этом случае, я бы сделал это:

doSomething: function() { 
    var i = 0; 
    while (i < 10 && objCars[i].color != "red") { 
    this.carIndex = i; 
    i++ 
    } 
    return i < 10; 
} 

Надеется, что это помогает

+0

Извините, я забыл «перерыв» в моем примере .. полностью испортил эффективность моих примеров. Но да, «цвет! =« Красный »мог быть включен в условие цикла. Тем не менее, я не чувствую, что это обязательно лучше, если эта проверка делает условие цикла слишком многословным. (В этом конкретном случае согласен 100%) – user992524

0

я найти единый оператор возврата намного яснее в этом случае.

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

У вас также есть увеличение производительности по мере того, как вы не можете перекодировать код, как только вы найдете допустимое значение. В первом примере вы можете запустить цикл for для одной итерации, в то время как один из них всегда будет работать для всех 10 итераций. Вы можете предотвратить это, изменив условие цикла, но это делает код еще более судорожным, обращаясь к переменной во многих несвязанных местах.

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

+0

Извините, я забыл перерыв в моем примере ..полностью разрушил эффективность моих примеров. – user992524

+0

На самом деле, это только усиливает мои аргументы. В конце концов, производительность - всего лишь одна часть головоломки. Вы просто добавили еще один. Невозможно забыть сделать более глубокое заявление о возвращении. Очень легко забыть перерыв. В конце концов, второй пример также более сложный и, следовательно, более подвержен ошибкам. –

Смежные вопросы