Я не фанат термина "защитное программирование". Для меня это предлагает код, подобный этому:
void MakePayment( Account * a, const Payment * p ) {
if ( a == 0 || p == 0 ) {
return;
}
// payment logic here
}
Это неправильно, неправильно, неправильно, но я, наверное, видел это сотни раз. Эта функция никогда не должна была вызываться с нулевыми указателями, и совершенно неправильно их принимать.
Правильный подход здесь является спорным, но минимальное решение состоит в том, чтобы шумно провалиться, либо используя assert, либо выдав исключение.
Редактировать: Я не согласен с некоторыми другими ответами и комментариями здесь - я не думаю, что все функции должны проверять свои параметры (для многих функций это просто невозможно). Вместо этого я считаю, что все функции должны документировать приемлемые значения и указывать, что другие значения приведут к неопределенному поведению. Именно такой подход используют самые успешные и широко используемые библиотеки из когда-либо написанных - стандартные библиотеки C и C ++.
А теперь пусть начнутся отрицательные голоса ...