Неправильно ли использовать if-инструкцию без скобок?

Я видел такой код:

if(statement)
    do this;
else
    do this;

Мне это не нравится, я думаю, что это чище и читаемо

if(statement){
    do this;
}else{
    do this;
}

Это просто вопрос предпочтения или можно было бы порекомендовать другим способом?

Ответ 1

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

Поддержание работоспособности, всегда разумнее использовать вторую форму.

РЕДАКТИРОВАТЬ: Нед указывает на это в комментариях, но, думаю, стоит упомянуть и здесь. Это не просто гипотетическая глупость из слоновой кости: https://www.imperialviolet.org/2014/02/22/applebug.html

Ответ 2

Одной из проблем с оставлением блоков выводов является else-двусмысленность. Это языки с поддержкой C игнорируют отступ и поэтому не имеют возможности отделить это:

if(one)
    if(two)
        foo();
    else
        bar();

Из этого:

if(one)
    if(two)
        foo();
else
    bar();

Ответ 3

Моя общая модель заключается в том, что если она подходит в одной строке, я сделаю:

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();
}

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

Ответ 4

Я использую форматировщик кода используемой среды 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;
}

Ответ 5

Наличие скобок с первого момента должно помочь вам не отлаживать это:

if (statement)
     do this;
else
     do this;
     do that;

Ответ 6

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

if (someFlag) {
 someVar= 'someVal1';
} else {
 someVar= 'someVal2';
}

Выглядит гораздо приятнее:

someVar= someFlag ? 'someVal1' : 'someVal2';

Но используйте только тернарный оператор, если вы абсолютно уверены, что больше ничего не нужно делать в блоках if/else!

Ответ 8

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

if(statement)
{
    do this;
}
else
{
    do this;
}

Однако, я думаю, что лучшим решением этой проблемы является Python. С блочной структурой на основе пробелов у вас нет двух разных методов создания оператора if: у вас есть только один:

if statement:
    do this
else:
    do this

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

Ответ 9

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

Пример:

if (argument == null)
    throw new ArgumentNullException("argument");

if (argument < 0)
    return false;

В противном случае я использую второй стиль.

Ответ 10

По моему опыту единственным (очень) небольшим преимуществом первой формы является читаемость кода, вторая форма добавляет "шум".

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

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

Одним из наиболее важных правил, которые следует помнить при написании кода, является последовательность. Каждая строка кода должна быть написана одинаково, независимо от того, кто ее написал. Строгое предотвращение ошибок от "происходящих";)

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

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

Ответ 11

Следующее "правило" следующее:

Если оператор "if" тестирует, чтобы что-то сделать (функции вызова I.E., настраивать переменные и т.д.), используйте фигурные скобки.

if($test)
{
    doSomething();
}

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

Если инструкция "if" тестируется, чтобы перестать что-то делать (управление потоком I.E. в цикле или функции), используйте одну строку.

if($test) continue;
if($test) break;
if($test) return;

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

Ответ 12

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

Не работает:

если (выражение)   сделай это;   и это; еще   сделайте это;

Ответ 13

Я согласен с большинством ответов в том, что лучше быть явным в вашем коде и использовать фигурные скобки. Лично я бы принял набор стандартов кодирования и обеспечил, чтобы все в команде знали их и соответствовали. Где я работаю, мы используем стандарты кодирования, опубликованные IDesign.net для проектов .NET.

Ответ 14

Мое личное предпочтение заключается в использовании смешивания пробелов и скобок:

if( statement ) {

    // let do this

} else {

    // well that sucks

}

Я думаю, что это выглядит чистым и делает мой код очень легким для чтения и, самое главное, отлаживаем.

Ответ 15

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

Вместо:

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;

Было бы намного лучше, если бы вы вложили фигурные скобки.