Одно утверждение, если блок - фигурные скобки или нет? [закрыто]

59

Что лучше / более общепринятым?

Этот:

if(condition)
{
  statement;
}

Или же:

if(condition)
  statement;

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

Zannjaminderson
источник
2
Но у вас есть открывающая скобка в неправильном положении. Это наверняка.
Кристиан Манн
Во многих языках блок является оператором, следовательно, синтаксически это всегда оператор if (expresion)
Ingo
2
Поскольку вы не указали язык ... Как насчет statement if condition;?
Дейв Шерохман
@ Кристиан - хороший. Это был бы другой вопрос отдельно от этого, нет?
Zannjaminderson
@ Инго - хорошая мысль.
Zannjaminderson

Ответы:

131

Первый лучше, потому что второй подвержен ошибкам. Например, допустим, вы временно комментируете код для отладки чего-либо:

if(condition) 
//      statement;
otherStatement;

Или добавление кода в спешке:

if(condition) 
    statement;
    otherStatement;

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

if(condition) statement;

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

dsimcha
источник
35
Хорошая мысль о размещении всего на одной строке.
Нил Айткен
7
@artjomka: Если оператор длинный и должен идти в отдельной строке, я использую фигурные скобки для удобства чтения. Дело в том, что вам нужна самая короткая, наименее синтаксически зашумленная конструкция, которая была бы недвусмысленной для человека, который скорее читает ее, чем изучает.
dsimcha
15
Я предпочитаю тот, с брекетами по причинам, уже упомянутым Мне не нравится однострочная, потому что не сразу очевидно, что происходит, когда я перехожу через строку в отладчике. Я должен сделать отдельный шаг, чтобы увидеть, какое условие оценивается.
Джим
10
Пробелы @TMN бесплатны, мониторы большие, и ваш мозг учится распознавать форму, которая помогает вам анализировать код.
Мерф
5
@ Murph: пробелы свободны? Должно быть, я пропустил это. На моем экране это занимает очень много места. На самом деле, более 50%. Что в моей книге кажется большой тратой. Лично мне нравится максимизировать контент на квадратный сантиметр в коде.
Конрад Рудольф
44

Я всегда использую скобки, чтобы быть в безопасности.

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

Нил Айткен
источник
20
Люди действительно видели это? Я не думаю, что когда-либо видел это за 10 лет программирования. Может быть, я просто был слишком защищен. :)
Дэвид
9
Я хотел бы сказать нет, но, к сожалению, я видел это.
Нил Айткен
13
Вы всегда используете скобки, так что вы никогда не забудете использовать скобки - это так просто.
Мерф
12
+1 к @Murph. По той же причине я использую свои поворотники, когда никого нет рядом - и на парковках!
Дэн Рэй
7
Это хорошая практика, помогающая предотвратить ошибки при объединении между филиалами или между филиалами.
JBRWilkinson
27

Я предпочитаю версию без брекетов, где это возможно.

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

(Почти) пустые строки - пустая трата

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

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

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

Это фундаментальная проблема: если вы больше не видите весь блок на экране, его становится сложно понять.

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

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

Пропуск скобок может не навредить

Есть только один аргумент против пропуска фигурных скобок: кто-то позже добавит еще один оператор к рассматриваемому блоку и забудет добавить фигурные скобки, тем самым непреднамеренно изменив семантику кода.

Это действительно было бы большим делом.

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

Я даже считаю неправдоподобным, что это должно быть распространенной ошибкой: блоки являются фундаментальной частью программирования. Разрешение на уровне блоков и определение объема - это автоматический укоренившийся умственный процесс для программистов. Мозг просто делает это (в противном случае рассуждения о программировании были бы намного сложнее). Существует никакого дополнительные умственные усилия должны помнить , положить фигурные скобки: программист также помнит , чтобы отступы правильно вновь добавленное заявление, в конце концов; поэтому программист уже мысленно обработал, что задействован блок.

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

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


1 Эта проблема иногда решается путем помещения всего, включая скобки, в одну строку:

if (condition)
{ do_something(); }

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

