Вопрос-ответ

Why is it considered a bad practice to omit curly braces? [closed]

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

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

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

Переведено автоматически
Ответ 1

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

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

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

if(foo) bar();

Который учитывает приведенный выше случай.

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

Ответ 2

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

Помимо того, что уже упоминалось. На данный момент я уже был приучен разбирать операторы 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();
Ответ 3

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

if(foo()) bar();

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

Ответ 4

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

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

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

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

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

java c#