null การใช้งานขึ้นอยู่กับการใช้งาน / ภาษา
ในที่สุดตัวเลือกว่าจะใช้หรือไม่nullเป็นค่าแอปพลิเคชันที่ถูกต้องนั้นส่วนใหญ่จะถูกกำหนดโดยแอปพลิเคชันของคุณและภาษาการเขียนโปรแกรม / อินเตอร์เฟส / ขอบ
ในระดับพื้นฐานฉันขอแนะนำให้พยายามใช้ประเภทที่แตกต่างหากมีคลาสที่แตกต่างกันของค่า nullอาจเป็นตัวเลือกหากอินเทอร์เฟซของคุณอนุญาตและมีเพียงสองคลาสของคุณสมบัติที่คุณพยายามแสดง การข้ามคุณสมบัติอาจเป็นตัวเลือกหากส่วนต่อประสานหรือรูปแบบของคุณอนุญาต ประเภทรวมใหม่ (คลาส, วัตถุ, ประเภทข้อความ) อาจเป็นตัวเลือกอื่น
สำหรับตัวอย่างสตริงของคุณหากนี่เป็นภาษาการเขียนโปรแกรมฉันจะถามคำถามสองสามข้อกับตัวเอง
- ฉันวางแผนที่จะเพิ่มค่าในอนาคตหรือไม่? ถ้าเป็นเช่น
Optionนั้นอาจจะดีกว่าสำหรับการออกแบบส่วนต่อประสานของคุณ
- เมื่อใดที่ฉันต้องตรวจสอบความถูกต้องของการโทร Statically? แบบไดนามิกได้อย่างไร ก่อน? หลังจาก? ที่ทั้งหมดหรือไม่ หากภาษาการเขียนโปรแกรมของคุณรองรับให้ใช้ประโยชน์ของการพิมพ์แบบสแตติกเนื่องจากจะช่วยหลีกเลี่ยงจำนวนรหัสที่คุณต้องสร้างเพื่อการตรวจสอบความถูกต้อง
Optionอาจกรอกข้อมูลในกรณีนี้ให้ดีที่สุดหากสตริงของคุณไม่สามารถยกเลิกได้ อย่างไรก็ตามคุณอาจจะต้องตรวจสอบอินพุตของผู้ใช้เพื่อหาnullค่าสตริงต่อไปดังนั้นฉันอาจจะเลื่อนกลับไปที่บรรทัดแรกของการตั้งคำถาม: ฉันจะแสดงค่าจำนวนเท่าใด
- เป็น
nullตัวบ่งชี้ของข้อผิดพลาดโปรแกรมเมอร์ในการเขียนโปรแกรมภาษาของฉันได้อย่างไร น่าเสียดายที่nullมักเป็นค่าเริ่มต้นสำหรับพอยน์เตอร์หรือการอ้างอิงที่ไม่ได้กำหนดค่าเริ่มต้น (หรือไม่ได้กำหนดไว้อย่างชัดเจน) ในบางภาษา คือnullเป็นค่าที่ยอมรับเป็นค่าเริ่มต้นหรือไม่ มีความปลอดภัยเป็นค่าเริ่มต้นหรือไม่ บางครั้งnullบ่งบอกถึงค่าที่ได้รับการจัดสรร ฉันควรให้ตัวบ่งชี้การจัดการหน่วยความจำที่อาจเกิดขึ้นหรือปัญหาการเริ่มต้นในโปรแกรมของพวกเขาให้กับผู้ใช้อินเทอร์เฟซของฉันหรือไม่ โหมดความล้มเหลวของการโทรดังกล่าวเมื่อเผชิญกับปัญหาดังกล่าวคืออะไร ผู้โทรอยู่ในกระบวนการหรือเธรดเดียวกันกับฉันหรือไม่เพื่อให้ข้อผิดพลาดดังกล่าวมีความเสี่ยงสูงต่อแอปพลิเคชันของฉัน
ขึ้นอยู่กับคำตอบของคำถามเหล่านี้คุณอาจสามารถพูดได้ว่าnullอินเทอร์เฟซของคุณเหมาะสมหรือไม่
ตัวอย่างที่ 1
- ใบสมัครของคุณมีความสำคัญอย่างยิ่งต่อความปลอดภัย
- คุณกำลังใช้การกำหนดค่าเริ่มต้นฮีปบางประเภทเมื่อเริ่มต้นและ
nullเป็นค่าสตริงที่เป็นไปได้ที่ส่งกลับเมื่อความล้มเหลวในการจัดสรรพื้นที่สำหรับสตริง
- มีความเป็นไปได้ที่สตริงดังกล่าวจะกระทบกับส่วนต่อประสานของคุณ
คำตอบ: nullอาจไม่เหมาะสม
เหตุผล: nullในกรณีนี้ใช้เพื่อระบุค่าสองประเภทที่แตกต่างกัน ครั้งแรกอาจเป็นค่าเริ่มต้นซึ่งผู้ใช้อินเทอร์เฟซของคุณอาจต้องการตั้งค่า น่าเสียดายที่ค่าที่สองคือการตั้งค่าสถานะเพื่อระบุว่าระบบของคุณทำงานไม่ถูกต้อง ในกรณีเช่นนี้คุณอาจต้องการล้มเหลวอย่างปลอดภัยที่สุดเท่าที่จะเป็นไปได้ (สิ่งใดก็ตามที่มีความหมายต่อระบบของคุณ)
ตัวอย่างที่ 2
- คุณกำลังใช้โครงสร้าง C ซึ่งมี
char *สมาชิก
- ระบบของคุณไม่ใช้การจัดสรรฮีปและคุณใช้การตรวจสอบ MISRA
- อินเทอร์เฟซของคุณยอมรับโครงสร้างนี้เป็นตัวชี้และตรวจสอบเพื่อให้แน่ใจว่าโครงสร้างไม่ได้ชี้ไปที่
NULL
- ค่าเริ่มต้นและค่าที่ปลอดภัยของ
char *สมาชิกสำหรับ API ของคุณสามารถระบุได้ด้วยค่าเดียวคือNULL
- เมื่อเริ่มต้นโครงสร้างของผู้ใช้ของคุณคุณต้องการให้ผู้ใช้มีความเป็นไปได้ที่จะไม่เริ่ม
char *สมาชิกอย่างชัดเจน
คำตอบ: NULLอาจเหมาะสม
เหตุผล: มีโอกาสเล็กน้อยที่โครงสร้างของคุณจะผ่านการNULLตรวจสอบ แต่ไม่ได้กำหนดค่าเริ่มต้น อย่างไรก็ตาม API ของคุณอาจไม่สามารถอธิบายสิ่งนี้ได้เว้นแต่ว่าคุณจะมีการตรวจสอบบางอย่างเกี่ยวกับค่า struct และ / หรือการตรวจสอบช่วงของที่อยู่ของ struct MISRA-C linters อาจช่วยให้ผู้ใช้ API ของคุณโดยการตั้งค่าสถานะการใช้งานของ structs ก่อนเริ่มต้น อย่างไรก็ตามสำหรับchar *สมาชิกหากตัวชี้ไปยังจุดโครงสร้างไปยังโครงสร้างเริ่มต้นNULLเป็นค่าเริ่มต้นของสมาชิกที่ไม่ได้ระบุในการเริ่มต้น struct ดังนั้นNULLอาจทำหน้าที่เป็นค่าเริ่มต้นที่ปลอดภัยสำหรับchar *สมาชิก struct ในแอปพลิเคชันของคุณ
ถ้ามันอยู่ในอินเตอร์เฟสการทำให้เป็นอนุกรมฉันจะถามตัวเองด้วยคำถามต่อไปนี้ว่าจะใช้ null ในสตริงหรือไม่
- เป็น
nullตัวบ่งชี้ของข้อผิดพลาดด้านลูกค้าที่มีศักยภาพ? สำหรับ JSON ใน JavaScript สิ่งนี้อาจnullไม่เป็นข้อบ่งชี้ถึงความล้มเหลวในการจัดสรร ในจาวาสคริปต์มันถูกใช้เป็นตัวบ่งชี้อย่างชัดเจนว่าไม่มีวัตถุจากการอ้างอิงที่จะตั้งปัญหา อย่างไรก็ตามมีตัวแยกวิเคราะห์ที่ไม่ใช่ javascript และ serializers ที่แมป JSON nullนั้นเป็นnullชนิดเนทีฟ หากเป็นกรณีนี้สิ่งนี้จะเป็นการอภิปรายว่าnullการใช้งานแบบเนทีฟนั้นใช้ได้หรือไม่สำหรับภาษาเฉพาะของคุณตัวแยกวิเคราะห์และตัวรวมกันซีเรียลไลเซอร์
- การไม่มีค่าคุณสมบัติอย่างชัดเจนส่งผลกระทบมากกว่าค่าคุณสมบัติเดียวหรือไม่ บางครั้งก
nullแสดงว่าคุณมีชนิดข้อความใหม่ทั้งหมด มันอาจจะสะอาดกว่าสำหรับผู้บริโภคในรูปแบบการทำให้เป็นอนุกรมเพื่อระบุประเภทข้อความที่แตกต่างอย่างสิ้นเชิง สิ่งนี้ทำให้มั่นใจได้ว่าการตรวจสอบความถูกต้องและตรรกะของแอปพลิเคชันสามารถแยกได้อย่างชัดเจนระหว่างข้อความสองข้อความที่เว็บอินเตอร์เฟสของคุณมีให้
คำแนะนำทั่วไป
nullไม่สามารถเป็นค่าบนขอบหรืออินเทอร์เฟซที่ไม่รองรับ หากคุณกำลังใช้บางสิ่งบางอย่างที่หลวมอย่างเป็นธรรมชาติในการพิมพ์ค่าของคุณสมบัติ (เช่น JSON) ให้ลองดันสคีมาหรือตรวจสอบความถูกต้องของซอฟต์แวร์ Edge ของผู้บริโภค (เช่นJSON Schema ) หากทำได้ ถ้าเป็นภาษาการเขียนโปรแกรม API ตรวจสอบผู้ใช้ป้อนแบบคงที่ถ้าเป็นไปได้ (ผ่านการพิมพ์) หรือดังเท่าที่จะเหมาะสมในการรันไทม์ (aka ฝึกการเขียนโปรแกรมการป้องกันในการเชื่อมต่อของผู้บริโภคที่หันหน้าไปทาง) ที่สำคัญเอกสารหรือกำหนดขอบจึงไม่มีคำถามว่า:
- ทรัพย์สินประเภทใดมีมูลค่าที่ยอมรับได้
- ช่วงของค่าใดที่ถูกต้องสำหรับคุณสมบัติที่ระบุ
- วิธีการรวมประเภทควรมีโครงสร้าง คุณสมบัติใดที่ต้อง / ควร / สามารถนำเสนอในรูปแบบรวม?
- ถ้าเป็นคอนเทนเนอร์ประเภทใดมีกี่รายการที่สามารถหรือควรเก็บคอนเทนเนอร์และประเภทของค่าที่เก็บคอนเทนเนอร์คืออะไร
- คำสั่งใดถ้ามีคุณสมบัติหรืออินสแตนซ์ของชนิดคอนเทนเนอร์หรือการรวมที่ส่งคืน
- มีผลข้างเคียงอะไรบ้างในการตั้งค่าเฉพาะและผลข้างเคียงของการอ่านค่าเหล่านั้นคืออะไร?