Все остальные ответы защищают правило вашего лектора 3.
Позвольте мне сказать, что я согласен с вами: правило излишне, и я бы не советовал его. Это правда, что это теоретически предотвращает ошибки, если вы всегда добавляете фигурные скобки. С другой стороны, я никогда не сталкивался с этой проблемой в реальной жизни : вопреки тому, что подразумевают другие ответы, я ни разу не забыл добавить фигурные скобки, как только они стали необходимыми. Если вы используете правильные отступы, сразу становится очевидным, что вам нужно добавлять фигурные скобки, как только несколько операторов имеют отступ.
Ответ «Компонента 10» фактически выдвигает на первый план единственно возможный случай, когда это действительно может привести к ошибке. Но, с другой стороны, замена кода с помощью регулярных выражений всегда требует огромной осторожности.
Теперь давайте посмотрим на другую сторону медали: есть ли недостаток в использовании фигурных скобок? Другие ответы просто игнорируют этот пункт. Но есть недостаток: он занимает много вертикального пространства экрана, а это , в свою очередь , может сделать код нечитаемым , потому что это означает , что вы должны прокручивать больше , чем необходимо.
Рассмотрим функцию с множеством защитных предложений в начале (и да, следующее - плохой код C ++, но в других языках это было бы довольно распространенной ситуацией):
void some_method(obj* a, obj* b)
{
if (a == nullptr)
{
throw null_ptr_error("a");
}
if (b == nullptr)
{
throw null_ptr_error("b");
}
if (a == b)
{
throw logic_error("Cannot do method on identical objects");
}
if (not a->precondition_met())
{
throw logic_error("Precondition for a not met");
}
a->do_something_with(b);
}
Это ужасный код, и я настоятельно утверждаю, что следующее гораздо более читабельно:
void some_method(obj* a, obj* b)
{
if (a == nullptr)
throw null_ptr_error("a");
if (b == nullptr)
throw null_ptr_error("b");
if (a == b)
throw logic_error("Cannot do method on identical objects");
if (not a->precondition_met())
throw logic_error("Precondition for a not met");
a->do_something_with(b);
}
Аналогично, короткие вложенные циклы выигрывают от того, что опускаются фигурные скобки:
matrix operator +(matrix const& a, matrix const& b) {
matrix c(a.w(), a.h());
for (auto i = 0; i < a.w(); ++i)
for (auto j = 0; j < a.h(); ++j)
c(i, j) = a(i, j) + b(i, j);
return c;
}
Сравнить с:
matrix operator +(matrix const& a, matrix const& b) {
matrix c(a.w(), a.h());
for (auto i = 0; i < a.w(); ++i)
{
for (auto j = 0; j < a.h(); ++j)
{
c(i, j) = a(i, j) + b(i, j);
}
}
return c;
}
Первый код является кратким; второй код раздутый.
И да, это можно до некоторой степени смягчить , поставив открывающую скобку на предыдущей строке. Но это все равно будет менее читабельным, чем код без фигурных скобок.
Короче говоря: не пишите ненужный код, который занимает место на экране.