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

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

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. Есть еще один аргумент, который я пропускаю?

169

Решение

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

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

Помимо этого, я склонен использовать:

if(foo) bar();

Который заботится о вышеупомянутом случае.

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

176

Другие решения

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

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

if (condition)
{
DoSomething();
}

DoSomethingElse();

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

if (condition) DoSomething();

DoSomethingElse();

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

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

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

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

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

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

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

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

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

if(foo()) bar();

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

52

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

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

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

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

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

45

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

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

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

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

35

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

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

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

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

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

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

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

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

33

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

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

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
}
22