Вопрос

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

Каковы плюсы использования следующего формата для блоков single statement 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. Скобки вызывают область видимости, которая в некоторых случаях имеет теоретические накладные расходы
Это было полезно?

Решение

Я нахожу это:

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

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

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

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

Другие советы

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

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

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

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

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

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

И это все прекрасно.

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

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

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

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

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

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

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

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

Я использую

if (x)
{
    DoSomething();
}

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

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

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

if
{
// code
}
else 
{
// else code
}

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

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

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";
}

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

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

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

и

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

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

Одиночный оператор if в блоках без фигурных скобок:

Плюсы:

  • меньше символов
  • более чистый вид

Минусы:

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

Как в:

if(x) 
    print "x is true";
    print "something else";

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

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

     ...
}

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

Я использую

if (cond) {
  ...
} else {
  ...
}
  • На всем всегда должны быть фигурные скобки.Даже если сейчас у меня есть только одна строка в блоке if, я добавлю еще позже.
  • Я не ставлю фигурные скобки на их собственные строки, потому что это бессмысленная трата места.
  • Я редко помещаю блок в ту же строку, что и условное обозначение, для удобства чтения.

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

Он специально рассматривает этот вопрос…

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

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

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

... и забудьте добавить фигурные скобки, и таким образом, случайно сделайте foo(i)безусловным!Поэтому, когда вы видите блоки кода, которые не заключены в фигурные скобки, вы можете почувствовать лишь крошечный, крошечный привкус нечистоты, который делает тебе не по себе.

Он предполагает, что вы…

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

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

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

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

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

Пробел - ваш друг ....

но, с другой стороны, мне нравится:

if (foo)
{
    Console.WriteLine("Foobar");
}

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

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

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

*(оговорка заключается в том, что когда foo();бар ();было расширение макроса, но это проблема с макросами, а не с фигурными скобками без ifs.)

if (x) {
    print "x is true";    
}
else {
    do something else;
}

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

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

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

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

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

int x = (a==b) ? printf("yup true") : printf("nop false");
if (x)
{
    print "x is true";
}

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

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

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-лайнеры

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

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

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

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

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

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

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

пока это согласовано в команде, в которой вы работаете, это не имеет особого значения

главное, чтобы все делали одно и то же - это

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

Если вы сделаете что-то подобное этому:

if(x)
{
    somecode;
}
else
{
    morecode;
}

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

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

Если это одна строка if (и необязательно одна строка else) Я предпочитаю не использовать скобки.Это более читабельно и лаконично.Я говорю, что предпочитаю это, потому что это чисто вопрос предпочтений.Хотя я думаю, что пытаться навязать стандарт, согласно которому вы всегда должны использовать фигурные скобки, довольно глупо.

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

/* I type one liners with brackets like this */
if(0){return(0);}
/* If else blocks like this */
if(0){
    return(0);
}else{
    return(-1);
}

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

Мне не нравится закрывать фигурные скобки в одной строке с ключевым словом follow:

if (x) {
    print "x is true";    
} else {
    do something else;
}

Это затрудняет удаление / закомментирование только предложения else.Поместив ключевое слово follow в следующую строку, я могу воспользоваться преимуществами, например, редакторов, которые позволяют мне выбирать диапазон строк и комментировать / раскомментировать их все сразу.

if (x) {
    print "x is true";    
}
//else {
//    do something else;
//}

Я всегда предпочитаю это:

if (x) doSomething();

if (x) {
    doSomthing();
    doOtherthing();
}

Но всегда зависите от языка и действий, которые вы выполняете.Иногда мне нравится ставить брекеты, а иногда нет.Зависит от кода, но я кодирую так, будто мне приходится писать один раз, переписывать десять раз и читать сто раз;итак, просто делайте это так, как вы хотите, и так, как вы хотите быстрее прочитать и понять

Несмотря ни на что, я иду именно этим путем!Это выглядит лучше всего.

If(x)
{
    print "Hello World !!"
}
Else
{
    print "Good bye!!"
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top