다른 모든 답변은 강사의 규칙 3을 방어합니다.
내가 당신에게 동의한다고 말합시다. 규칙은 중복 적이고 나는 조언하지 않을 것입니다. 항상 중괄호를 추가하면 이론적으로 오류를 방지 하는 것이 사실입니다 . 다른 한편으로, 나는 실제 생활 에서이 문제를 겪어 본 적이 없습니다 . 다른 답변이 암시하는 것과는 달리, 일단 필요한 경우 중괄호를 추가하는 것을 잊지 않았습니다. 적절한 들여 쓰기를 사용하는 경우, 하나 이상의 명령문이 들여 쓰기되면 중괄호를 추가해야한다는 것이 즉시 명백해집니다.
“Component 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;
}
첫 번째 코드는 간결합니다. 두 번째 코드는 부풀어 오른다.
그리고 예, 이것은 이전 줄에 오프닝 버팀대를 놓음으로써 어느 정도 완화 될 수 있습니다 . 하지만 그 것이다 아직 어떤 중괄호가없는 코드보다 덜 읽을 수.
한마디로 : 화면 공간을 차지하는 불필요한 코드를 작성하지 마십시오.