他のすべての答えはあなたの講師のルール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;
}
最初のコードは簡潔です。2番目のコードは肥大化しています。
はい、前の行にオープニングブレースを配置することで、これをある程度軽減できます。したがって、中括弧を使用する場合は、少なくとも前の行に中括弧を配置してください。
つまり、画面スペースを占める不要なコードを記述しないでください。
最初に答えを書いたときから、私は一般的なコードスタイルをほとんど受け入れ、前の行に1つのステートメント全体を置くことができない限り、中括弧を使用しました。冗長な中括弧を使用しない方が通常は読みやすいと私は今でも主張しており、これによって引き起こされるバグに遭遇したことはありません。