Нужно ли писать еще часть в каждом условии if?

Вопрос, который я задал, может быть закрыт, но я просто хочу знать, нужно ли писать еще часть каждого условия if. Один из моих старших программистов сказал мне, что «вы должны написать часть else в каждом условии if». Предположим, у нас нет условий для записи в else, что нам делать? Я предполагаю, что здесь будет здоровая дискуссия....


person Rahul Vyas    schedule 03.08.2010    source источник
comment
Я стараюсь не нападать на своих сверстников. Это имеет тенденцию становиться грязным. Используйте else, только если это имеет смысл.   -  person kbrimington    schedule 03.08.2010
comment
если вы всегда будете слушать своих коллег, вы подхватите их вредные привычки. Нет необходимости говорить «иначе», вы должны научиться сами.   -  person Laramie    schedule 03.08.2010
comment
Я думаю, что ваш старший программист на самом деле сказал, что вы должны думать об else в каждом условии if. Я видел слишком много провалов в коде из-за отсутствия блоков else.   -  person Gilbert Le Blanc    schedule 03.08.2010
comment
Похоже, вот лучший ответ: stackoverflow.com/questions/35053371/   -  person wonko realtime    schedule 29.10.2018
comment
Kubernetes называет это стилем Space Shuttle, и он используется для обеспечения правильности — стоит прочитать: rel="nofollow noreferrer">github.com/kubernetes/kubernetes/blob/   -  person David Ljung Madison Stellar    schedule 02.08.2019


Ответы (11)


Это ужасная идея. В итоге вы получите код вида:

if (something) {
    doSomething();
} else {
}

Как кто-то может думать, что это более читаемо или удобно для обслуживания, чем отсутствие else вообще вне меня. Звучит как одно из тех правил, которые придумывают люди, у которых слишком много свободного времени. Увольте их как можно быстрее или хотя бы тихо и спокойно отойдите :-)

person paxdiablo    schedule 03.08.2010
comment
"One option is to code the else clause—with a null statement if necessary—to show that the else case has been considered. Coding null elses just to show that that case has been considered might be overkill, but at the very least, take the else case into account. When you have an if test without an else, unless the reason is obvious, use comments to explain why the else clause isn’t necessary." - Code Complete Я чувствую противоречие, что вы думаете? - person doubleOrt; 22.06.2018
comment
Я думаю, что, как и многое другое, цитируемое из этой книги, оно должно быть в контексте: предыдущее предложение звучит так: Если вы считаете, что вам нужно простое if утверждение, рассмотрите i> действительно ли вам не нужен оператор if-then-else. Каждый фрагмент кода, который я пишу, является результатом информированного рассмотрения, подобного этому: в данном случае он отклонен, поскольку порядочный программист знает, что отсутствующее предложение else означает, что не следует предпринимать никаких действий. взятый. Я не читаю функцию и не удивляюсь семи строкам, которые никогда не помещались в ее конец, именно так вы должны относиться к отсутствующему else :-) - person paxdiablo; 23.06.2018
comment
Проблема с этой замечательной книгой в том, что время от времени в ней делаются очень очевидные утверждения для начинающих. Например, на предыдущей странице написано you should avoid 'if-then-else' statements where the 'if' block has no statements in its body and instead negate the test condition (я перефразирую). - person doubleOrt; 23.06.2018
comment
Хотя не то чтобы я жалуюсь. В любой день я выберу книгу, которая делает очевидные утверждения, а не ту, которая содержит загадочные неясности, потому что автор провел черту между очевидным/неочевидным (что, возможно, никогда не будет возможным, поскольку у всех разные знания/опыт) в неправильное место. - person doubleOrt; 23.06.2018

Нет, вы, конечно, не должны — по крайней мере, на большинстве языков. (Вы не уточнили; вполне возможно, что есть язык, который делает принудительное выполнение этого.) Вот пример, где я, конечно, не стал бы:

public void DoSomething(string text)
{
    if (text == null)
    {
        throw new ArgumentNullException("text");
    }
    // Do stuff
}

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

