Wszystkie pozostałe odpowiedzi bronią zasady twojego wykładowcy 3.
Powiem, że się z tobą zgadzam: zasada jest zbędna i nie radziłbym jej. To prawda, że teoretycznie zapobiega błędom, jeśli zawsze dodajesz nawiasy klamrowe. Z drugiej strony nigdy nie spotkałem tego problemu w prawdziwym życiu : wbrew temu, co sugerują inne odpowiedzi, nie zapomniałem dodać nawiasów klamrowych, gdy stały się konieczne. Jeśli użyjesz odpowiedniego wcięcia, natychmiast stanie się oczywiste, że musisz dodać nawiasy klamrowe po wcięciu więcej niż jednego wyrażenia.
Odpowiedź „komponentu 10” w rzeczywistości podkreśla jedyny możliwy przypadek, w którym może to naprawdę prowadzić do błędu. Ale z drugiej strony zastąpienie kodu wyrażeniem regularnym zawsze wymaga ogromnej uwagi.
Spójrzmy teraz na drugą stronę medalu: czy jest wada, aby zawsze używać nawiasów klamrowych? Inne odpowiedzi po prostu ignorują ten punkt. Ale jest to wadą: to zajmuje dużo przestrzeni pionowej ekranu, a to z kolei może spowodować, że kod nieczytelny, ponieważ oznacza to, że trzeba przejść więcej niż to konieczne.
Rozważ funkcję z wieloma klauzulami ochronnymi na początku (i tak, poniższy kod jest zły C ++, ale w innych językach byłaby to dość powszechna sytuacja):
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);
}
To okropny kod i zdecydowanie argumentuję, że następujące elementy są znacznie bardziej czytelne:
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);
}
Podobnie krótkie zagnieżdżone pętle korzystają z pominięcia nawiasów klamrowych:
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;
}
Porównać z:
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;
}
Pierwszy kod jest zwięzły; drugi kod jest wzdęty.
I tak, można to w pewnym stopniu złagodzić, umieszczając nawias otwierający w poprzedniej linii. Ale tak by było było byłoby mniej czytelne niż kod bez nawiasów klamrowych.
W skrócie: nie pisz niepotrzebnego kodu, który zajmuje miejsce na ekranie.