Вы можете и, вероятно, должны проектировать с учетом null
. Например, в вашей проблемной области, когда имеет смысл для методов класса возвращать null
? Когда имеет смысл вызывать функции с аргументами null
?
В общем, полезно, если возможно, удалять null
ссылки из кода. Другими словами, вы можете запрограммировать на инвариант, что «здесь здесь не будет нуля ... или там». Это имеет много преимуществ. Вам не придется обфускать код, обертывая методы в deref_or_throw
. Вы можете получить больше семантического значения из кода, потому что, как часто вещи null
в реальном мире? Ваш код может быть более читаемым, если вы используете исключения для указания ошибок, а не null
. И, наконец, вы уменьшаете необходимость в проверке ошибок, а также уменьшаете риск ошибок времени выполнения (разыгрывание ужасных нулевых указателей).
Если ваша система не была разработана с null
случаев в виду, я бы сказал, что лучше оставить его в покое и не сходят с ума оборачивать все с deref_or_throw
. Возможно, возьмите подход Agile. Когда вы кодируете, проверьте контракты, которые предлагают объекты класса в качестве сервисов. Как часто можно ожидать, что эти контракты будут возвращены null
? Что такое семантическое значение null
в этих случаях?
Возможно, вы могли бы идентифицировать классы в своей системе, от которых можно было бы ожидать разумного возврата null
. Для этих классов null
может быть действительной бизнес-логикой, а не бахромой, которая указывает на ошибки реализации. Для классов, которые, как ожидается, будут возвращены null
, дополнительная проверка может стоить безопасности. В этом смысле проверка на null
больше похожа на бизнес-логику, а не на детали реализации низкого уровня. Однако, несмотря на то, что систематическое обертывание всех указаний в deref_or_throw
может быть излечением, которое является его собственным ядом.
Есть ли вообще код, который действительно имеет дело с делом «nullptr»? Например. что-нибудь вроде 'if (! obj) {std :: cout <<« Нуль, но все равно, переходите к чему-то значимому \ n "; } else {std :: cout << "Non-Null, что-то другое \ n"; } '. Или это случай «nullptr» всегда «выход», потому что это неправильно? -path? – stefan
Этот код существует, но встречается редко. В большинстве случаев мы просто не можем продолжать. Мы ничего не можем сделать. Вся рутина не имеет смысла. Так что, возможно, существование этого объекта является _precondition_? И мне нужно проверить это, а затем вручную разыменовать указатель, не беспокоясь? – Mikhail
Именно это вам нужно уточнить для себя, имхо. Если это предварительное условие, возможно, 'assert'ion лучше подходит. В противном случае это явно исключительная вещь (0,01% является довольно исключительной), поэтому «исключение» является подходящим. Афаик, в библиотеке нет такой вещи. – stefan