ฉันคิดถึงเรื่องนี้มาระยะหนึ่งแล้วและอยากรู้อยากเห็นจากนักพัฒนาคนอื่น ๆ
ฉันมักจะมีรูปแบบการเขียนโปรแกรมที่ป้องกันมาก บล็อกหรือวิธีทั่วไปของฉันมีลักษณะดังนี้:
T foo(par1, par2, par3, ...)
{
// Check that all parameters are correct, return undefined (null)
// or throw exception if this is not the case.
// Compute and (possibly) return result.
}
นอกจากนี้ในระหว่างการคำนวณฉันจะตรวจสอบพอยน์เตอร์ทั้งหมดก่อนที่จะทำการลงทะเบียนอีกครั้ง ความคิดของฉันคือถ้ามีข้อผิดพลาดและตัวชี้ NULL บางอย่างควรปรากฏที่ใดที่หนึ่งโปรแกรมของฉันควรจัดการสิ่งนี้อย่างดีและเพียงปฏิเสธที่จะคำนวณต่อไป แน่นอนมันสามารถแจ้งปัญหาที่เกิดขึ้นกับข้อผิดพลาดในบันทึกหรือกลไกอื่น ๆ
เพื่อให้เป็นไปในทางที่เป็นนามธรรมยิ่งกว่าแนวทางของฉันคือ
if all input is OK --> compute result
else --> do not compute result, notify problem
นักพัฒนาอื่น ๆ ในหมู่พวกเขามีเพื่อนร่วมงานของฉันใช้กลยุทธ์อื่น เช่นพวกเขาไม่ตรวจสอบพอยน์เตอร์ พวกเขาคิดว่าชิ้นส่วนของรหัสควรได้รับการป้อนข้อมูลที่ถูกต้องและไม่ควรรับผิดชอบสิ่งที่เกิดขึ้นหากอินพุตนั้นไม่ถูกต้อง นอกจากนี้หากข้อผิดพลาดตัวชี้ NULL ขัดข้องโปรแกรมจะพบข้อบกพร่องได้ง่ายขึ้นในระหว่างการทดสอบและมีโอกาสมากขึ้นในการแก้ไข
คำตอบของฉันเกี่ยวกับเรื่องนี้เป็นเรื่องปกติ แต่จะเกิดอะไรขึ้นถ้าไม่พบข้อบกพร่องในระหว่างการทดสอบและจะปรากฏขึ้นเมื่อลูกค้าใช้ผลิตภัณฑ์ไปแล้ว? เป็นวิธีที่ต้องการสำหรับข้อผิดพลาดในการเปิดเผยตัวเองคืออะไร? ควรเป็นโปรแกรมที่ไม่ได้ดำเนินการบางอย่าง แต่ยังสามารถทำงานต่อไปได้หรือโปรแกรมที่ขัดข้องและจำเป็นต้องเริ่มต้นใหม่
สรุป
คุณจะแนะนำวิธีใดในสองวิธีในการจัดการอินพุตที่ไม่ถูกต้อง
Inconsistent input --> no action + notification
หรือ
Inconsistent input --> undefined behaviour or crash
แก้ไข
ขอบคุณสำหรับคำตอบและคำแนะนำ ฉันเป็นแฟนของการออกแบบโดยสัญญาเช่นกัน แต่แม้ว่าฉันจะเชื่อใจคนที่เขียนรหัสที่เรียกใช้วิธีการของฉัน (อาจเป็นตัวฉันเอง) แต่ก็ยังมีข้อบกพร่องที่นำไปสู่การป้อนข้อมูลที่ไม่ถูกต้อง ดังนั้นวิธีการของฉันคือไม่เคยคิดว่าวิธีการผ่านการป้อนข้อมูลถูกต้อง
นอกจากนี้ฉันจะใช้กลไกเพื่อจับปัญหาและแจ้งให้ทราบเกี่ยวกับมัน ในระบบการพัฒนาเช่นจะเปิดกล่องโต้ตอบเพื่อแจ้งผู้ใช้ ในระบบการผลิตมันจะเขียนข้อมูลลงในบันทึก ฉันไม่คิดว่าการตรวจสอบพิเศษสามารถนำไปสู่ปัญหาด้านประสิทธิภาพได้ ฉันไม่แน่ใจว่าการยืนยันนั้นเพียงพอหรือไม่หากปิดอยู่ในระบบการผลิตอาจมีบางสถานการณ์ที่เกิดขึ้นในการผลิตที่ไม่ได้เกิดขึ้นระหว่างการทดสอบ
อย่างไรก็ตามฉันรู้สึกประหลาดใจจริง ๆ ที่หลาย ๆ คนปฏิบัติตามแนวทางตรงกันข้าม: พวกเขาปล่อยให้แอปพลิเคชันหยุดทำงาน "ตามวัตถุประสงค์" เพราะพวกเขายืนยันว่าสิ่งนี้จะทำให้ค้นหาข้อบกพร่องได้ง่ายขึ้นในระหว่างการทดสอบ