คำตอบอื่น ๆ ทั้งหมดปกป้องกฎของอาจารย์ของคุณ 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;
}
รหัสแรกกระชับ รหัสที่สองป่อง
และใช่สิ่งนี้สามารถลดลงได้บ้างด้วยการใส่วงเล็บเปิดในบรรทัดก่อนหน้า แต่นั่นจะยังคงสามารถอ่านได้น้อยกว่ารหัสโดยไม่มีเครื่องหมายวงเล็บปีกกา
กล่าวโดยย่อ: อย่าเขียนรหัสที่ไม่จำเป็นซึ่งกินพื้นที่หน้าจอ