Почему считается плохой практикой опускать фигурные скобки?

Почему все говорят, что писать код так, как будто это плохая практика?

if (foo)
    Bar();

//or

for(int i = 0 i < count; i++)
    Bar(i);

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

using (Brush br = new SolidBrush(Color.FromArgb(15, GlowColor)))
{
    for (int x = 0; x <= GlowAmount; x++)
    {
        for (int y = 0; y <= GlowAmount; y++)
        {
            g.DrawString(Text, this.Font, br, new Point(IconOffset + x, y));
        }
     }
 }
 //versus
using (Brush br = new SolidBrush(Color.FromArgb(15, GlowColor)))
    for (int x = 0; x <= GlowAmount; x++)
        for (int y = 0; y <= GlowAmount; y++)
            g.DrawString(Text, this.Font, br, new Point(IconOffset + x, y));

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

using (Graphics g = Graphics.FromImage(bmp))
{
    using (Brush brush = new SolidBrush(backgroundColor))
    {
        using (Pen pen = new Pen(Color.FromArgb(penColor)))
        {
            //do lots of work
        }
    }
 }
//versus
using (Graphics g = Graphics.FromImage(bmp))
using (Brush brush = new SolidBrush(backgroundColor))
using (Pen pen = new Pen(Color.FromArgb(penColor)))
{
    //do lots of work
}

Самый распространенный аргумент в пользу фигурных скобок вращается вокруг программирования обслуживания и проблем, которые могут возникнуть при вставке кода между исходным оператором if и его предполагаемым результатом:

if (foo)
    Bar();
    Biz();

Вопросов:

  1. Разве неправильно использовать более компактный синтаксис, предлагаемый языком? Люди, которые разрабатывают эти языки, умны, я не могу представить, чтобы они добавили функцию, которую всегда плохо использовать.
  2. Должны мы или не должны писать код так, чтобы наименьший общий знаменатель мог его понять и не иметь проблем с ним?
  3. Есть ли еще один аргумент, который мне не хватает?

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

Robert S. 11.12.2008 18:52

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

Bob 11.12.2008 18:54

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

George Stocker 11.12.2008 19:42

Они не являются «ответом». Я ищу другие ответы, потому что считаю, что наиболее распространенный вариант неверен. Например, Торлак привел пример C++ о макросах.

Bob 11.12.2008 19:51

Я с тобой согласен. Опустите их. Период.

Andrei Rînea 17.12.2008 04:53

... или используйте VB.NET и тоже забудьте об этом ;-P

Piotr Owsiak 19.08.2009 04:20

КТО ЗАБОТИТСЯ СКОЛЬКО ЛИНИЙ В 2010 ГОДУ. Мониторы широкие, дешевые и с высоким разрешением! Мой монитор 2048 X 1152, и у меня их ДВА! Читаемость намного важнее, чем сохранение двух вертикальных линий, когда вы можете легко внести небольшие ошибки, которые трудно найти.

user177800 24.01.2010 05:20

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

call me Steve 28.01.2010 05:17

Мониторы широкие и дешевые, но они не высокий и дешевые. Вертикального пространства меньше, чем горизонтального.

Adam Says - Reinstate Monica 09.07.2012 02:23

@AdamRuth Поверни их боком :)

Zachary Yates 08.09.2013 06:12

Так что вы не облажаетесь, как Apple, с ошибкой SSL, обнаруженной в феврале 2014 года, LOL.

learnvst 24.02.2014 14:35

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

Andrew Theken 28.08.2014 17:31

Если бы вы серьезно относились к сокращению строк кода, вы бы использовали эту конструкцию: foo && bar(); вместо однострочных операторов if, foo ? doSomething() : doSomethingElse() вместо однострочных операторов if-else и т. д. Увы, большинство людей не относятся серьезно к В самом деле сокращение строк кода. :)

Trevor 23.09.2014 00:16

Упс, пропустил тег C#.

Trevor 23.09.2014 00:23

Если ваш самый главный аргумент - количество строк, что-то не так с вашим мышлением о коде :-)

Niels Abildgaard 29.10.2015 12:59

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

Néstor Sánchez A. 11.03.2016 09:19

Re: «КТО ЗАБОТИТСЯ, СКОЛЬКО ЭТО ТАКОЕ ЛИНИЙ». Консолидированный код значительно упрощает чтение при отладке javascript в браузерах при просмотре веб-сайта. И если это аргумент, зачем вообще использовать вспомогательные функции?

Chris Fremgen 13.07.2016 18:23

@Trevor Уменьшение количества строк - это не уменьшение количества строк. Речь идет о читабельности кода. Это также ответ на вопрос, почему писать foo && bar(); обычно плохо.

martinkunev 31.05.2017 15:02

@martinkunev именно так.

Trevor 31.05.2017 21:33

