คนอื่น ๆ แก้ไขข้อผิดพลาดเมื่อพวกเขาเห็นพวกเขาหรือพวกเขารอจนกว่าจะมีข้อผิดพลาด / การสูญเสียข้อมูล / คนตายก่อนที่จะแก้ไขหรือไม่
ตัวอย่างที่ 1
Customer customer = null;
...
customer.Save();
รหัสผิดอย่างเห็นได้ชัดและไม่มีทางแก้ไข - เรียกใช้วิธีการอ้างอิงแบบ null มันไม่ได้ผิดพลาดเพราะSave
ไม่ได้เข้าถึงข้อมูลอินสแตนซ์ใด ๆ ดังนั้นมันก็เหมือนกับการเรียกฟังก์ชั่นคงที่ แต่การเปลี่ยนแปลงเล็ก ๆ น้อย ๆ ที่ใดก็สามารถทำให้รหัสที่เสียหายที่ไม่ผิดพลาด: เพื่อเริ่มต้นการทำงานล้มเหลว
แต่ก็ยังไม่ได้นึกไม่ถึงว่าการแก้ไขรหัส:
Customer customer = null;
...
customer = new Customer();
try
...
customer.Save();
...
finally
customer.Free();
end;
อาจแนะนำความผิดพลาด; ไม่มีใครค้นพบผ่านการทดสอบหน่วยที่มีการครอบคลุมที่สมบูรณ์และการทดสอบผู้ใช้ด้วยตนเอง
ตัวอย่างที่ 2
float speed = 0.5 * ((G * mass1 * mass2) / R) * Pow(time, 2);
คนที่รู้เรื่องฟิสิกส์จะรับรู้ว่ามันควรจะเป็น R 2ในตัวส่วน
รหัสผิดมันผิดอย่างแน่นอน และการประเมินความเร็วที่มากเกินไปจะทำให้จรวดย้อนยุคยิงเร็วเกินไปและฆ่าผู้ที่อยู่ในยานอวกาศทุกคน
แต่ก็อาจเป็นไปได้ที่จะประเมินความเร็วเกินกว่าจะปิดบังปัญหาอื่น: ถุงลมนิรภัยไม่สามารถปรับใช้ในขณะที่รถรับส่งเคลื่อนที่เร็วเกินไป หากเราแก้ไขรหัสทันที:
float speed = 0.5 * ((G * mass1 * mass2) / Pow(R, 2)) * Pow(time, 2);
ตอนนี้ความเร็วนั้นถูกต้องและทันใดนั้นถุงลมนิรภัยกำลังปรับใช้เมื่อไม่ควร
ตัวอย่างที่ 3
นี่คือตัวอย่างที่ฉันมีเมื่อเร็ว ๆ นี้ตรวจสอบว่าสตริงมีอักขระที่ไม่ถูกต้องหรือไม่:
if (StrPos(Address, "PO BOX") >= 0)
{
//Do something
}
เกิดอะไรขึ้นถ้ามีข้อผิดพลาดในDo something
สาขา? แก้ไขรหัสที่ไม่ถูกต้องชัดเจน:
if (StrPos("PO BOX", Address) >= 0)
{
//Do something
}
แก้ไขรหัส แต่แนะนำข้อบกพร่อง
วิธีที่ฉันเห็นมันมีความเป็นไปได้สองอย่าง:
- แก้ไขโค้ดและรับโทษว่าทำผิด
- รอให้รหัสขัดข้องและถูกตำหนิเนื่องจากมีข้อบกพร่อง
คุณทำอะไรในทางการเมือง
ตัวอย่างที่ 4 - บั๊กโลกแห่งความจริงในวันนี้
ฉันกำลังสร้างวัตถุ แต่เรียกตัวสร้างผิด:
Customer customer = new Customer();
กลับกลายเป็นว่าคอนสตรัค "parameterless" เป็นคอนสตรัคเตอร์แบบแปรสภาพจากการย้อนกลับไปในห่วงโซ่การสืบทอด:
public Customer(SomeObjectThatNobodyShouldBeUsingDirectly thingy = null)
public Customer(InjectedDependancy depends)
การเรียกมันเป็นความผิดพลาดเพราะมันข้ามตัวสร้างที่ตามมาทั้งหมด
ฉันสามารถเปลี่ยนสายเลือดของวัตถุเพื่อไม่ให้มีตัวสร้างที่เป็นอันตราย แต่ตอนนี้ฉันต้องเปลี่ยนรหัสเป็น:
Customer customer = new Customer(depends);
แต่ฉันไม่สามารถรับประกันได้ว่าการเปลี่ยนแปลงนี้จะไม่ทำลายอะไรเลย เช่นเดียวกับตัวอย่างที่ 1ของฉันข้างบนบางทีใครบางคนภายใต้เงื่อนไขที่ลึกลับขึ้นอยู่กับสิ่งที่สร้างขึ้นCustomer
ว่าไม่ถูกต้องและเต็มไปด้วยขยะ
บางทีCustomer
วัตถุตอนนี้มันถูกสร้างขึ้นอย่างถูกต้องจะช่วยให้โค้ดบางอย่างทำงานที่ไม่เคยทำมาก่อนและตอนนี้ฉันสามารถชนได้
ฉันเดิมพันชีวิตภรรยาของคุณไม่ได้
และฉันสามารถทดสอบจากที่นี่ถึงวันอังคารฉันไม่สามารถสาบานในชีวิตลูกสาวของคุณที่ฉันไม่ได้แนะนำการถดถอย
ฉัน:
- แก้ไขรหัสและถูกตำหนิในการทำลายหรือไม่ หรือ
- ทิ้งข้อผิดพลาดและถูกตำหนิเมื่อลูกค้าพบหรือไม่