Обязательное использование брекетов - PullRequest
17 голосов
/ 16 декабря 2009

Как часть документа стандартов кода, который я написал некоторое время назад, я обязуюсь «вы всегда должны использовать фигурные скобки для циклов и / или блоков условного кода, даже (особенно), если они состоят только из одной строки».

Пример:

// this is wrong
if (foo) 
    //bar
else 
    //baz
while (stuff)
    //things

// This is right.
if (foo) {
    // bar
} else {
    // baz
}
while (things) {
    // stuff
}

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

Итак, вопрос: есть ли веские причины, по которым это будет ошибочным или иным образом неразумным стандартом? Об этом было какое-то обсуждение, но никто не может предложить мне лучший контраргумент, чем «это ужасно».

Ответы [ 21 ]

3 голосов
/ 16 декабря 2009

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

3 голосов
/ 16 декабря 2009

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

3 голосов
/ 16 декабря 2009

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

Например: предположим, я заметил, что functionB обычно вызывается сразу после functionA, с похожим шаблоном аргументов, и поэтому я хочу реорганизовать этот дублированный код в новый combined_function. Регулярное выражение может легко справиться с этим рефакторингом, если у вас нет достаточно мощного инструмента рефакторинга (^\s+functionA.*?;\n\s+functionB.*?;), но без скобок простой подход регулярного выражения может потерпеть неудачу:

if (x)
  functionA(x);
else
  functionA(y);
functionB();

станет

if (x)
  functionA(x);
else
  combined_function(y);

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

3 голосов
/ 16 декабря 2009

У многих языков есть синтаксис для таких лайнеров, как этот (я думаю о perl в частности), чтобы справиться с таким "уродством". Так что-то вроде:

if (foo)     
//bar
else     
//baz

можно записать как троичный, используя троичный оператор:

foo ? bar : baz

и

while (something is true)
{
blah 
}

можно записать как:

blah while(something is true)

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

1 голос
/ 16 декабря 2009

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

1 голос
/ 16 декабря 2009

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

Тем не менее, мне нравится однострочный возврат и продолжение, предложенное Гасом. Цель очевидна, она чище и ее легче читать.

1 голос
/ 16 декабря 2009

Вот неписаные (до сих пор, я полагаю) правила, которым я следую. Я считаю, что это обеспечивает читаемость без ущерба для правильности. Он основан на убеждении, что краткая форма во многих случаях более удобочитаема, чем полная.

  • Всегда используйте фигурные скобки, если любой блок оператора if/else if/else имеет более одной строки. Количество комментариев, что означает комментарий в любом месте условного означает, что все разделы условного получить скобки.
  • При желании используйте фигурные скобки, когда все блоки оператора находятся в одной строке.
  • Никогда не помещайте условный оператор в одну строку с условием. Строка после оператора if всегда выполняется условно.
  • Если условный оператор сам выполняет необходимое действие, форма будет:

    for (init; term; totalCount++)
    {
        // Intentionally left blank
    }
    

Нет необходимости стандартизировать это в многословной манере, когда вы можете просто сказать следующее:

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

0 голосов
/ 16 декабря 2009

Ничего себе. НЕТ ОДНОГО знает о проблеме висящей еще ? По сути, это THE причина постоянного использования скобок.

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

Эстетика и удобочитаемость не имеют к этому никакого отношения.

0 голосов
/ 16 декабря 2009

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

Я не могу предложить лучшего контраргумента. Сожалею! ;)

0 голосов
/ 16 декабря 2009

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

C ++:

Версия 1:

class InvalidOperation{};

//...
Divide(10, 0);
//...
Divide(int a, in b)
{
   if(b == 0 ) throw InvalidOperation();
   return a/b;
}

Версия 2:

class InvalidOperation{};

//...
Divide(10, 0);
//...
Divide(int a, in b)
{
   if(b == 0 )
   { 
      throw InvalidOperation();
   }
   return a/b;
}

C #:

Версия 1:

foreach(string s in myList)
   Console.WriteLine(s);

Version2:

foreach(string s in myList)
{
   Console.WriteLine(s);
}

В зависимости от вашей перспективы версия 1 или версия 2 будут более читабельными. Ответ довольно субъективный .

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