Это считают плохим только люди, которым нужно научиться лучше разбираться в коде. И, как уже упоминалось, если у них есть проблема без {}, то как насчет тернарных операторов? Пример даже не вложен! @martinkunev Эта школа мысли и тому подобное очень ограничена. Слишком двоичный. Да, да, логическое значение стремится к 1 или 0, но это результат операций. Единственная проблема с таким кодом ... он зависит от слишком большого количества переменных. Но я знаю, что люди также недовольны кодом вроде: если ((s = сокет (...)) <0), хотя у меня никогда не было проблем с чтением такого кода. Споры о стиле лают.

Pryftan 15.10.2019 15:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
183
20
60 162
52
Перейти к ответу Данный вопрос помечен как решенный

Ответы 52

Допустим, у вас есть код:

if (foo)
    bar();

а потом приходит кто-то другой и добавляет:

if (foo)
    snafu();
    bar();

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

Об этом уже говорилось в вопросе.

Mike Scott 11.12.2008 18:46

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

Elie 11.12.2008 18:50

Действительно ли существует такая вещь, как код защиты от ошибок?

Bob 11.12.2008 18:56

Нет, но вы можете усложнить задачу. Прочтите «Самые сокровенные секреты коллегиальной проверки кода» Джейсона Коэна (см. Ссылку сбоку на некоторых страницах здесь), чтобы лучше понять, почему вы это делаете.

Elie 11.12.2008 19:07

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

bruceatk 11.12.2008 19:21

Ваш программист по обслуживанию может забыть добавить фигурные скобки позже, если он / она добавит логику в приложение. Так происходит следующее:

if (foo)
bar();
bar(delete);

Вместо

if (foo) {
bar();
}
 bar(delete);

Об этом говорится в вопросе.

Mike Scott 11.12.2008 18:46

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

George Stocker 11.12.2008 18:47

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

Elie 11.12.2008 18:54

Эта вмятина ужасна.

recursive 11.12.2008 19:47

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

if (x == y)
   for(/* loop */)
   {
      //200 lines
   }

//rampion's example:
for(/* loop */)
{
   for(/* loop */)
      for(/* loop */)
      {
         //several lines
      }
}

В остальном у меня с этим проблем нет.

Плохие примеры. В обоих случаях я бы включил 200 строк для цикла в отдельный метод или, желательно, в несколько методов.

Adam Jaskiewicz 11.12.2008 19:02

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

rampion 11.12.2008 19:45

Это случается. Это не значит, что произойдет должен.

Adam Jaskiewicz 11.12.2008 20:48

@AdamJaskiewicz Верно. Это случается. Мы должны думать о том, что происходит делает, а не о том, что происходит должен. Если бы мы могли ограничиться тем, что происходит должен, нам не нужно было бы беспокоиться об ошибках.

Beska 16.08.2012 16:45
Ответ принят как подходящий

На самом деле, единственный раз, когда меня действительно укусило, было, когда я отлаживал и закомментировал bar ():

if (foo)
  // bar();
doSomethingElse();

Помимо этого, я обычно использую:

if (foo) bar();

Что заботится о вышеуказанном случае.

РЕДАКТИРОВАТЬ Спасибо за разъяснение вопроса, согласен, мы не должны писать код с наименьшим общим знаменателем.

Это, конечно, грубо, но я думаю, что самая большая проблема для сопровождающих заключается в том, что они добавят вторую строку и не поймут, что это не часть условного оператора, даже если это ДЕЙСТВИТЕЛЬНО выглядит так, как должно быть.

danieltalsky 12.12.2008 08:48

Мне не нравится стиль с одним лайнером, потому что я всегда ищу тело цикла ниже.

Nosredna 19.06.2009 04:28

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

Alan Plum 05.02.2010 03:10

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

Bohumil Janda 13.11.2013 14:02

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

Andrew Theken 28.08.2014 17:28

@AndrewTheken Это способ НЕ сказать: «Если бы я стал лучше разбираться в коде, мне бы не пришлось беспокоиться об этой проблеме ....». Ни разу даже при отладке пропуск символов '{} не вызвал у меня проблемы. На мой взгляд, это выглядит намного приятнее. Добавьте время, необходимое для их ввода (тем более, если на разных строках), и это будет тратить гораздо больше времени, чем экономить.

Pryftan 15.10.2019 15:58

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

Я видел

if (...)
    foo();
    bar();

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

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

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

Bob 11.12.2008 18:58

@ Боб: Хороший замечание, и я делаю это только изредка. Я не хотел бы притворяться, что у меня есть реальные причины здесь :) На самом деле, есть разумная причина - вложенность таких использований (и только использования) довольно очевидна, и вы все равно получите блок а. Я не могу сразу увидеть опасность.

Jon Skeet 11.12.2008 19:05

Что, конечно, не означает, что не какая-то опасность.

Jon Skeet 11.12.2008 19:06

Лучшее решение этой ошибки: используйте Python. (Шучу, конечно.)

Joel Wietelmann 11.12.2008 20:28

В большинстве случаев он укоренился в качестве стандарта кодирования, будь то для компании или проекта FOSS.

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

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

+1 за комментарий о питоне. Меня всегда удивляло, насколько я «глуп», когда постоянно переключаюсь с одного языка на другой.