По моему опыту, этот шаблон «раннего выхода» довольно распространен и подходит как для возвращаемых значений, так и для исключений. Я знаю, что некоторые предпочитают единственную точку возврата из метода, но в языках, с которыми я работаю (Java, C#), это часто может привести к значительно менее читаемому коду и более глубокой вложенности.

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

public int DoSomething()
{
    // Do some work
    if (conditionBasedOnPreviousWork)
    {
        log.Info("Condition met; returning discount");
        return discount;
    }
    else
    {
        log.Info("Condition not met; returning original price");
        return originalPrice;
    }
}

(Обратите внимание, что я намеренно дал обеим ветвям больше работы, чем просто возврат - в противном случае было бы уместно условное выражение.)

Будет ли это более читаемым без «else»? Это действительно вопрос личного выбора, и я не собираюсь утверждать, что я всегда последователен. Обе ветки с одинаковым отступом каким-то образом придают им равный вес — и, возможно, поощряют возможность рефакторинга позже путем изменения условия... тогда как, если бы мы просто перешли к «возврату исходной цены», рефакторинг помещения этого в блок if и перемещение случая скидки за пределы блока if было бы менее очевидно правильным на первый взгляд.

person Jon Skeet    schedule 03.08.2010

В императивных языках, таких как Java и C, if - else является оператором и не возвращает значение. Таким образом, вы можете с радостью написать только часть if и продолжить. И я думаю, что это лучшая практика, чем добавлять пустые else после каждых if.

Однако в функциональных языках, таких как Haskell и Clojure, if — это выражение, и оно должно возвращать значение. Таким образом, это должно быть выполнено с помощью else. Однако бывают случаи, когда вам может не понадобиться раздел else. В Clojure для таких случаев есть макрос when, который оборачивает if - else, чтобы вернуть nil в секцию else и избежать его записи.

(when (met? somecondition)
  (dosomething))
person Abhinav Sarkar    schedule 03.08.2010
comment
+1 за единственный ответ, в котором упоминается if-else выражение. - person missingfaktor; 03.08.2010

Опасность! Опасность, Уилл Робинсон!

http://en.wikipedia.org/wiki/Cargo_cult_programming

Улучшит ли включение пустых блоков else { } качество, удобочитаемость или надежность вашего кода? Думаю, нет.

person Dan J    schedule 03.08.2010

Глядя на это чисто с семантической точки зрения - я не могу вспомнить ни одного случая, когда не было бы неявного else для каждого if.

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

Семантика в сторону:

Ответ на этот вопрос зависит от среды и от того, каков будет результат ошибки.

Бизнес-код? Делайте то, что говорят ваши стандарты кодирования.
ИМХО, вы обнаружите, что разъяснение этого, хотя поначалу это кажется слишком трудоемким, станет бесценным через 10 лет, когда вы вернетесь к этому коду. Но это, конечно, не будет концом света, если вы пропустите важное «анти-условие».

Тем не менее: безопасность, безопасность или жизненно важный код? Это другая история.

В этом случае вам нужно сделать две вещи.
Во-первых, вместо проверки на наличие ошибки вы хотите доказать, что нет ошибки. Это требует пессимистического взгляда на вход в любой модуль. Вы предполагаете, что все неправильно, пока не докажете, что это правильно.
Во-вторых: в жизни критично: вы НИКОГДА не хотите навредить пациенту.:

bool everyThingIsSafe = true;
if(darnThereIsAProblem())
{
   reportToUserEndOfWorld();
}
return everyThingIsSafe;

Упс. Я забыл установить для EveryThingIsSafe значение false.
Подпрограмма, вызвавшая этот фрагмент, теперь обманута. Если бы я инициализировал evertThingIsSafe значением false — я всегда в безопасности, но теперь мне нужно предложение else, чтобы указать, что ошибки не было.
И да, я мог бы изменить это на положительный тест, но тогда мне нужно else для обработки ошибки.
И да, я мог бы назначить функцию everyThingIsSafe() для немедленного возврата чека. А затем проверил флаг, чтобы сообщить о проблеме. Неявное else, почему бы не быть явным?
Строго говоря, неявное else, которое это представляет, является разумным.
Для аудитора FDA/безопасности, возможно, нет.
Если оно явное, может указывать на тест, его еще, и что я четко справился с обоими условиями.

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

Найдите Терак-25. 8 тяжело ранены. 3 мертвых.

person baumann    schedule 24.01.2014

Я знаю, что опаздываю, но я много думал над этим и хотел поделиться своими результатами.

В критическом коде необходимо учитывать каждую ветвь. Писать else не обязательно, но оставить отметку, что else не нужно и почему. Это поможет рецензенту. Наблюдать:

//negatives should be fixed
if(a < 0) {
    a+=m;
}
//else value is positive
person Cem Kalyoncu    schedule 10.02.2015

Нет, не требуется писать часть else для оператора if.

На самом деле большинство разработчиков предпочитают и рекомендуют избегать блока else.

то есть

Вместо того, чтобы писать

if (number >= 18) {
    let allow_user = true;
} else {
    let allow_user = false;
}

Большинство разработчиков предпочитают:

let allow_user = false;
if (number >= 18) {
    let allow_user = true;
}
person Akshay Khale    schedule 22.08.2019

Это чисто вопрос стиля и ясности. Легко представить операторы if, особенно простые, для которых else было бы совершенно излишним. Но когда у вас есть более сложное условное выражение, возможно, обрабатывающее ряд различных случаев, часто бывает полезно явно объявить, что в противном случае ничего не следует делать. В этих случаях я бы оставил комментарий // do nothing в пустом комментарии else, чтобы было ясно, что место намеренно оставлено пустым.

person Thom Smith    schedule 03.08.2010

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

if (someCondition)
    bar();
    notbar();  //won't be run conditionally, though it looks like it might

foo();

я бы написал

 if (someCondition){
        bar();
        notbar();  //will be run
 }
 foo();
person Laramie    schedule 03.08.2010
comment
Мое правило состоит в том, что встроенные (в одной строке) операторы if не нуждаются в фигурных скобках, но если содержимое инструкции находится в другой строке, фигурные скобки необходимы. - person Thom Smith; 03.08.2010

Иногда нет никакой другой части.... и включение пустой просто делает код менее читаемым имхо.

person InsertNickHere    schedule 03.08.2010

Нет, не надо..

Кроме того, я не думаю, что это хорошая идея для удобочитаемости, поскольку у вас будет много пустых блоков else. что будет не очень приятно видеть.

person Ahmed Aman    schedule 03.08.2010