Это плохая практика использовать if-оператор без фигурных скобок? [закрытый]
Я видел такой код:
if(statement)
do this;
else
do this;
мне это не нравится, я думаю, что это чище и читабельнее
if(statement){
do this;
}else{
do this;
}
это просто вопрос предпочтения или один из способов будет рекомендован по сравнению с другим?
15 ответов
проблема с первой версией заключается в том, что если вы вернетесь и добавите второй оператор в предложения if или else, не помня о добавлении фигурных скобок, ваш код сломается неожиданными и забавными способами.
ремонтопригодность-мудрый, это всегда умнее использовать вторую форму.
EDIT: Нед указывает на это в комментариях, но, думаю, здесь тоже стоит ссылаться. Это не просто кот-башня гипотетически: https://www.imperialviolet.org/2014/02/22/applebug.html
одна проблема с опущением блоков операторов-это неоднозначность else. То есть c-вдохновленные языки игнорируют отступы и поэтому не имеют возможности разделить это:
if(one)
if(two)
foo();
else
bar();
из этого:
if(one)
if(two)
foo();
else
bar();
мой общий шаблон заключается в том, что если он подходит на одну строку, я сделаю:
if(true) do_something();
Если есть предложение else, или если код, который я хочу выполнить на true
имеет значительную длину, скобки полностью:
if(true) {
do_something_and_pass_arguments_to_it(argument1, argument2, argument3);
}
if(false) {
do_something();
} else {
do_something_else();
}
в конечном счете, все сводится к субъективному вопросу стиля и читабельности. Однако общий мир программирования в значительной степени разделяется на две стороны (для языков, которые используют фигурные скобки): либо используйте их все время без исключения, либо используйте их все время за исключением. Я из последней группы.
Я использую форматер кода IDE, который я использую. Это может отличаться, но его можно настроить в настройках/параметрах.
Мне нравится этот:
if (statement)
{
// comment to denote in words the case
do this;
// keep this block simple, if more than 10-15 lines needed, I add a function for it
}
else
{
do this;
}
наличие фигурных скобок с первого момента должно помочь предотвратить необходимость отладки этого:
if (statement)
do this;
else
do this;
do that;
используйте фигурные скобки для всех операторов if, даже простых. Или перепишите простой оператор if, чтобы использовать тернарный оператор:
if (someFlag) {
someVar= 'someVal1';
} else {
someVar= 'someVal2';
}
выглядит намного лучше, как это:
someVar= someFlag ? 'someVal1' : 'someVal2';
но используйте только тернарный оператор, если вы абсолютно уверены, что больше ничего не нужно делать в блоках if/else!
Я предпочитаю использовать фигурные скобки. Добавление фигурных скобок облегчает чтение и изменение.
вот некоторые ссылки для использования фигурных скобок:
"правило", которому я следую, таково:
Если оператор " if " тестирует, чтобы что-то сделать (т. е. вызвать функции, настроить переменные и т. д.), используйте скобки.
if($test)
{
doSomething();
}
это потому, что я чувствую, что вам нужно прояснить, какие функции вызываются и куда идет поток программы, при каких условиях. Чтобы программист точно понимал, какие функции вызываются и какие переменные задаются в этом условии, важно помочь им поймите, что именно делает ваша программа.
Если оператор " if " тестирует, чтобы прекратить что-то делать (т. е. управление потоком в цикле или функции), используйте одну строку.
if($test) continue;
if($test) break;
if($test) return;
в этом случае для программиста важно быстро обнаружить, какие исключительные случаи, когда вы не хотите, чтобы код запускался, и все это покрывается в $test, а не в блоке выполнения.
Это вопрос предпочтений. Я лично использую оба стиля, если я достаточно уверен, что мне больше не нужно будет добавлять операторы, я использую первый стиль, но если это возможно, я использую второй. Поскольку вы больше не можете добавлять операторы к первому стилю, я слышал, что некоторые люди рекомендуют не использовать его. Однако второй метод требует дополнительной строки кода, и если вы (или ваш проект) используете такой стиль кодирования, первый метод очень предпочтителен для simple if заявления:
if(statement)
{
do this;
}
else
{
do this;
}
тем не менее, я думаю, что лучшее решение этой проблемы-в Python. С блочной структурой на основе пробелов у вас нет двух разных методов создания оператора if: у вас есть только один:
if statement:
do this
else:
do this
хотя у этого есть "проблема", что вы не можете использовать фигурные скобки вообще, вы получаете преимущество, что это не больше строк, что первый стиль, и он имеет возможность добавлять больше операторов.
Я всегда пытался сделать свой код стандартным и выглядеть как можно ближе к тому же. Это облегчает другим чтение, когда они отвечают за его обновление. Если вы сделаете свой первый пример и добавите к нему строку в середине, он потерпит неудачу.
не работает:
if (оператор) сделать это; и это; еще этого;
лично я использую первый стиль только для исключения или преждевременного возврата из метода. Как проверка аргументов в начале функции, потому что в этих случаях редко у меня есть больше, чем одна вещь, и никогда нет другого.
пример:
if (argument == null)
throw new ArgumentNullException("argument");
if (argument < 0)
return false;
в противном случае я использую второй стиль.
по моему опыту единственным (очень) небольшим преимуществом первой формы является читаемость кода, вторая форма добавляет "шум".
но с современными IDEs и автогенерацией кода (или автозаполнением) я настоятельно рекомендую использовать вторую форму, вы не будете тратить дополнительное время на ввод фигурных скобок, и вы избежите некоторых из наиболее частых ошибок.
есть достаточно энергоемких ошибок, люди просто не должны открывать двери для больших трат времени.
один из самых важное правило для запоминания при написании кода-согласованность. Каждая строка кода должна быть написана одинаково, независимо от того, кто это написал. Будучи строгим предотвращает ошибки от "происходит" ;)
Это то же самое с четким и явным наименованием ваших переменных, методов, файлов или с правильным отступом...
когда мои ученики принимают этот факт, они перестают бороться со своим собственным исходным кодом, и они начинают видеть кодирование как действительно интересное, стимулирующее и творческое деятельность. Они бросают вызов своему разуму, а не нервам !
Я согласен с большинством ответов в том, что лучше быть явным в ваш код и использовать брекеты. Лично я бы принял набор стандартов кодирования и гарантировал, что все в команде знают их и соответствуют. Где я работаю, мы используем стандарты кодирования, опубликованного IDesign.net для .Net проекты.
мое личное предпочтение использует смесь пробелов и скобок, как это:
if( statement ) {
// let's do this
} else {
// well that sucks
}
Я думаю, что это выглядит чистым и делает мой код очень легко читать и самое главное - отладка.
Я предпочитаю положить фигурную скобку. Но иногда помогает троичный оператор.
вместо :
int x = 0;
if (condition) {
x = 30;
} else {
x = 10;
}
нужно сделать : int x = condition ? 30 : 20;
представьте себе такой случай :
if (condition)
x = 30;
else if (condition1)
x = 10;
else if (condition2)
x = 20;
было бы намного лучше, если бы вы положили фигурную скобку.