Kena 11.12.2008 19:22

Одна из основных проблем - когда у вас есть области с однострочными и не однострочными, вместе с отделением от контрольного статуса (for, if, что у вас есть) и концом статуса.

Например:

for (...)
{
  for (...)
    for (...) 
    {
      // a couple pages of code
    }
  // which for block is ending here?  A good text editor will tell you, 
  // but it's not obvious when you're reading the code
}

Почему в вашем цикле for вообще есть пара страниц кода?

Adam Jaskiewicz 11.12.2008 19:04

b / c Я нечувствительный болван и помешан на том, чтобы избавиться от «стоимости» вызовов функций. :)

rampion 11.12.2008 19:43

Обычно пара страниц кода должна быть в отдельной функции.

Jonathan Leffler 11.12.2008 23:10

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

rampion 12.12.2008 06:15

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

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

Это компромисс между более коротким кодом (лучше читаемым) по сравнению с более безопасным кодом (менее подверженным ошибкам).

Мои 2 цента:

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

Бесчисленные программисты в пункте 1, являются ли они лидерами отрасли, за которыми мы должны следовать, или программистами типа LCD?

Bob 11.12.2008 19:15

Они наши предки, те мифические персонажи, которые в древние времена заложили основы нашего ремесла в том виде, в каком мы его знаем сегодня. Мы всегда будем в их подчинении. Одной из многих важных работ, которые они сделали, было уничтожение зла, известного как GOTO. (Древние времена = 1970–1990 годы) 1970–1990 годы

Treb 11.12.2008 19:25

Чтобы код со скобками не занимал много места, я использую технику, рекомендованную в книге Код завершен:

if (...) {
    foo();
    bar();
}
else {
    ...
}

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

Eric 12.12.2008 02:08

Это более известный как стиль K&R. На основе книги Кернигана и Ричи «Язык программирования C»: en.wikipedia.org/wiki/The_C_Programming_Language_(book). И это не должно сбивать вас с толку.

jmucchiello 19.12.2008 06:05

Спасибо! Я решил, что это просто личный вкус. Раньше меня раздражал этот синтаксис, но я принял его после прочтения Code Complete, и теперь он мне очень нравится.

Nathan Prather 09.01.2009 19:57

я читал все ответы выше этого, думая "почему никто еще не предложил это ???" Он выравнивает закрывающую скобку с блоком, который она закрывает, то есть «if» или «while» и т.д., а не бессмысленным «{». +1.

nickf 19.06.2009 04:39

Если открытые фигурные скобки всегда помещаются в строки сами по себе, то if, за которым следует одна строка с отступом, может быть визуально распознан как управляющий отдельным оператором без необходимости использования фигурных скобок. Таким образом, стиль «открытая фигурная скобка сам по себе» сохраняет пробелы в ситуации, когда оператор if управляет чем-то, что семантически является одним действием (в отличие от последовательности шагов, которая содержит только один шаг). Например, if (someCondition) / `throw new SomeException (...)`.

supercat 15.08.2014 19:29

Экономия вертикального пространства - не добродетель.

Almo 04.04.2016 19:00

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

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

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

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

Строки (почти) свободны, минимизация количества строк в вашем коде не должна быть целью.

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

Раньше я был ярым сторонником «фигурных скобок - ОБЯЗАТЕЛЬНО!», Но с тех пор, как я принял модульное тестирование, я обнаружил, что мои модульные тесты защищают операторы без фигурных скобок от таких сценариев, как:

if (foo)
    snafu();
    bar();

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

В качестве альтернативы, для чего-то подобного выше, я бы, вероятно, встроил это так:

if (foo) snafu();

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

Вы сказали: «Мне это не нужно», а затем указали причину для его использования: удобочитаемость!

tvanfosson 11.12.2008 18:50

Я бы не стал полагаться на модульный тест, чтобы найти это. LINT может быть, Unit test нет!

Kristen 28.02.2009 10:00

@Kristen - Идея модульного теста состоит в том, чтобы подтвердить поведение метода. Если поведение изменится (как описано выше), модульный тест завершится ошибкой. Я не вижу в этом проблемы.

Liggy 27.11.2009 17:05

Но зачем полагаться на Unit Test, чтобы выявить очевидные вещи, которые необходимо исправить, прежде чем переходить к UT?

Andrew 27.09.2012 14:24

Если это что-то маленькое, напишите это так:

if (foo()) bar();

Если он достаточно длинный, чтобы разбить его на две строки, используйте фигурные скобки.

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

jalf 11.12.2008 19:37

Однако не очень дружелюбен к отладчику. Как установить точку останова на «полосе»?

Nemanja Trifunovic 11.12.2008 22:17

@Nemanja: Просто наведите курсор на bar (); и нажмите F9. И VS2005, и VS2008 обрабатывают внутристрочные точки останова, если они являются отдельными «операторами».

GalacticCowboy 11.12.2008 22:52

GalanticCowboy: Есть больше сред, чем вы знаете. :-)

