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

StackOverflow https://stackoverflow.com/questions/11099

Вопрос

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

if (var == true)
    doSomething();

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

if (var == 1)
    doSomething(1);
else if (var > 1 && var < 10)
    doSomething(2);
else
{
    validate(var);
    doSomething(var);
}
Это было полезно?

Решение

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

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

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

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

Я рекомендую

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

if (aString) free(aString);

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

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

do_something if (a == b)

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

if (a == b)
  do_something
  do_something_else
end

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

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

Как уже отмечали другие, выполнение оператора 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, но легко понять, что происходит.

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

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

if (condition) {
    statements;
}

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

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

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

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

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

if (cond)
   {
   //statement
   }

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

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

Python удобен тем, что отступ определяет блок.На таком языке этот вопрос является спорным.

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

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

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

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

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

В Perl, если вы выполняете простой тест, иногда вы записываете его в такой форме:

do_something if condition;

do_something unless condition;

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

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

  return undef unless defined $self;

  # rest of code goes here

}

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

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

Первая — это одна строка:

if (condition) doThis();

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

if (condition) {
   doThis();
}

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

if(!ok)return;

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

if(!ok){

    do();

    that();

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