Иногда я сталкиваюсь с кодом, подобным следующему примеру (что именно делает эта функция, выходит за рамки этого вопроса):
function doSomething(value) {
if (check1(value)) {
return -1;
}
else if (check2(value)) {
return value;
}
else {
return false;
}
}
Как вы можете видеть, if
, else if
и else
утверждения используются в сочетании с return
заявлением. Это кажется довольно интуитивным для случайного наблюдателя, но я думаю, что было бы более элегантно (с точки зрения разработчика программного обеспечения) отбросить else
-s и упростить код следующим образом:
function doSomething(value) {
if (check1(value)) {
return -1;
}
if (check2(value)) {
return value;
}
return false;
}
Это имеет смысл, так как все, что следует за return
оператором (в той же области видимости), никогда не будет выполнено, делая приведенный выше код семантически равным первому примеру.
Что из перечисленного больше соответствует хорошей практике кодирования? Есть ли недостатки любого метода в отношении читабельности кода?
Изменить: Дубликат предложение было сделано с этим вопросом, предоставленным в качестве ссылки. Я полагаю, что мой вопрос затрагивает другую тему, поскольку я не прошу избегать дублирующих утверждений, как представлено в другом вопросе. Оба вопроса стремятся уменьшить количество повторений, хотя и немного по-разному.
else
меньше проблема, тем больше проблема в том, что вы, очевидно, возвращаете два типа данных из одной функции, что делает API функции непредсказуемым.-1
является числом,false
является логическим значением иvalue
здесь не указывается, поэтому это может быть объект любого типа.value
это целое число. Если это может быть что-то, то это еще хуже.Ответы:
Мне нравится тот, без
else
и вот почему:Потому что это не сломало ничего, что не должно было быть.
Ненавижу взаимозависимость во всех ее формах (включая именование функций
check2()
). Изолировать все, что можно изолировать. Иногда вам нужно,else
но я не вижу этого здесь.источник
if
блока,} //else
чтобы при чтении кода было ясно, что единственное предназначение выполнения послеif
блока кода - это если условие вif
выражении было ложным. Без чего-то подобного, особенно если код внутриif
блока становится все более сложным, для тех, кто поддерживает код, может быть неясно, что намерение никогда не было выполнено послеif
блока, когдаif
условие истинно.if
чтобы было ясно, что этот раздел кода готов и структура завершена. Чтобы сделать это, я делаю то, чего не делал здесь (потому что я не хотел отвлекать внимание от основной идеи ОП путем внесения других изменений). Я делаю самое простое, что могу сделать, чтобы добиться всего этого, не отвлекаясь. Я добавляю пустую строку.Я думаю, что это зависит от семантики кода. Если ваши три случая зависят друг от друга, укажите это явно. Это повышает удобочитаемость кода и облегчает понимание для всех остальных. Пример:
Здесь вы явно зависите от стоимости
x
во всех трех случаях. Если вы опустите последнееelse
, это будет менее понятно.Если ваши дела напрямую не зависят друг от друга, пропустите это:
Трудно показать это на простом примере без контекста, но я надеюсь, что вы поняли мою точку зрения.
источник
Я предпочитаю второй вариант (отдельный
ifs
с нетelse if
и раноreturn
), НО, который до тех пор, пока блоки кода короткие .Если блоки кода длинные, то лучше их использовать
else if
, потому что в противном случае у вас не будет четкого понимания нескольких точек выхода кода.Например:
В этом случае лучше использовать
else if
, хранить код возврата в переменной и иметь только одно предложение возврата в конце.Но так как нужно стремиться к тому, чтобы функции были короткими, я бы сказал, оставьте их короткими и завершите работу уже в первом фрагменте кода.
источник
return
находится в пределах 3 строк,if
так что это не так уж и отличается,else if
даже после 200 строк кода. Стиль единственного возврата, который вы вводите здесь, является традицией языка c и других языков, которые не сообщают об ошибках за исключением. Задача состояла в том, чтобы создать единое место для очистки ресурсов. Исключительные языки используютfinally
блок для этого. Я предполагаю, что это также создает место для установки точки останова, если ваш отладчик не позволит вам поставить ее на функции, закрывающие фигурную скобку.retVal
. Если вы можете безопасно выйти из функции, сделайте это немедленно, не назначая безопасное значение, которое будет возвращено переменной одного выхода из функции. Когда вы используете единственную точку возврата в действительно длинной функции, я обычно не доверяю другим программистам и заканчиваю тем, что просматривал остальную часть функции для других модификаций возвращаемого значения. Быстро потерпеть неудачу и вернуться рано, среди прочего, два правила, по которым я живу.Я использую оба в разных обстоятельствах. В проверке валидации я опускаю else. В потоке управления я использую остальное.
против
В первом случае читается больше, как будто вы сначала проверяете все предварительные условия, убираете их с пути, а затем переходите к реальному коду, который хотите запустить. Таким образом, сочный код, который вы действительно хотите запустить, напрямую входит в область действия функции; это то, что функция на самом деле.
Второй случай выглядит так, как будто оба пути являются допустимым кодом для запуска, который так же важен для функции, как и другой, основанный на некотором условии. Как таковые, они принадлежат друг к другу на одинаковых уровнях.
источник
Единственная ситуация, которую я когда-либо видел, это действительно важно, это код вроде этого:
Здесь явно что-то не так. Проблема в том, что не ясно,
return
следует ли добавлять илиArrays.asList
удалять. Вы не можете исправить это без более глубокого изучения связанных методов. Вы можете избежать этой неоднозначности, всегда используя полностью исчерпывающие блоки if-else. Эта:не будет компилироваться (в статически проверенных языках), если вы сначала не добавите явный возврат
if
.Некоторые языки даже не допускают первый стиль. Я стараюсь использовать его только в строго императивном контексте или для предварительных условий в длинных методах:
источник
Наличие трех выходов из этой функции действительно сбивает с толку, если вы пытаетесь следовать коду и плохо практикуетесь.
Если у вас есть единственная точка выхода для функции, тогда требуются другие.
На самом деле, давайте идти еще дальше.
Достаточно справедливо, что вы могли бы поспорить за одно раннее возвращение при проверке входных данных. Просто избегайте упаковки всей логики if, если ваша логика в if.
источник
Я предпочитаю опускать лишнее выражение else. Всякий раз, когда я вижу это (в обзоре кода или рефакторинге), я задаюсь вопросом, понимает ли автор поток управления и может ли быть ошибка в коде.
Если автор полагал, что утверждение else было необходимо, и, следовательно, не понимал последствий для выражения return для оператора return, то, несомненно, такое отсутствие понимания является основным источником ошибок в этой функции и в целом.
источник