user14070 12.12.2008 01:25

Конечно, но поскольку контекст - это C#, он должен охватывать значительное большинство пользователей ...

GalacticCowboy 12.12.2008 03:18

Я не рекомендую это, потому что в конечном итоге содержимое выражения if и имя функциональной панели () могут измениться из-за переименований, изменения требований и т. д. И в какой-то момент могут превысить максимальную длину строки. Другой разработчик может увидеть переполненную строку и обернуть ее. Тогда у вас есть такое же висящее утверждение. Я бы сказал, никогда не пропускайте фигурные скобки. Это тоже требует меньше размышлений, вам не нужно спрашивать себя: «Следует ли мне использовать фигурные скобки?» каждый раз.

Sedat Kapanoglu 05.06.2020 00:25

Я предпочитаю ясность, которую предлагает фигурная скобка. Вы точно знаете, что имеется в виду, и вам не нужно гадать, если кто-то просто пошутил и оставил их (и внес ошибку). Единственный раз, когда я их опускаю, - это когда я помещаю if и action в одну строку. Я тоже не очень часто это делаю. На самом деле я предпочитаю пробелы, введенные путем помещения фигурной скобки в отдельную строку, хотя из-за многих лет программирования в стиле C K&R завершение строки скобкой - это практика, которую я должен преодолеть, если IDE не применяет ее для меня.

if (condition) action();  // ok by me

if (condition) // normal/standard for me
{
   action();
}

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

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

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

Конечно, это очень субъективно. Если их иногда не включать, читаемость улучшается.

Brian Knoblauch 11.12.2008 18:50

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

