所有其他答案都捍卫了讲师的规则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;
}
第一个代码简明扼要;第二个代码is肿。
是的,可以通过在前一行放置开括号在某种程度上减轻这种情况。但是那仍然比没有大括号的代码可读性差。
简而言之:不要编写不必要的代码,这些代码会占用屏幕空间。