Усі інші відповіді захищають правило вашого лектора 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;
}
Перший код - стислий; другий код роздутий.
І так, це можна певною мірою пом'якшити , поставивши вступну дужку на попередній рядок. Але це все одно буде менш читабельним, ніж код без будь-яких фігурних дужок.
Коротше кажучи: не пишіть зайвий код, який займає місце на екрані.