ฉันสงสัยว่าฉันควรป้องกันค่าตอบแทนการโทรด้วยวิธีการโดยตรวจสอบว่าพวกเขาตอบสนองความคาดหวังของฉันแม้ว่าฉันรู้ว่าวิธีการที่ฉันโทรจะตอบสนองความคาดหวังดังกล่าว
GIVEN
User getUser(Int id)
{
User temp = new User(id);
temp.setName("John");
return temp;
}
ฉันควรทำหรือไม่
void myMethod()
{
User user = getUser(1234);
System.out.println(user.getName());
}
หรือ
void myMethod()
{
User user = getUser(1234);
// Validating
Preconditions.checkNotNull(user, "User can not be null.");
Preconditions.checkNotNull(user.getName(), "User's name can not be null.");
System.out.println(user.getName());
}
ฉันถามสิ่งนี้ในระดับความคิด ถ้าฉันรู้การทำงานภายในของวิธีการที่ฉันเรียก อาจเป็นเพราะฉันเขียนหรือตรวจสอบ และตรรกะของค่าที่เป็นไปได้ที่มันจะคืนนั้นเป็นไปตามเงื่อนไขเบื้องต้นของฉัน เป็น "ดีกว่า" หรือ "เหมาะสมกว่า" เพื่อข้ามการตรวจสอบหรือฉันควรจะยังคงป้องกันค่าที่ไม่ถูกต้องก่อนที่จะดำเนินการตามวิธีการที่ฉันกำลังดำเนินการแม้ว่ามันควรจะผ่าน
ข้อสรุปของฉันจากคำตอบทั้งหมด (อย่าลังเลที่จะมาหาคุณ):
ยืนยันเมื่อ- วิธีนี้แสดงให้เห็นว่ามีพฤติกรรมที่ไม่เหมาะสมในอดีต
- วิธีการมาจากแหล่งที่ไม่น่าเชื่อถือ
- วิธีการนี้ใช้จากที่อื่นและไม่ได้ระบุอย่างชัดเจนว่าเป็นเงื่อนไขภายหลัง
- วิธีนี้อาศัยอยู่ใกล้คุณมาก (ดูคำตอบที่เลือกเพื่อรับรายละเอียด)
- วิธีการกำหนดสัญญาอย่างชัดเจนกับสิ่งที่ต้องการเอกสารที่เหมาะสมพิมพ์ความปลอดภัยการทดสอบหน่วยหรือการตรวจสอบหลังเงื่อนไข
- ประสิทธิภาพเป็นสิ่งสำคัญ (ในกรณีนี้การยืนยันโหมดการดีบักอาจทำงานเป็นวิธีการแบบผสม)
Null
) มันอาจจะมีปัญหาอย่างเท่าเทียมกันถ้ามีชื่อเป็น""
(ไม่เป็นโมฆะ แต่สตริงว่างเปล่า) "N/A"
หรือ ไม่ว่าคุณจะเชื่อผลได้หรือไม่ก็ต้องหวาดระแวงอย่างเหมาะสม