Термин «Ошибка на миллиард долларов» (
The Billion Dollar Mistake) был введён Тони Хоаром (Tony Hoare), создателем NULL, который в 2009 году на конференции признался, что введение NULL было его крупнейшей ошибкой. Название связано с тем, что NULL стал причиной множества багов, сбоев в программах и уязвимостей, что привело к огромным финансовым потерям в индустрии.🚩Какие проблемы вызывает `NULL`?
🟠NullPointerException (NPE) и аварийные сбои
- Попытка вызвать метод у
NULL приводит к ошибке NullPointerException в Java, NullReferenceException в C# и аналогичным сбоям в других языках.- Это одна из самых распространённых ошибок в программировании.
🟠Дополнительные проверки и сложность кода
- Из-за
NULL приходится постоянно писать проверки if (x != null), что раздувает код и делает его менее читаемым.- Если забыть такую проверку, можно получить неожиданный сбой.
🟠Слабая типизация и отсутствие явности
-
NULL можно передавать в любую функцию или объект, что ломает строгую типизацию.- Код становится менее предсказуемым.
🟠Проблемы с базами данных
-
NULL в SQL ведёт себя неинтуитивно (NULL != NULL, сравнение может давать UNKNOWN).- Может приводить к некорректным вычислениям в агрегатных функциях.
🟠Уязвимости в безопасности
- Некоторые атаки используют
NULL для взлома систем (например, null dereference в C/C++ может привести к DoS-атаке).-
NULL может скрывать ошибки и приводить к утечке данных.🚩Какие альтернативы `NULL`?
🟠Optional / Maybe (Java, Kotlin, Haskell, Rust)
- Использование обёрток вроде
Optional<T> (Java) или Option<T> (Rust) позволяет явно указывать возможность отсутствия значения.🟠Исключения вместо `NULL` (C# и Java)
- Вместо возврата
NULL можно выбрасывать осмысленные исключения (IllegalArgumentException, NotFoundException).🟠Специальные значения по умолчанию
- Вместо
NULL можно использовать дефолтные объекты (EmptyList, GuestUser и т. д.).🟠Типы-юнит (Tagged Union) в функциональных языках
- Например, в Haskell и Rust применяют
Either<T, E>, Option<T>, что делает обработку NULL-подобных случаев более явной.Ставь 👍 и забирай 📚 Базу знаний