Tất cả các câu trả lời khác bảo vệ quy tắc 3 của giảng viên.
Hãy để tôi nói rằng tôi đồng ý với bạn: quy tắc là dư thừa và tôi sẽ không khuyên bạn. Đúng là về mặt lý thuyết, nó ngăn ngừa lỗi nếu bạn luôn thêm dấu ngoặc nhọn. Mặt khác, tôi chưa bao giờ gặp phải vấn đề này trong cuộc sống thực : trái với những gì câu trả lời khác ngụ ý, tôi đã không bao giờ quên thêm dấu ngoặc nhọn một khi chúng trở nên cần thiết. Nếu bạn sử dụng thụt lề thích hợp, điều rõ ràng là bạn cần thêm dấu ngoặc nhọn khi có nhiều hơn một câu lệnh được thụt lề.
Câu trả lời của Thành phần 10 10 thực sự làm nổi bật trường hợp duy nhất có thể hiểu được trong đó điều này thực sự có thể dẫn đến một lỗi. Nhưng mặt khác, việc thay thế mã thông qua biểu thức chính quy luôn luôn đảm bảo sự chăm sóc rất lớn.
Bây giờ chúng ta hãy nhìn vào mặt khác của huy chương: có bất lợi khi luôn luôn sử dụng dấu ngoặc nhọn không? Các câu trả lời khác chỉ đơn giản là bỏ qua điểm này. Nhưng có là một bất lợi: nó chiếm rất nhiều không gian màn hình thẳng đứng, và điều này đến lượt nó có thể làm cho mã của bạn không thể đọc được bởi vì nó có nghĩa là bạn phải di chuyển nhiều hơn mức cần thiết.
Hãy xem xét một hàm có nhiều mệnh đề bảo vệ ngay từ đầu (và vâng, sau đây là mã C ++ xấu nhưng trong các ngôn ngữ khác thì đây sẽ là một tình huống khá phổ biến):
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);
}
Đây là mã khủng khiếp và tôi lập luận mạnh mẽ rằng những điều sau đây dễ đọc hơn nhiều:
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);
}
Tương tự, các vòng lặp lồng nhau ngắn có lợi khi bỏ qua các dấu ngoặc nhọn:
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;
}
So sánh với:
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;
}
Mã đầu tiên là súc tích; mã thứ hai bị cồng kềnh.
Và vâng, điều này có thể được giảm nhẹ đến một mức độ nào đó bằng cách đặt nẹp mở trên dòng trước đó. Nhưng điều đó vẫn sẽ sẽ dễ đọc hơn mã mà không có dấu ngoặc nhọn.
Tóm lại: không viết mã không cần thiết chiếm không gian màn hình.