Форматирование операторов if - PullRequest
8 голосов
/ 19 сентября 2008

Это не священная война, это не вопрос "что лучше".

Каковы преимущества использования следующего формата для одного оператора if блоков.

if (x) print "x is true";

if(x) 
    print "x is true";

В отличие от

if (x) { print "x is true"; }
if(x) {
    print "x is true";    
}

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

Обновление : так как самый популярный ответ игнорирует реальный вопрос (даже если он представляет самый вменяемый совет), вот сводный список профессионалов без скобок.

  1. Компактность
  2. Более читабельно для некоторых
  3. Скобки вызывают область видимости, которая в некоторых случаях имеет теоретические издержки

Ответы [ 42 ]

48 голосов
/ 19 сентября 2008

Я нахожу это:

if( true ) {
    DoSomething();
} else {
    DoSomethingElse();
}

лучше, чем это:

if( true )
    DoSomething();
else
    DoSomethingElse();

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

48 голосов
/ 19 сентября 2008

Мне очень не нравится любой стиль, который помещает тест и тело if в одну строку.

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

33 голосов
/ 19 сентября 2008

Всегда использовать фигурные скобки - это хорошая идея, но стандартный ответ, который всегда дает «что если кто-то добавит строку кода и забудет добавить фигурные скобки?» это довольно слабая причина.

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

Все начинается, достаточно невинно, с простого выражения if.

if (condition)
    do_something();
else
    do_something_else();

Что все хорошо.

Тогда кто-то приходит и добавляет еще одно условие в if. Они не могут добавить его, используя && к самому оператору if, потому что логика будет неправильной, поэтому они добавляют еще один if. Теперь у нас есть:

if (condition)
    if (condition2)
        do_something();
else
    do_something_else();

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

if (condition)
    if (condition2)
        do_something();
    else
        do_something_else();

Что означает что-то совершенно другое. Компилятор не заботится о форматировании. Остальное идет с ближайшим, если. Люди, с другой стороны, полагаются на форматирование и могут легко пропустить проблему.

21 голосов
/ 19 сентября 2008

Я всегда использую

if(x) 
{
    print "x is true";    
}

пропуск фигурных скобок может привести к тому, что кто-то по ошибке поддержит код, думая, что он добавляет к предложению if, если он добавляет строку после текущей строки.

14 голосов
/ 19 сентября 2008

Я использую

if (x)
{
    DoSomething();
}

для нескольких строк, но я предпочитаю один без брекетов:

if (x)
   DoSomething();
else
   DoSomethingElse();

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

7 голосов
/ 19 сентября 2008

Если я кодирую:

if(x) 
    print "x is true";

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

if(x) 
    print "x is true";
    print "x is still true";

, что приведет к логической ошибке, против:

if(x) { 
    print "x is true";
    print "x is still true";
}

Итак, фигурные скобки облегчают чтение и предотвращение таких логических ошибок.

7 голосов
/ 19 сентября 2008

Как и Мэтт (3 выше), я предпочитаю:

if (x)
{
    ...statement1
    ...statement2
}

и

if (x)
    ...statement
else
    ...statement

Мне кажется странным думать, что кто-то может прийти позже и НЕ понять, что ему нужно добавить фигурные скобки для формирования многострочного блока if. Если это выходит за рамки их возможностей, мне интересно, что еще есть!

7 голосов
/ 19 сентября 2008
if
{
// code
}
else 
{
// else code
}

потому что мне нравится, когда блоки кода выстраиваются (включая их фигурные скобки).

5 голосов
/ 19 сентября 2008

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

public void MyFunction(object param)
{
     if (param == null) return;

     ...
}

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

5 голосов
/ 19 сентября 2008

Один оператор, если для блоков не хватает скобок:

Плюсы:

  • меньше символов
  • чище внешний вид

Минусы:

  • единообразие: не все, если блоки выглядят одинаково
  • вероятность ошибок при добавлении операторов в блок: пользователь может забыть добавить фигурные скобки, и новый оператор не будет покрыт if.

Как в:

if(x) 
    print "x is true";
    print "something else";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...