Форматирование операторов 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 ]

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

Джоэл Спольски написал хорошую статью: Создание неправильного кода выглядит неправильно

Он специально решает эту проблему & hellip;

if (i != 0)  
    foo(i);

В этом случае код является 100% правильным; это соответствует большинству соглашений кодирования и в этом нет ничего плохого, но тот факт, что одно утверждение Тело ifstatement не является заключенные в фигурные скобки могут вас беспокоить, потому что вы можете думать в затылок, чёрт возьми, кто-то может вставить другую строку кода есть

if (i != 0)
    bar(i);
    foo(i);

& hellip; и забудьте добавить фигурные скобки, и таким образом случайно сделать Foo (я) безусловная! Итак, когда вы видите блоки кода, которые не в скобках, Вы можете почувствовать себя крошечным, крошечным, суп нечистоты, который делает вам непросто.

Он предполагает, что вы & hellip;

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

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

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

if (x)
   print "x is true"
for (int i=0; i<10; i++)
   print "y is true"

И так далее. Если кому-то нужно добавить другое утверждение, он может просто добавить фигурные скобки. Даже если у вас нет R # или чего-то подобного, это очень маленькая сделка.

Тем не менее, есть некоторые случаи, когда я использовал бы фигурные скобки, даже если в утверждении есть только одна строка, и это если строка особенно длинная или если мне нужны комментарии внутри этого «если». По сути, я просто использую то, что кажется мне приятнее на глаза.

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

Я использую

if (cond) {
  ...
} else {
  ...
}
  • У всего всегда должны быть фигурные скобки. Даже если сейчас у меня есть только одна строка в блоке if, я сделал добавление позже.
  • Я не ставлю фигурные скобки на свои собственные линии, потому что это бессмысленная трата пространства.
  • Я редко помещаю блок в ту же строку, что и условие для удобства чтения.
3 голосов
/ 19 сентября 2008
if (x) {
    print "x is true";    
}
else {
    do something else;
}

Я всегда печатаю фигурные скобки. Это просто хорошая привычка. По сравнению с мышлением, набор текста не «работа».

Обратите внимание на пробел перед условным. Это помогает не выглядеть как вызов метода.

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

Пробел - твой друг ....

но опять же мне нравится:

if (foo)
{
    Console.WriteLine("Foobar");
}
3 голосов
/ 04 марта 2015

Другим способом было бы написать:

(a==b) ? printf("yup true") : printf("nop false");

Это будет полезно, если вы хотите сохранить значение, сравнивая простое условие, например:

int x = (a==b) ? printf("yup true") : printf("nop false");
3 голосов
/ 19 сентября 2008

Серьезно, когда вы в последний раз сталкивались с ошибками в любом коде где-либо по той причине, что кто-то сделал:

if (a)
  foo();
  bar();

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

* (будьте осторожны, когда foo (); bar (); это расширение макроса, но это проблема с макросами, а не с фигурными скобками с ifs.)

2 голосов
/ 19 сентября 2008
if (x)
{
    print "x is true";
}

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

2 голосов
/ 07 июня 2016

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

if(x > y)      { xIsGreaterThanY(); }
else if(y > x) { yIsGreaterThanX; }
else           { xEqualsY(); }

Это гораздо более читабельно для меня, чем:

if( x > y ){
    xIsGreaterThanY(); 
}else if( x < y){
    yIsGreaterThanX();
}else{
    xEqualsY();
}

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

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

Примерно единственное время, когда кажется, что нет ограничений, - это когда переменные проверяют параметры в начале метода:

public int IndexOf(string haystack, string needle)
{
    // check parameters.
    if (haystack == null)
        throw new ArgumentNullException("haystack");
    if (string.IsNullOrEmpty(needle))
        return -1;

    // rest of method here ...

Единственное преимущество - компактность. Программисту не нужно разбираться с ненужными {}, когда совершенно очевидно, что:

  • метод завершается на любой истинной ветви
  • Совершенно очевидно, что это все 1-строчные

Тем не менее, я всегда буду {} за логику программы по причинам, изложенным другими. Когда вы сбрасываете скобки, слишком легко мысленно взять скобку, когда ее нет, и внести незначительные дефекты кода.

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