Каков предпочтительный стиль для отдельных решений и действий? - PullRequest
3 голосов
/ 14 августа 2008

В случае языков, которые поддерживают одно решение и действие без скобок, например, в следующем примере:

if (var == true)
    doSomething();

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

if (var == 1)
    doSomething(1);
else if (var > 1 && var < 10)
    doSomething(2);
else
{
    validate(var);
    doSomething(var);
}

Ответы [ 20 ]

10 голосов
/ 14 августа 2008

Я рекомендую

if(a==b)
{
    doSomething();
}

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

if(a==b)
    doSomething();
    doSomethingElse();

очень отличается от

if(a==b)
{
    doSomething();
    doSomethingElse();
}

см. статью Джоэла для получения более подробной информации

10 голосов
/ 14 августа 2008

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

if ( a == b)    {
    doSomething();
}
else {
    doSomething();
}

но это священная война.

8 голосов
/ 14 августа 2008

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

if(something)
 DoOneThing();
else
  DoItDifferently();

, а затем решите добавить еще одну операцию в предложение else и забудьте обернуть ее в фигурные скобки:

if(something)
 DoOneThing();
else
  DoItDifferently();
  AlwaysGetsCalled(); 

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

4 голосов
/ 14 августа 2008

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

if (cond1)
{
   SomeOperation();
   Another();
}
elseif (cond2)
{
   DoSomething();
}
else
{
   DoNothing();
   DoAnother();
}

Но если у вас есть только одна связка:

if (cond1)
    DoFirst();
elseif (cond2)
    DoSecond();
else
    DoElse();

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

Это также относится к конструкциям циклов и т.п.:

foreach (var s as Something)
    if (s == someCondition)
        yield return SomeMethod(s);

Вам также следует учесть, что это соглашение может больше подходить для .NET (обратите внимание, что Java peepz предпочитает иметь свою первую фигурную скобку в той же строке, что и if).

3 голосов
/ 14 августа 2008

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

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

Итак, честный вопрос - я действительно хотел бы получить реальные ответы, а не просто отрицательные голоса: это действительно когда-либо происходит?

(Правка. Я слышал достаточно ужасных историй об аутсорсинге, чтобы уточнить: действительно ли это когда-нибудь случается с компетентными программистами ?)

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

Я лично согласен с объяснением Макконнелла из Code Complete.

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

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

Начните писать такие вещи, как:


If A == true
   FunctA();

If B == "Test"
{
   FunctB();
}

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

В основном найдите тот, который вам удобно писать каждый раз, и придерживайтесь его. Я верю, что использование разделителей блоков ('{', '}') - это как можно больше возможностей.

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


If A == false {
  //calls and whatnot
}
//or
If B == "BlaBla"
{
  //calls and whatnot
}
//or
If C == B
  {
  //calls and whatnot
  }

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

2 голосов
/ 14 августа 2008

Я бы настоятельно рекомендовал всегда , используя фигурные скобки, даже если они не обязательны. Зачем? Возьмите этот кусок кода C ++:

if (var == 1)
  doSomething();
doSomethingElse();

Теперь приходит кто-то, кто действительно не уделяет достаточного внимания и решает, что должно произойти что-то дополнительное, если (var == 1), поэтому он делает это:

if (var == 1)
  doSomething();
  doSomethingExtra();
doSomethingElse();

Это все еще красиво с отступом, но оно не будет делать то, что предполагалось.

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

2 голосов
/ 14 августа 2008

Это на самом деле не имеет значения, если вы согласны с этим.

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

1 голос
/ 14 августа 2008

Нет правильного или неправильного способа написания вышеприведенного утверждения. Существует множество принятых кодировок стилей . Однако, для меня, я предпочитаю сохранять стиль кодирования в течение всего проекта. то есть. Если в проекте используется стиль K & R, вы должны использовать K & R.

1 голос
/ 14 августа 2008

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

В этом случае я уверен, что ясно, что это одно утверждение, сохраняя все в одной строке, например:

if (aString) free(aString);
...