В случае языков, которые поддерживают одно решение и действие без скобок, например, в следующем примере:
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();
}
но это священная война
Это не имеет значения, если вы согласны с этим.
Кажется, что существует тенденция требовать одинаковости внутри одного оператора, то есть, если в одной ветке есть скобки, везде есть скобки. Стандарты кодирования ядра Linux, например, обязывают это.
Наш начальник заставляет нас ставить {} после заявления о решении, несмотря ни на что, даже если это одно утверждение. Это действительно раздражает, чтобы добавить две дополнительные строки. Единственное исключение - троичные операторы.
Я думаю, это хорошо, что мой монитор кода в портретной ориентации имеет разрешение 1200х1600.
Я предпочитаю быть последовательным, например, если вы используете скобки в одном блоке, используйте скобки повсюду, даже с одним утверждением:
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).
Я всегда использовал скобки всегда, за исключением случая, когда я проверяю переменную на NULL перед ее освобождением, как это необходимо в C
В этом случае я уверен, что ясно, что это одно утверждение, сохраняя все в одной строке, например так:
if (aString) free(aString);
Я рекомендую
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 часа ночи и задаетесь вопросом, почему ваш код ведет себя так странно, что-то подобное может ускользнуть от вас на некоторое время. Только по этой причине я всегда использую брекеты.
Не существует правильного или неправильного способа написания вышеуказанного утверждения. Существует множество принятых стилей кодирования . Тем не менее, для меня, я предпочитаю придерживаться стиля кодирования на протяжении всего проекта. то есть. Если в проекте используется стиль K & R, вы должны использовать K & R.
Я настоятельно рекомендую всегда использовать фигурные скобки, даже если они не обязательны. Почему? Возьмите этот кусок кода C ++:
if (var == 1)
doSomething();
doSomethingElse();
Теперь приходит кто-то, кто действительно не уделяет достаточного внимания и решает, что должно произойти что-то дополнительное, если (var == 1), поэтому он делает это:
if (var == 1)
doSomething();
doSomethingExtra();
doSomethingElse();
Это все еще красиво с отступом, но это не будет делать то, что предполагалось.
Всегда используя скобки, вы с большей вероятностью избежите такого рода ошибок.
Я склонен согласиться с Джоэлем Спольски в том, что касается этой статьи (« Создание неправильного кода выглядит неправильно» ) со следующим примером кода:
if (i != 0)
bar(i);
foo(i);
Фу теперь безоговорочно. Что очень плохо!
Я всегда использую скобки для принятия решений. Это помогает сопровождать код и делает его менее подверженным ошибкам.
я предпочитаю
if (cond)
{
//statement
}
даже с одним утверждением. Если вы собирались написать что-то один раз, не сомневались в том, что это сработало, и никогда не планировали, что другой кодер когда-либо будет смотреть на этот код, продолжайте и используйте любой формат, какой захотите. Но что на самом деле стоит дополнительный брекетинг? Меньше времени в течение года, чем требуется, чтобы напечатать этот пост.
Да, мне нравится делать отступы в скобках и на уровне блока.
Python хорош тем, что отступ определяет блок. Вопрос спорный в таком языке.
Я привык следовать линии «всегда использовать фигурные скобки», как аппаратчик. Однако я изменил свой стиль, чтобы исключить их в условных выражениях в одну строку:
if(!ok)return;
Для любого сценария с несколькими состояниями, я все еще придерживаюсь мнения, что скобки должны быть обязательными:
if(!ok){
do();
that();
thing();
}
Руби прекрасно устраняет одну проблему в обсуждении. Стандарт для однострочника:
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, но легко увидеть, что происходит.
Признайте это отсутствием опыта, но во время моей семилетней работы в качестве обезьяны кода я никогда не видел, чтобы кто-то делал ошибку, не добавляя фигурные скобки при добавлении кода в блок, который не имеет фигурных скобок. Это точно ноль раз.
И до того, как мудрецы добрались до этого, нет, причина не в том, что «все всегда используют брекеты».
Итак, честный вопрос - я действительно хотел бы получить реальные ответы, а не просто отрицательные отзывы: это когда-либо действительно случалось?
(Редактировать: я слышал достаточно ужасных историй на аутсорсинге, чтобы уточнить: действительно ли это когда-нибудь случалось с компетентными программистами ?)
Я лично поддерживаю объяснение Макконнелла из 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
}
Пожалуйста, не отвечайте на это, так как это будет новый вопрос. Если я увижу интерес к этому, я открою новый вопрос на ваш вклад.
Я использую фигурные скобки вокруг каждого утверждения, если и только если этого требует хотя бы один из них.
Солнца Условные обозначения кода для программирования Java Язык имеет это сказать:
Класс операторов if-else должен иметь следующую форму:
if (condition) { statements; } if (condition) { statements; } else { statements; } if (condition) { statements; } else if (condition) { statements; } else { statements; }
В 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();
}