Tutte le altre risposte difendono la regola del docente 3.
Lasciami dire che sono d'accordo con te: la regola è ridondante e non la consiglierei. È vero che teoricamente previene gli errori se aggiungi sempre parentesi graffe. D'altra parte, non ho mai riscontrato questo problema nella vita reale : contrariamente a quanto implicano altre risposte, non ho dimenticato una volta di aggiungere le parentesi graffe una volta diventate necessarie. Se si utilizza il rientro corretto, diventa immediatamente ovvio che è necessario aggiungere parentesi graffe una volta rientrata più di un'istruzione.
La risposta di "Component 10" evidenzia in realtà l'unico caso immaginabile in cui ciò potrebbe davvero portare a un errore. D'altra parte, la sostituzione del codice con l'espressione regolare richiede comunque un'enorme cura.
Ora diamo un'occhiata all'altro lato della medaglia: c'è uno svantaggio di usare sempre parentesi graffe? Le altre risposte ignorano semplicemente questo punto. Ma v'è uno svantaggio: ci vuole un sacco di spazio sullo schermo in verticale, e questo a sua volta può rendere il codice illeggibile, perché significa che si deve scorrere più del necessario.
Considera una funzione con molte clausole guard all'inizio (e sì, il seguente è un codice C ++ errato ma in altre lingue questa sarebbe una situazione abbastanza comune):
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);
}
Questo è un codice orribile, e sostengo fortemente che quanto segue sia molto più leggibile:
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);
}
Allo stesso modo, i cicli nidificati brevi traggono beneficio dall'omissione delle parentesi graffe:
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;
}
Confrontare con:
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;
}
Il primo codice è conciso; il secondo codice è gonfio.
E sì, questo può essere mitigato in una certa misura mettendo la parentesi graffa di apertura sulla riga precedente. Ma sarebbe comunque meno leggibile del codice senza parentesi graffe.
In breve: non scrivere codice non necessario che occupa spazio sullo schermo.