На новій роботі я отримував позначення в кодах оглядів такого коду:
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
та нічого не робити - це лише спосіб перенести помилку на виконання виконання, що ускладнює відстеження до джерела.