На новій роботі я отримував позначення в кодах оглядів такого коду:
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, це вказує на помилку. Єдина причина, яку він передає в конструктор, - це те, що він PowerManagerможе бути перевірений з макетним IMsgSenderпідкласом.
ПІДСУМОК : На це питання було кілька справді чудових відповідей, дякую всім. Я прийняв цей від @aaronps головним чином завдяки його стислості. Здається, існує досить широка загальна згода, яка:
- Обслуговування
NULLохоронців для кожного окремо взятого вказівника надмірне, але - Ви можете перейти до всієї дискусії, використовуючи замість цього посилання (якщо можливо) або
constвказівник, і assertВисловлювання є більш освіченою альтернативоюNULLсторожам для перевірки того, чи виконуються передумови функції.
nullта нічого не робити - це лише спосіб перенести помилку на виконання виконання, що ускладнює відстеження до джерела.