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 ฝึกการเขียนโปรแกรมการป้องกันในการเชื่อมต่อของผู้บริโภคที่หันหน้าไปทาง) ที่สำคัญเอกสารหรือกำหนดขอบจึงไม่มีคำถามว่า:
- ทรัพย์สินประเภทใดมีมูลค่าที่ยอมรับได้
- ช่วงของค่าใดที่ถูกต้องสำหรับคุณสมบัติที่ระบุ
- วิธีการรวมประเภทควรมีโครงสร้าง คุณสมบัติใดที่ต้อง / ควร / สามารถนำเสนอในรูปแบบรวม?
- ถ้าเป็นคอนเทนเนอร์ประเภทใดมีกี่รายการที่สามารถหรือควรเก็บคอนเทนเนอร์และประเภทของค่าที่เก็บคอนเทนเนอร์คืออะไร
- คำสั่งใดถ้ามีคุณสมบัติหรืออินสแตนซ์ของชนิดคอนเทนเนอร์หรือการรวมที่ส่งคืน
- มีผลข้างเคียงอะไรบ้างในการตั้งค่าเฉพาะและผลข้างเคียงของการอ่านค่าเหล่านั้นคืออะไร?