Конрад Рудольф
источник
6
Пропуск скобок вредит читабельности и может легко вызвать проблемы при изменении кода.
Джош К
15
@Josh: первое утверждение смешно, как показывают языки, такие как Python (подкрепите его доказательствами, если вы думаете иначе). Второе было отменено в моем ответе. У вас есть доказательства, подтверждающие это? В противном случае ваш комментарий свидетельствует о том, что вы на самом деле не читали мой текст. Пожалуйста, сделайте это, прежде чем критиковать это.
Конрад Рудольф
8
+1 за ваши мысли, но я думаю, что ваша позиция самоубийственна. Вы говорите: «Покажите мне точные данные, собранные в результате научных экспериментов, показывающие, что это действительно проблема на практике», и все же прибегаете к анекдотическому опыту (вашему собственному), чтобы защитить свою позицию. Вы говорите: «По моему опыту ... за десятилетие моего опыта ... я считаю это неправдоподобным ...» и так далее. Можете ли вы показать достоверные данные, собранные в результате научных экспериментов, подтверждающие ваше утверждение: «Пропуск скобок не приносит вреда»? Личный опыт - это хорошо, когда поддерживаете мнение, но не просите больше «доказательств», чем вы готовы дать.
бедуир
3
@bedwyr: есть качественная разница, хотя. Во-первых, я ясно даю понять, что на самом деле меня убедят данные, и в равной степени ясно, что моя гипотеза - не подкрепленная данными. Во-вторых, я изложил (по крайней мере для меня) правдоподобный аргумент в пользу моей убежденности в том, что утверждение является ложным и почему его необходимо подтвердить. Что приводит меня к третьему: ответственность за то, чтобы доказать их требование, лежит на оппозиции, а не на том, чтобы я ее опроверг. И в дополнение к проблеме правдоподобия я показал один не связанный фактический аргумент, поддерживающий мой стиль кодирования.
Конрад Рудольф
4
@Konrad - python не показывает иначе, потому что отступы значительны и, следовательно, фигурные скобки неявны. Хорошие светлые программисты, тип которых здесь, вероятно, не будут часто делать ошибку, если вообще (через много лет я, вероятно, видел проблему только пару раз), но есть много менее хороших программисты, которые делают глупости, что является одной из причин, по которым стандарты кодирования необходимы в первую очередь. (И потому что крайние сроки и стресс могут сделать лучшее из нас менее хорошим.)
Murph
19

Я иду со вторым. Это более кратко и менее многословно.

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

Стивен Эверс
источник
11
абсолютно! в конце концов, если код было трудно писать, его тоже было бы сложно поддерживать! ;-)
Стивен А. Лоу
3
@ Steven Если вы забудете брекеты, я думаю, что здесь есть другие проблемы.
TheLQ
больше succint == менее многословно
UncleZeiv
5
@SnOrfus: несколько саркастично, так как лишние 2 символа несущественны и предотвращают очень распространенную ошибку обслуживания. Ваш пробег может меняться ;-)
Стивен А. Лоу
1
Для меня отступ дает понять, что происходит. Первая форма сжигает дополнительное место на экране и, таким образом, является негативом для меня.
Лорен Печтел
16

Я бы использовал следующее (консенсус здесь):

if (condition) {
    any_number_of_statements;
}

Также возможно:

if(condition) single_compact_statement;

Не очень хорошо, особенно в C / C ++ - подобных языках:

if(condition) 
    single_compact_statement;

(Здесь нет выбора в Python ;-)


В Perl вы бы использовали:

$C = $A**3 if $A != $B;

или же

$C = $A**3 unless $A == $B;

(Это не псевдокод ;-)

резиновые сапоги
источник
1
Мои мысли точно. Если одно выражение выглядит хорошо в одной строке после ifпредложения, я не использую фигурные скобки. Для любого другого ifоператора (или любого оператора, который использует несколько строк), я всегда использую фигурные скобки. В частности, если есть elseпредложение, в каждом случае всегда есть фигурные скобки.
Эсвальд
9
Я никогда раньше не видел, чтобы кто-то путал Perl с псевдокодом. Случайные символы да, псевдокод - нет.
Джо Д
3
Интересно, кто-нибудь сделал генератор программ на Perl, просто подключив / dev / random к интерпретатору Perl ...
Кристиан Манн,
Мне нравится подход Рубина здесь. Он предлагает однострочный <statement> if <condition>или многострочный стиль блока perl if <condition>/ <do something>/ end(ruby избегает скобок, поэтому здесь открывающая скобка подразумевается, ifа конечная скобка заменяется литералом end). Он даже не предлагает странного многострочного, но на самом деле просто однострочного оператора if.
Бен Ли
Однострочный не работает с большинством отладчиков (невозможно выполнить прерывание, когда содержимое предложения if должно быть выполнено).
Питер Мортенсен
11

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

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

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

user36294
источник
10

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

Covar
источник
3
Именно так! Это не наша вина, что он / она не знает синтаксис.
kirk.burleson
3
Плохой пример. Хороший автомобиль с неуместными педалями - газ вместо тормоза. Это твоя машина, так что ты не заботишься ни о ком другом. Проблема в том, что они не знают о вашем уникальном расположении педалей. Вы хороший автомобильный инженер в этом случае?
yegor256
Это была бы ваша вина, если бы вы дали им свою машину, зная, что они могут быть пьяными. Точно так же мы должны постараться предположить как можно меньше о будущих разработчиках, чтобы облегчить обслуживание.
Арам Кочарян
8

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

Если вам нужно добавить код в ifблок, вам не нужно запоминать / искать фигурные скобки. Когда будущие программисты читают код, фигурные скобки всегда однозначны.

С другой стороны, ReSharper автоматически добавит фигурные скобки для ленивых программистов в Visual Studio, и я предполагаю, что есть дополнения для других IDE, которые также будут это делать.

шимоник
источник
3
Я категорически не покупаю требование читабельности. Python - один из самых читаемых языков, и он не нуждается в разделителях. Это утверждение просто не соответствует действительности. Я также не покупаю претензию на ремонтопригодность, потому что она до сих пор не доказана и до сих пор неоднократно перефразировалась. Но в этом случае я на самом деле очень заинтересован в эмпирических доказательствах. Это то, что исследование может очень легко выяснить и решить раз и навсегда.
Конрад Рудольф
Поскольку Python использует отступы вместо разделителей, они являются неявными, это недопустимое сравнение.
Мерф
@Konrad - эмпирическое доказательство: когда я был новым программистом, я лично добавил код в блок без скобок if, не осознавая, что предыдущий программист не беспокоился о фигурных скобках. Я лично видел, как другие люди делают это своими глазами. Конечно, только однажды я увидел, что кому-то нужна помощь в поиске проблемы после запуска их кода, но это больше связано с плохими навыками тестирования.
Шимоник
@shimonyk: так в основном ваши наблюдения подтверждают моё утверждение, что эта проблема несущественна? Кстати, личные наблюдения - это анекдоты, они не считаются эмпирическими данными.
Конрад Рудольф
@ Конрад очень хорошо, пожалуйста, приведите также свои источники. Я предполагаю, что у вас есть рецензируемое двойное слепое исследование, на которое вы ссылаетесь? Если нет, то просто пренебрегать своими собственными анекдотами, пытаясь доказать неправоту других, требуя от других, ссылающихся на «доказательства», в лучшем случае лицемерно. Как кто-то еще в этой теме писал: «Бремя здесь состоит в том, чтобы оппозиция доказывала свои претензии, а не я опровергаю их».
Шимоник
7

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

«Не заставляй меня думать» относится не только к пользовательским интерфейсам, вы все ;-)

Стивен А. Лоу
источник
4
Раньше я делал это, но меня поразил тот аргумент, что программистам нужно знать язык и заставлять их думать.
kirk.burleson
2
Я считаю это обычной вежливостью ... к моему будущему я.
Стивен А. Лоу
5

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

На это я говорю "не используйте макросы". Я также говорю: «Сделайте отступ в свой проклятый код правильно». Учитывая, как каждый текстовый редактор / IDE, используемый для программирования, выполняет отступы автоматически, это не должно быть так сложно сделать. При написании кода в Emacs я использовал бы автоматический отступ, чтобы определить, что я написал что-то не так в предыдущей строке. Каждый раз, когда Emacs начинает портить отступы, я обычно знаю, что сделал что-то не так.

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

if (condition) {
    statement;
} // stupid extra brace looks ugly

затем

if (condition) // the brackets have now just become noise
{ statement; } // also can't see the indentation, harder to read

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

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

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

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

Если я использую эту форму, я проверяю наличие пустой строки (или строки, содержащей только фигурную скобку) до и после ifоператора (или над комментарием, если он есть). Хотя это не правило, которому я сознательно следую, теперь я замечаю это после прочтения этого вопроса.

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

Ниже приведены некоторые примеры, которые демонстрируют, как я использую эту форму ifутверждения.

    string GuardConditions(Plan planForWorldDomination)
    {
        if (planForWorldDomination == null)
            throw new ArgumentNullException("planForWorldDomination");

        if (!planForWorldDomination.IsComplete())
            return "Doh!";

        planForWorldDomination.Execute();
    }

    void ProcessingLogic()
    {
        OneBlankLineAbove();

        if (simpleCondition)
            simpleStatement();

        OneBlankLineBelow();
        OneBlankLineAbove();

        // optional comment on the line above an if statement
        if (simpleCondition)
            simpleStatement();

        OneBlankLineBelow();
    }

    void Assignment(string drive)
    {
        OneBlankLineAbove();

        string prompt;
        if (simpleCondition)
            prompt = "simple assignment";
        else
            prompt = null;

        OneBlankLineBelow();
    }

    string Return()
    {
        OneBlankLineAbove();

        if (simpleCondition)
            return "simple return";
        else
            return null;

        OneBlankLineBelow();
    }
Ученик доктора Вилли
источник
3

Брекеты. Всегда. Я отчасти их фанат, потому что это дает коду некоторую последовательность. А также, как писал @dsimcha - меньше шансов на ошибки при добавлении дополнительных строк кода.

«Уродливость» фигурных скобок вокруг одной строки кода менее вредна, чем дополнительная работа, которая вероятна в тех случаях, когда выполняется отладка и / или добавление кода.

Vedran Krivokuća
источник
1
Я никогда не видел, чтобы кто-то делал ошибку, о которой ты говоришь.
kirk.burleson
1
Я только что сделал это вчера на ком-то другом. :-) Мне просто интересно, как будет выглядеть апстрим, помимо других дополнений к коду, добавляя фигурные скобки на все свои if, потому что он, кажется, действительно с другой стороны, чем я, в этом. :-) (успокойся, я шучу, отредактировал только то, что должен был ...)
Ведран Кривокуча
2

Лично я хожу со скобками.

Почему?

Хорошо, если кто-нибудь придет и должен добавить код в оператор if, то на 100% ясно, где находится область.

Он сохраняет ifсогласованный формат операторов независимо от того, сколько операторов в блоке.

Однако, если стиль проекта - без, придерживайтесь этого.

ChrisF
источник
1

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

if (x==5) Console.WriteLine("It's a five!");
JohnFx
источник
Думаю, кто-то не фанат краткости.
JohnFx
2
Краткость ради читабельности? Точно нет. Это код, а не соревнование по гольфу.
Джош К
3
Я думаю, что удобочитаемость является отличной причиной для краткости, лично. В любом случае: пустое место не учитывается в моем кодексе правил игры в гольф.
JohnFx
Единственная проблема с этим заключается в том, что он может злоупотреблять
Конрад Фрикс
2
Тогда не злоупотребляйте этим. Я не говорю, использовать его в качестве стандарта кодирования. Просто случается так, что у вас бывает очень короткое условное выражение, за которым следует очень короткое отдельное утверждение, и это хорошо работает. Например, if (assert) log.write («сбой assert»);
JohnFx
1

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

If (cond) { statement; }
hotpaw2
источник
Интересно, я не вижу такого кода, но мне это нравится.
Томас Эдинг
0

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

object GetObject() {
    // calculate obj1
    if(obj1 != null)
        return obj1;

    // calculate obj2
    if(obj2 != null)
        return obj2;

    // calculate obj3
    if(obj3 != null)
        return obj3;

    return defaultObj;
}

Для меня было бы глупо добавлять их туда. Если кто-то добавит заявление после return, у нас будут большие проблемы, чем проблемы с ограничением объема.

Примечание к себе - придумайте имя
источник
Вы можете так же легко использоватьreturn (obj != null) ? obj : "Error";
Джош К
@ Джош, смотри правку
Заметка для себя - придумай имя
В этом случае я бы использовал что-то вроде Object returnObj = defaultObj; /* Three else-if's to change it to obj1/2/3 */ return returnObj;.
Джош К
@ Джош, Прочтите stackoverflow.com/questions/36707/… . Первый комментарий к первому ответу: «Хотя наличие нескольких точек выхода может выйти из-под контроля, я определенно думаю, что это лучше, чем помещать всю вашу функцию в блок IF ».
Обратите внимание на себя - придумайте имя
0

Если в среде IDE доступно форматирование кода, я не использую фигурные скобки.

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

nimcap
источник