Вместо того, чтобы прямо заявлять, что обнуляемые типы являются злом, я бы сказал: большинство языков прививают обнуляемость целым типам типов, когда эти два понятия действительно должны быть ортогональными .
Например, все не примитивные типы Java (и все ссылочные типы C #) обнуляются. Зачем? Мы можем идти вперед и назад, но в конечном итоге я держу пари, что ответ сводится к «это было легко». Нет ничего присущего языку Java, который требует повсеместного обнуления. Ссылки на C ++ предлагают прекрасный пример того, как изгнать нули на уровне компилятора. Конечно, C ++ имеет гораздо более отвратительный синтаксис, чем Java явно пыталась сократить, поэтому некоторые хорошие функции оказались на переднем крае наряду с плохими.
Типы значений Nullable в C # 2.0 предлагали шаг в правильном направлении - отделение Nullability от несвязанной семантики типов или, что еще хуже, деталей реализации CLR - но все еще отсутствует способ сделать обратное с ссылочными типами. (Контракты кода хороши и все, но они не встроены в систему типов, как мы здесь обсуждаем.)
Множество функциональных или иным образом неясных языков поняли эти понятия "прямо" с самого начала ... но если бы они широко использовались, мы бы не обсуждали это ...
Чтобы ответить на ваш вопрос: запрещать нули на современном языке, оптом, было бы так же глупо, как и так называемая «ошибка в миллиард долларов». Существуют допустимые программные конструкции, в которых хорошо иметь нулевые значения: необязательные параметры, любые виды вычислений по умолчанию / резервные значения, когда оператор объединения приводит к лаконичному коду, взаимодействию с реляционными базами данных и т. Д. Принудительное использование значений часовых, NaN и т. Д «лечение» гораздо хуже, чем болезнь.
Тем не менее, я предварительно согласен с настроением , выраженным в цитате, до тех пор, пока я могу уточнить, чтобы соответствовать моему собственному опыту:
- Количество ситуаций, в которых нулевые значения желательны, меньше, чем думает большинство людей
- как только вы вводите пустые значения в библиотеку или путь кода, от них намного сложнее избавиться, чем от их добавления. (поэтому не позволяйте младшим программистам делать это по прихоти!)
- Шкала ошибок с переменным временем жизни
- соответствует # 3: ранний сбой