Вы помещаете условный код с новой строки или только иногда?

Asked
Viewd618

2

Обычно я всегда пишу условный код в духе

 if (number==1) 
    name="a";
if (number==2)
    name="b";
 

как бы коротко, хотя я обнаружил, что немало людей пишут

 if (number==1) name ="a";
if (number==2) name ="b"...
 

Мне это кажется непоследовательным и на самом деле делает код более запутанным.

Как лучше всего это сделать?

16 ответов

2

Я предпочитаю:

 if (number==1) { 
    name="a";
}
if (number==2) name="b";
 

Когда я использую скобку, я начинаю новую строку.

  • Думаю, он имел в виду, что в своем примере предпочитает первый стиль второму.

    maxp22 апреля 2009, 23:01
  • Вы предпочитаете непоследовательность? Зачем второму, если он имеет другой формат, чем первый?

    Graeme Perrow22 апреля 2009, 21:47
1

Я использую только первый вариант. Легче читать и легче устанавливать точки останова в условном выражении.

2

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

 if number == 1:
    name = "a"
elif number == 2:
    name = "b"
else:
    raise ValueError()
 
  • На самом деле это неправда, это считается хорошим стилем, но вы также можете поместить его в ту же строку.

    André23 апреля 2009, 08:23
  • Я знаю, отсюда и «в значительной степени». Единственный раз, когда я помещаю это в одну строку, когда я пытаюсь выиграть соревнование, чтобы узнать, кто может выполнить конкретную задачу за наименьшее количество байтов.

    Adam23 апреля 2009, 22:04
  • ++ об общих принципах :-) На самом деле есть еще одна проблема. С возрастом вы заметите, что не можете работать с дисплеями с очень высоким разрешением, поэтому предпочитаете не тратить впустую пиксели и не выталкивать код из нижней части экрана. Форматирование важно, но меньшее количество кода для чтения - это не то же самое, что читабельность.

    Mike Dunlavey24 апреля 2009, 11:58
8

Я предпочитаю ваш первый вариант, но еще лучше:

 if (number == 1) { 
    name = "a";
}
if (number == 2) {
    name = "b";
}
 

немного дольше при простом просмотре, но мне не придется добавлять скобки, когда if становится больше одной строки (я думаю, очень часто)

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

    Thomas Owens22 апреля 2009, 21:38
1

Я делаю то же самое (в java) и всегда добавляю фигурные скобки, даже если это всего одна строка, это вообще не работает и устраняет один классический источник ошибок.

0

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

0

Хорошо, мне нужно несколько голосов против. Это действительно некрасиво, но я думаю, что на то есть веская причина:

  if (false){}
else if (variable == aValue){
  ... code ...
}
else if (variable == anotherValue){
  ... code ...
}
... more cases ...
else {
  ... code ...
}
 

Причина в том, что ни одна ветка (кроме else) не отличается от любой другой, поэтому их легко переупорядочить или вставить новую в начале.

Фактически, если я генерирую этот код из другой программы, это действительно упрощает генератор.

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

    Adam23 апреля 2009, 22:06
  • @ Адам: Думаю, я думаю, что запах в носу у нюхачей. Я написал код на ассемблере для многих машин, а также на Фортране, Лиспе, Коболе. Ни один из них не принесет очков Саймону Коулзу. Я думаю, что форма следует за функцией.

    Mike Dunlavey23 апреля 2009, 22:59
2

Я использую следующий стиль.

 if (number == 1) 
{
   name = "a";
}
else if (number == 2)
{
   name = "b";
}
 

Это позволяет избежать ошибок, если вы вставляете новую строку.

 if (number == 1) 
   DoSomething();
   name = "a";
 

Теперь name = "a"; больше не является условным. Сейчас я думаю о переходе на следующий стиль.

 if (number == 1) {
   name = "a";
}
 

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

1

Помещая условные выражения в одну строку, я использую однострочный формат:

 toggled = (on == true ) ? true : false;
 

Однако это не работает, когда у вас есть несколько случаев, когда я могу использовать оператор switch:

 switch ( number ) {
  case 1: a;
   break;

  case 2: b;
   break;
    a;
}
 

Для вашего конкретного примера я бы сделал следующее:

 if ( number == 1 ) {
  name = "a";
} else if ( number == 2 ) {
  name = "b";
}
 

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

1

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

0

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

 if (myVar == 0)
{
    return false;
}
 
2

Лично мне нравится размещать условные выражения в одной строке, ЕСЛИ и ТОЛЬКО ЕСЛИ, есть их набор, которые я хочу легко сравнить.

 if      (iTerm >= Ps.missed_runs)   iTerm -= Ps.missed_runs;
else if (iTerm <= Ps.missed_runs)   iTerm += Ps.missed_runs;
else                                iTerm  = 0;
 

Здесь я четко вижу, что одинаково, а что отличается. Сравните с этим:

 if (iTerm >= Ps.missed_runs) {
    iTerm -= Ps.missed_runs;
} else if (iTerm >= Ps.missed_runs) {
    iTerm += Ps.missed_runs;
} else {
    iTerm  = 0;
}
 

Теперь сравнения удалены друг от друга и не выровнены по столбцу. Глазу труднее обнаружить ошибку.

P.S. вы заметили преднамеренную ошибку во втором примере кода?

Хьюго

  • если вы начинаете новую строку после каждого символа "}", то это будет компромисс между ними. Я считаю, что все версии rstudio делают это по умолчанию.

    maxp22 апреля 2009, 23:04
2

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

если (число == 1)
    name = "а";
если (число == 2)
    name = "б";

... У меня будет сильное искушение сделать это:

если (число == 1)
    print "Hit the first conditional \ n";
    name = "а";
если (число == 2)
    print "Нет, ударил второе условное \ n";
    name = "б";

... и начинается веселье во время выполнения.

Иногда я помещаю однострочную команду в одну строку с оператором «if», если это что-то очевидное и простое, например «if (inputVar == null) return;». Но, как правило, если я делаю отступ для отдельных команд (в отличие от одной большой команды, охватывающей несколько строк) *, я всегда хочу, чтобы они были заключены в фигурные скобки. Так у меня будет меньше проблем.

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

7

Я всегда пишу свои условные выражения одинаково:

 if (number == 1)
{
    name = "a";
}
else if (number == 2)
{
    name = "b";
}
 

Его легко читать, и он согласован. В соответствии с операторами if, которые содержат более одного оператора, и т. Д.

Изменить

Чтобы расширить это, я стараюсь следовать этому правилу:

Каждая строка выполняет одно действие.

То есть каждая строка должна выполнять один оператор (и область видимости должна быть хорошо видна). Поэтому я не предпочитаю:

 if (number==1) name ="a";
 

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

 if (number==1)
    name ="a";
 

Но проблема состоит в том, что это несовместимо с мульти-выражением if. Вот почему (как утверждали другие) хорошо заключать вещи в скобки:

 if (number==1)
{
    name ="a";
}
 

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

Я не думаю, что «это сохраняет вертикальные пробелы» - это достаточно веская причина для отказа от удобочитаемости и хорошего форматирования (оба {} в одном столбце == сексуально). Это связано с тем, что, учитывая разрешение современных мониторов, вам не нужно прилагать усилий для просмотра кода.

1

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

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

17

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

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

  • Я не согласен. одна строка, если операторы if не нуждаются в фигурных скобках, потому что это одно выражение. Очень легко увидеть, нужны ли фигурные скобки при добавлении операторов.

    Armstrongest22 апреля 2009, 23:28
  • Я согласен и ценю то, что вы: а) не проявляете религиозности в этом отношении и б) не оставляете «реальный мир» преподавать такие практические вещи, потому что часто, когда студенты попадают в реальный мир, они думают, что их работа продвигать новейшие вещи, которые они узнали в школе.

    Mike Dunlavey24 апреля 2009, 13:58
  • Я использую немного обоих стилей, но если я использую двухстрочный стиль, я ВСЕГДА использую {} открывающую и закрывающую фигурные скобки.

    Иногда структура if может находиться в одной строке. Я делаю это, например, с помощью манипуляций со свойствами.

    Chris K22 апреля 2009, 22:16
  • @Mike: Спасибо! Я также рад, что вы смогли прочитать эту ветку, с тех пор как SO начал реорганизовывать комментарии, многие ветки комментариев запутались :)

    Uri24 апреля 2009, 14:19
  • Мой опыт обучения языку C показывает, что многие ошибки были вызваны тем, что студенты не добавляли фигурные скобки, а затем страдали от последствий неосторожного добавления и удаления. Вы будете удивлены, узнав, как ученики все портят. Судя по тому, что я видел, они делают это и в старших классах, так что вполне могут делать это в реальном мире.

    Uri23 апреля 2009, 01:29