Возвращается рано из функции, более изящной, чем если оператор?

17
задан alain.janinm 30 April 2012 в 21:12
поделиться

13 ответов

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

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

Для подведения вещей: мы действительно смотрим на то, как записать код доступа и не общую логику; опция 2 лучше для кода доступа.

18
ответ дан 30 November 2019 в 10:04
поделиться

В большинстве случаев возврат рано уменьшает сложность и делает код более читаемым.

Это - также один из методов, примененных в спартанское программирование :

Минимальное использование Управления

  1. Уменьшение использования условных выражений при помощи специализированных конструкций такой ternarization, наследование и классы, такие как Значения по умолчанию Класса, Класс Однажды и условных выражений Упрощения Разделителя
  2. Класса с ранним return.
  3. Уменьшение использования конструкций цикличного выполнения, при помощи классов аппликатора действия, таких как Отдельный Класс и Класс FileSystemVisitor.
  4. Упрощение логики повторения с ранними выходами (через return, continue и break операторы).

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

41
ответ дан 30 November 2019 в 10:04
поделиться

Пока ранние возвраты организованы как блок наверху тела функции/метода, затем я думаю, что они намного более читаемы, чем добавление другого слоя вложения.

я стараюсь избегать ранних возвратов посреди тела. Иногда они - лучший способ, но большую часть времени я думаю, что они усложняют.

кроме того, как правило я пытаюсь минимизировать вложенные управляющие структуры. Очевидно, можно взять этого слишком далеко, таким образом, необходимо использовать некоторое усмотрение. Преобразование вложенного if's к единственному переключателю/случаю является намного более четким мне, даже если предикаты повторяют некоторые подвыражения (и предполагающий, что это не производительность критический цикл на языке, слишком немом, чтобы сделать устранение подвыражения). Особенно мне не нравится комбинация вложенной IFS в длинных телах функции/метода, с тех пор если Вы вскакиваете в середину кода по некоторым причинам, Вы заканчиваете тем, что прокрутили вверх и вниз для умственного восстановления контекста данной строки.

11
ответ дан 30 November 2019 в 10:04
поделиться

А-ч опекун.

, по моему скромному мнению, да - логика его более ясна, потому что возврат является явным и прямо рядом с условием, и это может быть приятно сгруппировано с подобными структурами. Это еще более применимо, где "возврат" заменяется, "выдают новое Исключение".

1
ответ дан 30 November 2019 в 10:04
поделиться

По моему опыту, проблема с использованием ранних возвратов в проекте - то, что, если другие на проекте не привыкли к ним, они не будут искать их. Так рано возвращается или не - если существует несколько вовлеченных программистов, удостоверьтесь то, что я по крайней мере знал об их присутствии.

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

Поэтому, когда я смотрю на незнакомую функцию, самая первая вещь, я делаю, ищут весь return с. Что действительно помогает, там должен настроить Ваш синтаксис, окрашивающий для предоставления return другой цвет от чего-либо еще. (Я иду для красного.) Тот путь, return с становятся полезным инструментом для определения, что функция делает, а не скрытые камни преткновения для неосторожного.

4
ответ дан 30 November 2019 в 10:04
поделиться

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

Поэтому, если Вы уверены, существует, не еще идут для опции 2, но если бы еще мог бы быть объем для условие затем, я предпочел бы опцию 1

0
ответ дан 30 November 2019 в 10:04
поделиться

В этом случае (один тест, никакое выражение else) мне нравится тест-и-возврат. Это проясняет, что в этом случае, там не имеет отношения, не имея необходимость читать остальную часть функции.

Однако это разделяет самые прекрасные из волос. Я уверен, что у Вас должны быть большие проблемы для волнения о :)

0
ответ дан 30 November 2019 в 10:04
поделиться

Как сказано прежде, ранний возврат более читаем, особенно если тело функции длинно, можно найти, что удаление} по ошибке в функции на 3 страницы (ведьма сам по себе не очень изящна) и пытающийся скомпилировать это может занять несколько минут отладки non-automatable.

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

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

1
ответ дан 30 November 2019 в 10:04
поделиться

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

  if (a) {
    return x;
  }
  return y;

из-за способа, которым работает язык, но в целом лучше иметь так же мало точек выхода, как это выполнимо.

0
ответ дан 30 November 2019 в 10:04
поделиться

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

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

0
ответ дан 30 November 2019 в 10:04
поделиться

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

0
ответ дан 30 November 2019 в 10:04
поделиться

Я испытываю желание закрыть его как точный дубликат, поскольку я уже видел некоторые подобные потоки, включая оператор Invert “if” для сокращения вложения , который имеет хорошие ответы.

я позволю ему жить на данный момент... ^_^

Для создания этого ответом я - сторонник, которые рано возвращаются, поскольку защитный пункт лучше, чем глубоко вложенная IFS.

0
ответ дан 30 November 2019 в 10:04
поделиться

Существует по крайней мере еще одна альтернатива. Разделите детали фактической работы от решения о том, выполнить ли работу. Что-то как следующее:

public function setHitZone(target:DisplayObject):void
    {
        if(_hitZone != target)
            setHitZoneUnconditionally(target);

    }

public function setHitZoneUnconditionally(target:DisplayObject):void
    {
        _hitZone.removeEventListener(MouseEvent.ROLL_OVER, onBtOver);
        _hitZone.removeEventListener(MouseEvent.ROLL_OUT, onBtOut);
        _hitZone.removeEventListener(MouseEvent.MOUSE_DOWN, onBtDown);

        _hitZone = target;

        _hitZone.addEventListener(MouseEvent.ROLL_OVER, onBtOver, false, 0, true);
        _hitZone.addEventListener(MouseEvent.ROLL_OUT, onBtOut, false, 0, true);
        _hitZone.addEventListener(MouseEvent.MOUSE_DOWN, onBtDown, false, 0, true);

    }

Любой из этих трех (Ваши два плюс третье выше) разумен для случаев, настолько маленьких. Однако это была бы Плохая Вещь иметь функцию сотни строк долго с несколькими "антикризисными точками", опрыснутыми повсюду.

0
ответ дан 30 November 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: