Шрифт
Зачем нужно всегда ставить фигурные скобки: ?
Play

Зачем нужно всегда ставить фигурные скобки: < и >?

Я не понимаю, зачем все говорят, что нужно всегда использовать < и >. Вот, например, код:

Зачем тут писать скобки? Многие говорят, что для читаемости, но любой программист знает о таком написании, зачем же увеличить код?

Также лично я не понимаю зачем открытие скобки писать на новой строке, чтобы занять ещё одну лишнюю строку?

На мой взгляд это неправильно, возможно вы меня сможете в этом переубедить?

Лично мне намного быстрее и удобнее разобрать вот такой код:

12 ответов 12

Практика всегда ставить скобки избавляет вас от досадных глупых ошибок.

Страшилка 1. Жил-был метод с guard condition:

В один прекрасный день вы собираетесь домой, вас просят быстренько добавить логгирование туда. Ткнули по кнопкам (может быть даже по хоткею для live template), закоммитили:

И ушли. А кто-то потом тратит пару часов, чтобы найти эту невзрачную ошибку.

Страшилка 2. Жил был код:

Однажды джуниора попросили временно убрать обработку Очень Редкого Случая. Он смело закомментировал соответствующую строку и ушел играть в кикер с коллегами.

А потом вдруг Что-то Очень Важное перестало работать кроме редких случаев.

PS. Все совпадения не случайны, а действующие лица не выдуманы.

Ответ на самом деле зависит от языка.

Некоторые языки (javascript, I'm looking at you) практически требуют специальной расстановки скобок, в их отсутствие код может распарситься неочевидным образом.

В остальных языках-с-фигурными-скобками (C/C++/Java/C#/. ) расстановка скобок — личное дело каждого, вопрос вкуса. Я лично стараюсь опустить скобки где только возможно, например, в коде

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

Мой совет — пишите код так, чтобы форматирование подчёркивало вашу мысль. Например, симметрию внутренних структур кода. Это самое главное. Наличие или отсутствие скобок не сделают вас плохим программистом, отсутствие стиля вполне может.

Важный отдельный случай — это наличие общего стиля команды. Если во всей команде принято ставить (или не ставить) дополнительные скобки, вам придётся придерживаться общего стиля.

Лично я не понимаю зачем открытие скобки писать на новой строке, что бы занять ещё одну лишнюю строку?

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

Лично я в таких случаях обычно не ставлю. Могу поставить, если дальше идёт блок else со скобками, да и то не всегда. Почти всегда ставлю в js (и джаве) - там, где принято ставить открывающую на той же строке.

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

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

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

Как же пытаются решить эту проблему? Говорят, всегда ставим скобки. В таком случае получается такой код:

Да, здесь уже значительно сложнее ошибиться и как-то не так поступить с этим блоком. Но написан ли этот код красиво? На мой взгляд, нет. Это по прежнему мешанина вызовов методов и проверки условия. Причём, блок кода мы выделили, но таким образом мы ещё и отдалили вызываемый метод от условия.

А вот как бы я отформатировал этот же код:

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

зачем все говорят что нужно всегда использовать

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

Сейчас почти для всех языков IDE имеют автоформатирование. Для чего? Для того ли, чтобы было быстрее писать код? Или всё-таки для того, чтобы более или менее читаемый код мог писать кто угодно? Почему чем язык распространённее (и, в некоторой мере, проще), тем строже правила автоформатирования? Посмотрим на дефаултные настройки в Visual Studio. Для C++ (если я не ошибаюсь) нет автоматического добавления пробелов вокруг бинарных операторов. В C# есть. В VB.NET принудительное жёсткое форматирование отступов при уходе со строки. Случайность ли это? Вот мне кажется, что вряд ли.

Почему предлагается всегда ставить пробелы у бинарных операторов? Какой вариант читаемее y = a*x*x + b*x + c; или y = a * x * x + b * x + c; ? На мой взгляд первый. Тогда зачем? Да чтобы защититься от такого: y=a*x*x+b*x+c; .

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

Ну и ещё примерчик. Что лучше?

но мне бы как-то не хотелось увидеть

потому что тут сложно зацепиться глазами за блоки.

Кстати, как вариант, тут может быть

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

Кстати, с этим вариантом могут быть проблемы с автоформатированием в IDE. Потому что я бы однозначно не хотел увидеть

такой вариант вообще нечитаемый.

Так же лично я не понимаю зачем открытие скобки писать на новой строке

Скобки на новой строке удобны тем, что видно, к какому блоку они относятся.

Следующий код читаем. Он читаем даже если скобки по какой-то причине съедут.

А как насчёт варианта со скобкой на той же строке? А если по какой-то причине скобка окажется не там где надо?

Раньше в VS были проблемы с автоформатирование отступов в Си++, если нет скобок. Кстати, это ещё одна возможная причина, почему скобки надо ставить.

В языках, где скобки расставляются подобным образом (открывающая на той же строке), я всегда ставлю скобки. И скобки, и отступы, если непонятно.

Например, вот что станет с кодом выше, если в коде в табами (у просматривающего в 2 пробела) добавили 2 строки (и скобки) с отступами в 4 пробела:

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

И ни одной хорошей мысли при взгляде на это чудо.

чтобы занять ещё одну лишнюю строку?

Занятые строки должны быть далеко не на первом месте. Так можно и весь код в одну строку написать. Но вот нужно ли?

Куда важнее общая читаемость кода. Надо для этого занять лишнюю строку, да хоть 5 - пусть будут. Есть 20 однотипных вызовов 4 методов? Отформатировать столбиками (получится 20 строк) и пофиг, что строки длинные и в них несколько операторов. Кстати, вариант с форматирование столбиками - это практически единственный случай, где я допускаю наличие нескольких операторов в строке.

Лично мне намного быстрее и удобнее разобрать вот такой код:

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

Во-вторых, здесь нельзя поставить breakpoint на вызов метода. Так что отладке может помешать.

Сам использую запись в одну строку только иногда в VB, где есть синтаксис однострочного if.

А вот такой стиль я виду впервые. Видел такое:

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

📎📎📎📎📎📎📎📎📎📎