ในความคิดของฉันมีความแตกต่างระหว่างการคืนค่า NULL คืนผลลัพธ์เปล่าบางอย่าง (เช่นสตริงว่างหรือรายการว่าง) และส่งข้อยกเว้น
ฉันมักจะใช้วิธีการดังต่อไปนี้ ฉันพิจารณาฟังก์ชั่นหรือวิธีการ f (v1, ... , vn) การโทรเป็นแอปพลิเคชันของฟังก์ชั่น
f : S x T1 x ... x Tn -> T
โดยที่ S คือ "สถานะของโลก" T1, ... , Tn เป็นประเภทของพารามิเตอร์อินพุตและ T คือชนิดส่งคืน
ฉันพยายามกำหนดฟังก์ชั่นนี้ก่อน ถ้าฟังก์ชั่นเป็นบางส่วน (เช่นมีค่าอินพุตบางอย่างที่ไม่ได้กำหนดไว้) ฉันกลับ NULL เพื่อส่งสัญญาณนี้ นี่เป็นเพราะฉันต้องการให้การคำนวณสิ้นสุดลงตามปกติและบอกฉันว่าฟังก์ชั่นที่ฉันร้องขอไม่ได้ถูกกำหนดไว้ในอินพุตที่กำหนด การใช้เช่นสตริงว่างเปล่าเป็นค่าส่งคืนนั้นคลุมเครือเพราะอาจเป็นไปได้ว่าฟังก์ชันถูกกำหนดไว้ในอินพุตและสตริงว่างเป็นผลลัพธ์ที่ถูกต้อง
ฉันคิดว่าการตรวจสอบพิเศษสำหรับตัวชี้ NULL ในรหัสการโทรเป็นสิ่งจำเป็นเพราะคุณใช้ฟังก์ชั่นบางส่วนและมันเป็นงานของวิธีการที่เรียกว่าจะบอกคุณว่าฟังก์ชั่นถ้าไม่ได้กำหนดไว้สำหรับการป้อนข้อมูลที่กำหนด
ฉันต้องการใช้ข้อยกเว้นสำหรับข้อผิดพลาดที่ไม่อนุญาตให้ดำเนินการคำนวณ (เช่นไม่สามารถหาคำตอบได้)
ตัวอย่างเช่นสมมติว่าฉันมีลูกค้าระดับและฉันต้องการใช้วิธีการ
Customer findCustomer(String customerCode)
เพื่อค้นหาลูกค้าในฐานข้อมูลแอปพลิเคชันด้วยรหัส ในวิธีนี้ฉันจะ
- ส่งคืนออบเจ็กต์ของลูกค้าระดับถ้าแบบสอบถามประสบความสำเร็จ
- ส่งคืน null ถ้าแบบสอบถามไม่พบลูกค้าใด ๆ
- ส่งข้อยกเว้นหากไม่สามารถเชื่อมต่อกับฐานข้อมูลได้
การตรวจสอบพิเศษสำหรับโมฆะเช่น
Customer customer = findCustomer("...");
if (customer != null && customer.getOrders() > 0)
{
...
}
เป็นส่วนหนึ่งของความหมายของสิ่งที่ฉันกำลังทำและฉันจะไม่เพียง "ข้ามพวกเขา" เพื่อให้รหัสอ่านดีขึ้น ฉันไม่คิดว่ามันเป็นวิธีปฏิบัติที่ดีในการลดความซับซ้อนของปัญหาในมือเพื่อลดความซับซ้อนของรหัส
แน่นอนเนื่องจากการตรวจสอบโมฆะเกิดขึ้นบ่อยมากมันจะดีถ้าภาษารองรับไวยากรณ์พิเศษบางอย่างสำหรับมัน
ฉันจะพิจารณาใช้รูปแบบวัตถุ Null (ตามที่ Laf แนะนำ) ตราบใดที่ฉันสามารถแยกวัตถุว่างของคลาสจากวัตถุอื่นทั้งหมดได้