2009-03-27 2 views
17
if (condition) { /* do something */ } 
else { /* do something */ } 

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

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

ответ

33

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

Ваша первая форма остается под вопросом, поскольку она не соблюдает формы, что большинство разработчиков 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 в фигурные скобки.

+0

На самом деле, я привык иметь брекеты на отдельных строках. – unrelativity

+0

Это 2-я лучшая практика - лучше писать в том же стиле, что и автор orignal, хотя я предполагаю, что это тоже правда :) – Brian

+4

Я не согласен с точкой № 2. Только очень страшный программист сделал бы что-то вроде добавления кода C без брекетов. – rlbond

5

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

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

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

Считываемость! Легко самоочевидно.

+0

@jerebear это больше похоже на комментарий, чем на ответ :) – eglasius

+0

Возможно, я недостаточно конкретный, я отредактирую. – jerebear

4

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

//before 
if(something) 
    statement; 

//after 
if(something) 
    statement; 
    addedstatement; 

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

+1

Я бы назвал это не пониманием языка. Обычно я не пытаюсь адаптировать свой код к людям, которые не знают язык, который я пишу. Тем не менее, если в каком-то конкретном случае он становится менее читаемым, тем, кто является экспертом, все еще может быть сложно. –

0

Это две линии длиной, поэтому на самом деле не одна строка.

Нет ничего плохого в одной строке if s, когда код проще читать.

Например, что-то вроде этого:

if (last_item) print ", and " else print ", " 

гораздо лучше, чем

if (last_iem) 
{ 
    print ", and " 
} 
else 
{ 
    print ", " 
} 
+2

Оба плохие. Лучше всего 'echo (last_item)? "и": ","; ". И попробуйте использовать эхо, между прочим. –

8

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

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

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

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

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

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

+0

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

0

Это больше стиль кодирования, чем что-либо еще. Тем не менее, мое личное мнение заключается в том, что ваш второй пример потенциально весьма вреден. Достаточно легко случайно «добавить вторую строку в блок» на языках, где фигурные скобки являются единственным способом создания блоков. Но в PHP, где альтернативный синтаксис существует, это еще менее вероятно, чтобы оттенить необходимые предупредительные колокола:

if ($_GET["asdf"]==1): 
    /* do something */ 
else: 
    /* do something */ 
endif; 

правило: если вы собираетесь положить ваши «сделать что-то» на отдельной строке , используйте фигурные скобки; если вы не собираетесь использовать фигурные скобки, поставьте их на одну строку!

1

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

  • Труднее ошибиться, если что-то пойдет.

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

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

0

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

if(){} 
else(){} 

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

if(checkSomething) 
{ 
    //dosomething 
} 
else 
{ 
    //doanotherthing 
} 
0

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

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

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

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

3

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

/* Warning: bogus C code! */ 

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

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

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

1

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

0

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

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