Являются ли однострочные операторы if или if без скобок плохой практикой? - PullRequest
18 голосов
/ 28 марта 2009
if (condition) { /* do something */ }
else { /* do something */ }

if (condition)
    /* do something */
else
    /* do something */

Мне сказали, что первый случай не был хорошей идеей. Я понятия не имею, действительно ли это так (или для второго тоже); это не сокращает количество, чтобы напечатать? Или это потому, что он просто создает беспорядок?

Ответы [ 12 ]

34 голосов
/ 28 марта 2009

Лучше всего писать код, который другие могут легко читать и обновлять.

Ваша первая форма сомнительна, потому что она не соответствует формам, к которым привыкло большинство разработчиков PHP:

if (condition) {
  // code
} else {
  // code
}

// ... or ...

if (condition)
{
  // code
}
else
{
  // code
}

// ... or ...

if (condition) { /* short code */ } else { /* short code */ }

// ... or ...

condition ? /* short code */ : /* short code */;

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

Ваша вторая форма, что более важно, не так хороша, потому что это позволяет другому программисту легко совершить эту ошибку:

if (condition)
  // code A
else
  // code B
  // code C (added by another programmer)

В этом примере другой программист добавил code C, но забыл заключить в скобки весь блок else. Это вызовет проблемы. Вы можете защититься от этого, просто обернув блоки if и else в фигурные скобки.

8 голосов
/ 28 марта 2009

Мои предпочтения, если для согласованности ... так:

if(...)
{
   statement 1;
   statement 2;
}
else
{
   statement 1;
   statement 2;
}

ничем не отличается от:

if(...)
{
   statement 1;
}
else
{
   statement 1;
}

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

Однако другие люди будут смотреть на мой код и думать, что глупо вставлять {и}. У них есть свои причины, а у меня есть свои ... Мне нравятся мои причины больше, чем их: -)

5 голосов
/ 28 марта 2009

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

На мой взгляд, да, это плохая практика - иметь одну строку в операторах.

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

читаемым! Легко распознается.

4 голосов
/ 28 марта 2009

Проблема, с которой я столкнулся, заключается в том, что разработчики не распознают {} -less-if, когда добавляют код к одному из условий. Пример:

//before
if(something)
    statement;

//after
if(something)
    statement;
    addedstatement;

Очевидно, что это не будет делать то, что они ожидают.

3 голосов
/ 28 марта 2009

Вы когда-нибудь видели такой код на C или C ++?

    /*  Warning:  bogus C code!  */

if (some condition)
        if (another condition)
                do_something(fancy);
else
        this_sucks(badluck);

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

(Давайте просто использовать python. Без скобок, только чисто чистые пробелы.: P)

1 голос
/ 28 марта 2009

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

1 голос
/ 28 марта 2009

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

  • Труднее ошибиться в том, куда что-то идет.

  • Легче читать.

  • В языках со средствами расширения макроса (например, C, C ++), отсутствие включения скобок приведет к сбивающим с толку логическим ошибкам, когда макрос, содержащий несколько операторов, раскрывается внутри несвязанного if-else.

0 голосов
/ 28 марта 2009

Вы должны поставить «если» и «сделать что-то» в отдельных строках, чтобы сделать ваш код более удобным для интерактивных отладчиков.

Если вы поместите и «если», и «сделать что-то» в одну и ту же строку, вы не сможете установить точку останова только в строке «сделать что-то».

0 голосов
/ 28 марта 2009

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

if (x == 0)
    x = 2;
else
    print("x is: %d", x); // debugging!
    x = 4;

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

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

0 голосов
/ 28 марта 2009

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

if(){}
else (){}

Я использую if () {} в той же строке, когда это короткая инструкция, и она одна. Если есть еще, используйте long:

if(checkSomething)
{
   //dosomething
}
else
{
   //doanotherthing
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...