Каков предпочтительный стиль для отдельных решений и действий?

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

if (var == true)
    doSomething();

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

if (var == 1)
    doSomething(1);
else if (var > 1 && var < 10)
    doSomething(2);
else
{
    validate(var);
    doSomething(var);
}
14.08.2008 14:23:11
20 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

10
14.08.2008 14:27:26

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

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

2
14.08.2008 14:25:17

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

Я думаю, это хорошо, что мой монитор кода в портретной ориентации имеет разрешение 1200х1600.

0
14.08.2008 14:27:03

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

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).

4
14.08.2008 14:30:45

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

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

if (aString) free(aString);
1
14.08.2008 14:28:36

Я рекомендую

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

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

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

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

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

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

10
14.08.2008 14:31:55
Вы должны ВСЕГДА работать с фигурными скобками в if / else. Всегда всегда всегда.
indra 1.12.2010 15:11:32

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

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

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

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

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

8
12.03.2009 17:44:40

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

1
14.08.2008 14:32:48

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

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

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

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

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

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

2
14.08.2008 14:32:51

Я склонен согласиться с Джоэлем Спольски в том, что касается этой статьи (« Создание неправильного кода выглядит неправильно» ) со следующим примером кода:

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

Фу теперь безоговорочно. Что очень плохо!

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

0
14.08.2008 14:46:01

я предпочитаю

if (cond)
   {
   //statement
   }

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

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

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

0
14.08.2008 14:42:47

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

if(!ok)return;

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

if(!ok){

    do();

    that();

    thing();
}
0
17.11.2011 15:07:16
Я не уверен, хотя я не сомневаюсь, что на StackOverflow есть аппаратчики.
t3rse 13.03.2009 17:09:16

Руби прекрасно устраняет одну проблему в обсуждении. Стандарт для однострочника:

do_something if (a == b)

и для многострочного:

if (a == b)
  do_something
  do_something_else
end

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

Это (пока) недоступно ни на Java, ни на многих других языках AFAIK.

1
14.08.2008 16:29:24

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

if (a == b)
    DoSomething();
    DoSomethingElse(); <-- outside if statement

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

if (a == b) DoSomething();

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

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

var c = (a == b) ? DoSomething() : DoSomethingElse();

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

var c = (a == b)
    ? AReallyReallyLongFunctionName()
    : AnotherReallyReallyLongFunctionOrStatement();

Все еще более кратко, чем блок if / else, но легко увидеть, что происходит.

1
14.08.2008 19:14:11

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

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

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

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

3
14.08.2008 19:19:40
Я сделал эту ошибку, и я нашел и исправил ее, когда кто-то другой сделал эту ошибку. Были ли мы компетентны, открыто для обсуждения.
Jay Bazuzi 20.09.2008 17:02:02

Я лично поддерживаю объяснение Макконнелла из 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
2.09.2008 12:50:15

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

0
16.09.2008 21:50:42

Солнца Условные обозначения кода для программирования Java Язык имеет это сказать:

Класс операторов if-else должен иметь следующую форму:

if (condition) {
    statements;
}

if (condition) {
    statements;
} else {
    statements;
}

if (condition) {
    statements;
} else if (condition) {
    statements;
} else {
    statements;
}
1
16.09.2008 22:42:24

В Perl, если вы делаете простой тест, вы когда-нибудь напишите его в следующем виде:

do_something if condition;

do_something unless condition;

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

sub test{
  my($self,@args) = @_;

  return undef unless defined $self;

  # rest of code goes here

}
0
17.09.2008 18:02:54

Золотое правило заключается в том, что при работе в существующем проекте следуйте этим стандартам кодирования.

Когда я дома, у меня есть две формы.

Первая строка:

if (condition) doThis();

а второй для нескольких строк:

if (condition) {
   doThis();
}
0
17.11.2011 15:06:41