James McMahon 11.12.2008 18:54

  • Write the opened bracket on the same line as previous statement:
    if ( any ) {
        DoSomething();
    }
    

  • Если вы думаете, что это слишком велико, вы можно записать в одну строчку:
    if ( any ) { DoSomething(); }
    

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

    if ( any ) {
        DoSomething(); }
    if ( any )
        { DoSomething(); }
    
    • В будущем кому-то понадобится изменение одно заявление к нескольким заявлениям. Без скобок это изменение больше сложный. Да только немного, но лучше предотвратить баги. И писать кронштейны очень простой дешевый способ.
  • Закрывающие скобки всегда должны находиться на уровне блока, но не за концом последней строки.

    recursive 11.12.2008 19:54

    Это даже хуже, чем не использовать скобки.

    FINDarkside 26.01.2019 17:09

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

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

    dance2die 23.10.2009 07:44

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

    Я нахожу это очень читаемым: -

    if (foo)
        bar();
    

    и это:-

    if (foo)
        bar()
    else
        snafu();
    

    Если к ним добавлена ​​дополнительная строка: -

    if (foo)
        bar();
        snafu();
    

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

    Аналогичное рассуждение справедливо и для цикла for. Однако когда я начинаю вложение: -

    if (foo)
        if (bar)
            snafu()
    

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

    if (foo) {
       if (bar)
           snafu()
    }
    

    Когда я набираю это, я видел, как ответы прыгают с 1 на 17, очевидно, это будет эмоциональный вопрос (я предлагаю вам добавить субъективное в список тегов (моя способность делать это пропала, что с этим?) )).

    Самое важное - это согласовать в команде, насколько это приемлемо, и придерживаться его.

    Попробуйте if (foo && bar) snafu (). C# поддерживает короткое замыкание :)

    Brian 20.06.2009 00:00

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

    Без подтяжек:

    if (DoSomething)
        MyClass myClass = new MyClass();
    
    myClass.DoAnythingElse();
    

    Это будет компилироваться, но легко приведет к нулевым ссылкам. (Компилятор C# не компилирует это, хорошо!)

    Тогда как так:

    if (doSomething)
    {
        MyClass myClass = new MyClass();
    }
    
    myClass.DoAnythingElse();
    

    даже не компилируется.

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

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

    mockobject 11.12.2008 19:09

    блин, ты прав, компилятор C# для этого достаточно умен.

    Oliver Friedrich 11.12.2008 19:11

    Демонстрация того, что C# будет жаловаться на комментарий mockobject: dotnetfiddle.net/9r0AZg

    ErrCode 19.09.2018 16:13

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

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

    if (something)
        just one statement; // i find this ugly
    else
    {
        // many
        // lines
        // of code
    }
    

    я предпочитаю

    if (something)
    {
        just one statement; // looks better:)
    }
    else
    {
        // many
        // lines
        // of code
    }
    

    Один из случаев, когда это может вас укусить, - это старые времена макросов C / C++. Я знаю, что это вопрос C#, но часто стандарты кодирования переносятся без объяснения причин, по которым этот стандарт был создан.

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

    #define BADLY_MADE_MACRO(x) function1(x); function2(x);
    
    if (myCondition) BADLY_MADE_MACRO(myValue)
    

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

    если бы только весь код объявил себя таковым ... вздох

    Nathan Strong 12.12.2008 02:17

    Сделайте ошибку в сторону большей безопасности - еще одна ошибка, которую вам, возможно, не придется исправлять.

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

    Если у меня однострочный, я обычно форматирую его следующим образом:

    if ( some_condition ) { do_some_operation; }
    

    Если линия слишком громоздкая, используйте следующее:

    if ( some_condition )
    {
        do_some_operation;
    }
    

    Хорошо, мне всегда казалось, что это больше мое личное предпочтение. Однако я заметил, что для удобства чтения лучше иметь {}, чем не иметь. Я заметил, используя ReSharper, что ReSharper имеет тенденцию удалять их и делает большинство из вас, если такие утверждения, как это

    if (this == yes)
          DoSomething();
    

    Но для удобства чтения я всегда делаю

    if (this == yes)
    {
     DoSomething();
    }
    

    Хотя только одна строка кода в операторе if, читаемость на самом деле не отличается, но если вы поместите 20-30 строк кода в один оператор if, тогда его будет легче читать с помощью {} там, и это оставляет меньше места для ошибок и ошибки в вашем коде.

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

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

    if (a)
       if (b)
         c();
    else
       d();
    

    Вы заметили, что предложение else на самом деле является предложением if (b)? Вы, вероятно, знали, но доверяете ли вы кому-нибудь, кто знаком с этой проблемой?

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

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

    Andrei Rînea 17.12.2008 04:56

    Скорее это должно быть написано так, как будто (a && b) ... в первую очередь мне кажется.

    alexander.biskop 20.02.2013 14:55

    @ alexander.biskop: Конечно, нет, поскольку это придает блоку else другое значение (!a || !b), чем с (!a) или без (a && !b) фигурных скобок.

    Ben Voigt 30.07.2013 22:47

    @ Бен Фойгт: Верно! Попался на это ;-) Полгода и два голоса спустя кто-то понимает, что заявление, которое я сделал, неверно ... Думаю, я не уделил достаточно внимания деталям, в основном потому, что цель моего комментария была иной, чем указание технически правильное преобразование этого if-clause. Я имел в виду, что вложенные встроенные операторы if обычно значительно снижают удобочитаемость (и особенно прослеживаемость потока управления), поэтому их лучше объединить в один оператор (или вообще обойти). Ваше здоровье

    alexander.biskop 30.07.2013 23:39

    @ alexander.biskop: В то же время отладка проще с вложенными ifs, каждое из которых имеет более простые условия, поскольку вы можете выполнить один шаг для каждого.

    Ben Voigt 30.07.2013 23:42

    Всегда ли это так? То есть приоритет else всегда переходит к ближайшему предложению if, если скобок не существует? Имеет смысл (вам нужно что-то выбрать), хотя мне интересно, что люди делали до того, как у клавиатур были скобки. NOP? ; ^)

    ruffin 19.08.2016 18:43

    @ruffin Да. Всегда. Но для очень интересного документа об истории Си, написанного самим Ричи, см. bell-labs.com/usr/dmr/www/chist.html. Там вы также найдете интересный лакомый кусочек о том, что соединение + = в какой-то момент является противоположным! (То есть было = +). Что касается структуры {} помните? Функции? И т.п.

    Pryftan 15.10.2019 16:06

    Вы думали об изучении этой опции для однострочного оператора if else:

    (!a) ? Foo() : Bar();
    

    Некоторым это неприятно, потому что тернарный оператор предназначен для вычисления значений. Управление потоком в вашем примере - это побочный эффект.

    recursive 11.12.2008 19:51

    @recursive - вы правы. Похоже, что это обычная практика для вычисления значения: en.wikipedia.org/wiki/%3F:

    Michael Kniskern 11.12.2008 20:07

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

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

    if (x < y)
        x = y;
    else
        y = x;
    

    И еще один такой;

    if (x < y)
    {
        x = y;
        x++;
    }
    else
    {
        y = x;
        y++;
    }
    

    Я предпочитаю просто выбрать один общий стиль и придерживаться его :)

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

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

    if (foo)
    {
      // Lot of code
    }
    else
      DoStuff();
    

    Сказав это, иногда я балуюсь без подтяжек: в условиях охраны, когда я делаю ранний выход:

    if (somethingBadHappened)
      return;
    

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

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

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

    «Я не плачу за место на экране». Вы платите за это тем, что не можете одновременно видеть другой код.

    recursive 11.12.2008 19:52

    Уменьшение морщин - не лучший аргумент в пользу снятия скобок. Если ваш метод слишком велик, его, вероятно, следует реорганизовать на более мелкие части или реструктурировать. Это, несомненно, улучшит читаемость текста больше, чем просто снятие скобок.

    Линии дешевые. Питание процессора дешевое. Время разработчика очень дорогое.

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

    (а) Любому другому разработчику легко следить за тем, что я делаю

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

    (c) Легко отлаживать, если что-то пойдет не так

    (d) Легко изменить, если это потребуется в будущем (например, добавление / удаление кода)

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

    Опускание фигурных скобок в большинстве случаев усложняет для меня пункты (b), (c) и (d) (однако заметьте, что это не невозможно). Я бы сказал, что использование фигурных скобок не влияет на (а).

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

    Kelly S. French 07.08.2012 19:35

    С одной стороны, я оставляю фигурные скобки для одного утверждения. С другой стороны, я проверяю весь код C с помощью PC-Lint (http://www.gimpel.com/), который помечает две или более строк с отступом, следующих за оператором if (), как «подозрительный отступ».

    Кстати, размещение отдельных операторов в одной строке с if () выглядит хорошей идеей.

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

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

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

    Тем не менее, некоторые вещи в мире изменились, что делает правило «используйте фигурные скобки на однострочных блоках» менее актуальным сегодня, чем когда Моисей передал его нам:

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

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

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

    • Рефакторинг и языковая выразительность означает, что мои блоки намного короче, а однострочные блоки встречаются гораздо чаще, чем раньше. Гипотетически, с безжалостным применением ExtractMethod, я мог бы иметь однострочные блоки Только во всей моей программе. (Интересно, как бы это выглядело?)

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

    if (condition) Foo();   // normal, everyday code
    
    if (condition) 
    {
        // something non-trivial hapening; pay attention!
        Foo();
        Bar();
    }
    

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

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

    Alan Plum 05.02.2010 03:04

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

    Igor Popov 26.12.2010 17:43

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

    for (int i=0; i<10; i++) 
    {
        for (int x=0; x<20; x++) 
        {
            if (someBoolValue)
                DoThis(x,y);
        }
    }
    

    Другое исключение, конечно же, составлено с использованием операторов.

    Нет абсолютно никакого смысла писать

    using (Stream x = File.Open(...)) 
    {
        using (Stream y = File.Create(...)) 
        {
            ...
        }
    }
    

    когда ты можешь писать

    using (Stream x = File.Open(...))
    using (Stream y = File.Create(...)) 
    {
        ....
    }
    

    Павел сказал:

    And indentation is independent of brace usage.

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

    if (something)
      {
        for (i = 0; i < count; i++)
          {
            foo();
          }
      }
    

    Без скобок это становится:

    if (something
      for (i = 0; i < count; i++)
        foo();
    

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

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

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

    if (something)
    { for (i = 0; i < count; i++)
      { foo();
      }
    }
    

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

    Из трех условностей:

    if (addCurleyBraces()) bugFreeSofware.hooray();
    

    а также:

    if (addCurleyBraces())
        bugFreeSofware.hooray();
    

    и (которые представляют любой стиль отступа с использованием открывающей и закрывающей скобок):

    if (addCurleyBraces()) {
        bugFreeSofware.hooray();
    }
    

    Я предпочитаю последний вариант:

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

    Скорость чтения ...

    Помимо того, что уже было сказано. К этому моменту я уже был подготовлен к синтаксическому анализу операторов if с фигурными скобками и пробелами. Итак, я прочитал:

    if (condition)
    {
        DoSomething();
    }
    
    DoSomethingElse();
    

    Чуть быстрее, чем я читал:

    if (condition) DoSomething();
    
    DoSomethingElse();
    

    Я читаю немного медленнее, если это выглядит так:

    if (condition) DoSomething();
    DoSomethingElse();
    

    Я читаю это значительно медленнее, чем предыдущее:

    if (condition) 
        DoSomething();
    DoSomethingElse();
    

    потому что я не могу не прочитать его еще раз на всякий случай и задаться вопросом, хотел ли автор:

    if (condition)
    {
        DoSomething();
        DoSomethingElse();
    }
    

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

    if (condition) 
        DoSomething();
        DoSomethingElse();
    

    Проблема решается, когда в вашем 4-м примере вы просто помещаете пустую строку после оператора if, чтобы отделить его от DoSomethingElse (). Это то, что я делаю, и удобочитаемость практически такая же, как в 1-м образце (если не лучше ;-P) Другое дело, что размещение строк группами по 2 или 3 значительно улучшает читаемость, вы просто намного быстрее просматриваете код.

    Piotr Owsiak 19.08.2009 04:17

    Как насчет if (condition) {newline} DoSomething(); {newline x2} DoSomething();? Я нахожу это менее подробным, чем 2 фигурных скобки для одного if. Мне труднее читать (когда они длинные) одну строчку if (condition) dosomething, но я думаю, что я в меньшинстве

    Chris S 13.11.2009 19:12

    Я согласен с тем, что фигурные скобки могут быть быстрее читаемы, но когда вы хотите увидеть больше материала одновременно, это увеличивает скорость чтения отдельных материалов, но снижает скорость понимания и требует большего количества перечитываний. И все становится просто болезненным, когда у вас есть фигурные скобки для последовательного кода проверки ошибок с большим количеством строк, например, if (badCondition) return;. Реорганизовать такой код в условное выражение or не всегда практично.

    Brian 13.11.2009 21:57

    Возможно, это потому, что я привык к Python, но размещение первой фигурной скобки в той же строке, что и оператор if, позволяет мне читать + понимать это еще быстрее.

    Ponkadoodle 24.01.2010 05:30

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

    Nate C-K 05.02.2010 03:02

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

    Gabi Purcaru 08.11.2010 22:23

    Подтяжки явны по своей природе. Я буду придерживаться этого, спасибо.

    TheOptimusPrimus 04.09.2013 18:39

    В последнем случае выследите оригинального автора и отшлепайте его ...;)

    Per Lundberg 07.11.2013 00:37

    +1 в основном для того, чтобы получить 98. Скоро вы наберете 100! А если серьезно, то этой проблемы практически не существует, когда люди следуют Single Responsibility. Не только классы ... но и решения единой ответственности, проекты, модули, члены и даже строки кода единственной ответственности. Когда вы выполняете модульное тестирование и / или разработку через тестирование, вы почти вынуждены разбивать свой код на крошечные объекты. Другими словами, весь этот вопрос касается только длинных методов процедурного стиля. И как вы указываете, это проблема удобочитаемости, которой нет в Single Responsibility.

    Suamere 18.05.2014 04:23

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

    Pryftan 15.10.2019 16:01

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

    if (condition1)
    if (condition2)
    doSomething();
    else
    doSomethingElse();
    

    Когда вызывается doSomethingElse? Когда условие1 истинно, а условие2 ложно, или когда условие1 ложно? Добавление фигурных скобок быстро решает эту проблему с удобочитаемостью и позволяет избежать путаницы.

    Альтернативный метод, сочетающий в себе лучшее из обоих миров, заключается в следующем:

    if (foo)
       {DoSomething();}
    

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

    Кроме того, мы используем MISRA-C в качестве стандарта кодирования, который требует, чтобы все подобные конструкции использовали фигурные скобки при любых обстоятельствах.

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

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

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

    Проблема отсутствия фигурных скобок, как уже упоминалось, заключается в вероятности ошибки постфактум. Большинство программистов согласятся, что они могут читать:

    if ( foo )
        bar();
    

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

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

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

    Раньше я сам ненавидел брекеты. Пока однажды я не нашел им применение. Я работаю на разных платформах, портирую приложение с платформы на платформу (всего работаю над 6). В UNIX, если у вас установлен vim, вы можете легко перейти к концу или началу блока кода, нажав Shift + 5. В основном это блоки if / else или циклы.

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

    Используйте личное суждение.

    if (foo)
      bar();
    

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

    if (foo)
      bar();
      baz();
    

    Если вас не беспокоят дебилы, все в порядке (я не - если они не могут правильно понять базовый синтаксис кода, это их наименьшая из проблем)>

    Зато он намного читабельнее.

    Оставшееся время:

    if (foo) {
      bar();
      baz();
    }
    

    Сколько себя помню, это было моим любимым. Кроме того:

    if (foo) {
      bar();
      baz();
    } else {
      qux();
    }
    

    Работает для меня.

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

    Единственный раз, когда я предпочитаю первый стиль, - это когда мне нужно немедленно вернуться или выдать ошибку, если что-то не так. Как if (parameter == null) return null;.

    nawfal 03.02.2014 22:12
    1. Пробелы бесплатны.
    2. В зависимости от отступа для удобства чтения в будущем означает зависимость от настроек вкладки, что не является хорошей идеей. Вы когда-нибудь работали над кодом десятилетней давности, который не находился под контролем?
    3. Мой опыт показывает, что любое время, которое вы сэкономили, не набирая фигурные скобки, более чем потеряно из-за дополнительного времени, которое требуется мне, чтобы понять, что вы имели в виду.

    Мне тоже нравится более компактное форматирование. Вот почему я постоянно нажимаю Ctrl + K, Ctrl + D, чтобы переформатировать в Visual Studio. Я просто хотел бы, чтобы он делал это за меня после каждого нажатия клавиши.

    Я привык думать так же.

    До одного дня (почему всегда есть тот «один день», который навсегда меняет вашу жизнь?) Мы проводим от 24 до 36 часов подряд без отладки производственного кода сна только для того, чтобы обнаружить, что кто-то не поставил фигурные скобки в сочетании с изменением поиска / замены .

    Это было примерно так.

     if ( debugEnabled ) 
          println( "About to save 1 day of work to some very important place.");
     saveDayData();
    

    То, что было после, было

     if ( debugEnabled ) 
     //     println( "About to save 1 day of work to some very important place.");
     saveDayData();
    

    Оказывается, система ежедневно генерировала 500 МБ журналов, и нас попросили остановить ее. Флага отладки было недостаточно, поэтому поиск и замена println были в порядке.

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

    РЕДАКТИРОВАТЬ

    Теперь единственное место, где я не использую фигурные скобки, - это конструкция if / try.

    if ( object != null ) try { 
         object.close();
    } catch( .....
    

    После того, как это сделал суперзвезда-разработчик.

    Я не понимаю. У вас есть переменная, которая управляет отладкой (debugEnabled), и вы все еще используете комментарии, чтобы отключить отладку ??? Почему вы просто не установили для параметра debugEnabled значение false?

    Igor Popov 26.12.2010 17:30

    Это не совсем тот сценарий, но вы правильно подметили. Глупые вещи (например, если для отладки не задано значение false) действительно создают тонкие и глупые ошибки, которые труднее найти, чем «очевидные» ошибки. В этом случае отказ от брекетов не очень помог.

    OscarRyz 27.12.2010 23:37

    @igor Как насчет того, что они просто хотели удалить одну строку журнала, а не все строки журнала?

    gman 24.03.2017 08:10

    Хорошо, это старый вопрос, на который дан смертельный ответ. Мне есть что добавить.

    Сначала я просто должен сказать ИСПОЛЬЗУЙТЕ СКРЕПКИ. Они могут только улучшить читаемость, а читаемость (для вас и других!) Должна быть очень важной в вашем списке приоритетов, если вы не пишете ассемблер. Нечитаемый код всегда, всегда приводит к ошибкам. Если вы обнаружите, что фигурные скобки заставляют ваш код занимать слишком много места, вероятно, ваши методы слишком длинные. Большая часть или все методы должны умещаться в пределах одной высоты экрана, если вы все делаете правильно, и Find (F3) - ваш друг.

    Теперь к моему добавлению: с этим есть проблема:

    if (foo) bar();
    

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

    Итак, сделайте это:

    if (foo)
    {
        bar(); //It is easy to put a breakpoint here, and that is useful.
    }
    

    Щелкните правой кнопкой мыши на панели и выберите «Вставить точку останова» ... Совсем несложно. Знайте свои инструменты.

    Bob 19.06.2009 04:50

    Щелчок правой кнопкой мыши по полосе индикатора ничего не делает; вы имеете в виду щелкнуть правой кнопкой мыши по тексту? В любом случае, если вы хотите, чтобы точка останова срабатывала только тогда, когда оператор «if» истинен, а «bar ()» находится на отдельной строке, вы можете поместить курсор в любое место этой строки и нажать F9 или щелкнуть левой кнопкой мыши по маржа индикатора. Если, однако, весь код находится в одной строке, вы должны поместить курсор на «bar ()» или щелкнуть правой кнопкой мыши именно там, прежде чем нажимать F9, и щелчок по краю индикатора не будет работать (точка останова помещается на ' если'). Это не сложно, но требует меньшей концентрации, когда код состоит из двух строк.

    stone 19.06.2009 23:36

    О, ха-ха, щелкните правой кнопкой мыши «панель ()». Вы действительно имели в виду текст. Попался. Конечно, или просто нажмите F9 ...

    stone 19.06.2009 23:40

    >> вы должны поместить курсор на «bar ()» или щелкнуть правой кнопкой мыши именно там, прежде чем нажимать F9, (я имел в виду поместить курсор именно там, прежде чем нажимать F9 или щелкать правой кнопкой мыши)

    stone 19.06.2009 23:42

    Потому что StyleCop так говорит.

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

    Rich 05.12.2017 22:40

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

    if (mybool)
    {
      doMyStuff();
    }
    else
    {
      doMyOtherStuff();
      checkStuff();
    }
    

    и НЕ нравится

    if (mybool) {
      doMyStuff();
    }
    else {
      doMyOtherStuff();
      checkStuff();
    }
    

    и не нравится

       if (mybool)
         doMyStuff(); 
       else 
       {  
         doMyOtherStuff();
         checkStuff(); 
       }
    

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

    Wick 17.01.2011 19:14

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

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

    Откровенно говоря, я вижу это как:

    Хорошие программисты занимаются оборонительной программой, плохие - нет.

    Поскольку есть несколько примеров выше и мой собственный аналогичный опыт с ошибками, связанными с забыванием брекетов, я научился на горьком опыте ВСЕГДА ставить брекеты.

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

    Джоэл даже упоминает об этом в Сделать неправильный код неправильным

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

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

    supercat 15.08.2014 19:32

    Я очень рад:

    foreach (Foo f in foos)
      foreach (Bar b in bars)
        if (f.Equals(b))
          return true;
    
    return false;
    

    Лично я не понимаю, почему

    foreach (Foo f in foos)
    {
      foreach (Bar b in bars)
      {
        if (f.Equals(b))
        {
          return true;
        }
      }
    }
    
    return false;
    

    уже не читается.

    Да, строки бесплатны, но зачем мне пролистывать страницы и страницы кода, если он может быть вдвое меньше?

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

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

    if (condition1)
      if (condition2)
        doSomething();
      else (condition2)
        doSomethingElse();
    

    против

    if (condition1)
      if (condition2)
        doSomething();
    else (condition2)
      doSomethingElse();
    

    ужасно сбивает с толку, поэтому я всегда пишу это так:

    if (condition1)
    {
      if (condition2)
        doSomething();
      else (condition2)
        doSomethingElse();
    }
    

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

    только что видел, как это почти происходит в моем коде :) подумал, что посмотрю вокруг, и, о чудо ... он уже там :)

    Noctis 21.11.2014 05:00

    Другие вопросы по теме