ในงานใหม่ฉันได้รับการตั้งค่าสถานะในการตรวจสอบรหัสสำหรับรหัสเช่นนี้:
PowerManager::PowerManager(IMsgSender* msgSender)
: msgSender_(msgSender) { }
void PowerManager::SignalShutdown()
{
msgSender_->sendMsg("shutdown()");
}
ฉันบอกว่าวิธีสุดท้ายควรอ่าน:
void PowerManager::SignalShutdown()
{
if (msgSender_) {
msgSender_->sendMsg("shutdown()");
}
}
นั่นคือฉันจะต้องใส่NULL
ยามรอบmsgSender_
ตัวแปรแม้ว่ามันจะเป็นข้อมูลส่วนตัว มันยากสำหรับฉันที่จะควบคุมตัวเองจากการใช้คำไม่สุภาพเพื่ออธิบายว่าฉันรู้สึกอย่างไรกับ 'ปัญญา' ชิ้นนี้ เมื่อฉันขอคำอธิบายฉันได้รับเรื่องราวสยองขวัญเกี่ยวกับวิธีการเขียนโปรแกรมจูเนียร์บางปีสับสนว่าชั้นเรียนควรจะทำงานอย่างไรและลบสมาชิกที่เขาไม่ควรมี (โดยไม่ตั้งใจ) และNULL
หลังจากนั้น เห็นได้ชัด) และสิ่งที่พัดขึ้นในด้านขวาหลังจากการเปิดตัวผลิตภัณฑ์และเราได้ "เรียนรู้วิธีที่ยากไว้วางใจเรา" ว่ามันจะดีกว่าที่จะเพียงแค่NULL
ตรวจสอบทุกอย่าง
สำหรับฉันแล้วมันให้ความรู้สึกเหมือนการเขียนโปรแกรมลัทธิคาร์โก้ง่ายและเรียบง่าย เพื่อนร่วมงานที่มีความหมายดีบางคนพยายามอย่างจริงจังที่จะช่วยฉัน 'เข้าใจ' และดูว่าสิ่งนี้จะช่วยให้ฉันเขียนรหัสที่มีประสิทธิภาพมากขึ้นได้อย่างไร แต่ ... ฉันไม่สามารถรู้สึกเหมือนพวกเขาเป็นคนที่ไม่ได้รับมัน .
มันสมเหตุสมผลสำหรับมาตรฐานการเข้ารหัสที่ต้องการให้ทุกตัวชี้เดียวที่ถูกอ้างถึงในฟังก์ชั่นถูกตรวจสอบNULL
ก่อน - แม้แต่สมาชิกข้อมูลส่วนตัว? (หมายเหตุ: เพื่อให้เป็นไปตามบริบทเราได้จัดทำอุปกรณ์อิเล็กทรอนิกส์สำหรับผู้บริโภคไม่ใช่ระบบควบคุมการจราจรทางอากาศหรือผลิตภัณฑ์ 'ความล้มเหลวเท่ากับคนตาย')
แก้ไข : ในตัวอย่างข้างต้นผู้msgSender_
ทำงานร่วมกันไม่จำเป็น หากเป็นNULL
ไปได้แสดงว่ามีข้อผิดพลาด เหตุผลเดียวที่ส่งผ่านไปยัง Constructor นั้นPowerManager
สามารถทดสอบได้ด้วยIMsgSender
คลาสย่อยจำลอง
สรุป : มีคำตอบที่ดีจริงๆสำหรับคำถามนี้ขอบคุณทุกคน ฉันยอมรับหนึ่งจาก @aaronps ส่วนใหญ่เนื่องจากความกะทัดรัด ดูเหมือนจะมีข้อตกลงทั่วไปที่ค่อนข้างกว้างว่า:
- การบังคับใช้
NULL
ยามสำหรับตัวชี้ที่ถูกอ้างถึงทุกตัวนั้นเป็นจำนวนมากเกินไป แต่ - คุณสามารถดำเนินการอภิปรายทั้งหมดโดยใช้การอ้างอิงแทน (ถ้าเป็นไปได้) หรือ
const
ตัวชี้และ assert
คำสั่งเป็นทางเลือกที่รู้แจ้งมากขึ้นNULL
สำหรับเจ้าหน้าที่เพื่อตรวจสอบว่ามีการปฏิบัติตามเงื่อนไขเบื้องต้นของฟังก์ชัน
null
และไม่ทำอะไรเลยเป็นเพียงวิธีการย้ายข้อบกพร่องในการดำเนินการลงทำให้ยากต่อการติดตามกลับไปยังแหล่งที่มา