Вы можете и, вероятно, должны проектировать с учетом null
случаев. Например, в вашей проблемной области, когда имеет смысл, чтобы методы класса возвращали null
? Когда имеет смысл вызывать функции с null
аргументами?
Вообще говоря, может быть полезно удалить null
ссылки из кода, когда это возможно. Другими словами, вы можете запрограммировать инвариант, что "это не будет нулевым здесь... или там". Это имеет много преимуществ. Вам не придется запутывать код, заключая методы в deref_or_throw
. Вы можете добиться большего семантического значения от кода, потому что, как часто вещи null
в реальном мире? Ваш код может быть более читабельным, если вы используете исключения для обозначения ошибок, а не null
значений. И, наконец, вы уменьшаете потребность в проверке ошибок, а также снижаете риск ошибок во время выполнения (ужасное разыменование нулевого указателя).
Если ваша система не была разработана с учетом null
случаев, я бы сказал, что лучше оставить ее в покое и не сходить с ума, оборачивая все deref_or_throw
. Возможно, используйте Agile-подход. Во время написания кода проверяйте контракты, которые объекты вашего класса предлагают в качестве сервисов. Как часто разумно ожидать, что эти контракты будут возвращать null
? Каково семантическое значение null
в этих случаях?
Вероятно, вы могли бы определить классы в вашей системе, которые, как можно разумно ожидать, будут возвращать null
. Для этих классов null
может быть допустимой бизнес-логикой, а не случайными случаями, указывающими на ошибки реализации. Для классов, которые могут возвращать null
, дополнительная проверка может быть полезной. В этом смысле проверка null
больше похожа на бизнес-логику, чем на низкоуровневые детали реализации. Тем не менее, повсеместно систематическая обертка всех указателей в deref_or_throw
может быть лекарством, которое само по себе является ядом.
person
It's Your App LLC
schedule
18.03.2015
nullptr
случаем? Например. что-то вродеif ( !obj ) { std::cout << "Null, but still okay, moving on with something meaningful\n"; } else { std::cout << "Non-Null, doing something else\n"; }
. Или случайnullptr
всегда является выходом, потому что это неверный путь? - person stefan   schedule 18.03.2015assert
ion. В противном случае это явно исключительная вещь (0,01% довольно исключительная), поэтомуexception
подходит. Афаик, в библиотеке такого нет. - person stefan   schedule 18.03.2015auto *
? Я бы предложилauto
, но хотел подчеркнуть, что это указатель. Или, может быть, лучше,std::unique_ptr
с соответствующим удалением? Но если звонящий не несет ответственности за какие-либо решения о продолжительности жизни, то, вероятно, лучше всего будет использоватьauto &
. - person Andre Kostur   schedule 18.03.2015