[en] Самая ужасная ошибка в истории Computer Science

en
#1

I call it my billion-dollar mistake…At that time, I was designing the first comprehensive type system for references in an object-oriented language. My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn’t resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.
– Tony Hoare, inventor of ALGOL W.

#2

В TS эту проблему адресуют с помощью настройки strictNullChecks https://www.typescriptlang.org/docs/handbook/compiler-options.html. На практике писать все проверки на null очень муторно, но нужно. Так что рекомендую всем начинающим новый проект включать эту настройку, но быть готовым платить цену строками кода.

В Dart, например, есть специальные операторы которые работают с null. Код в сумме выглядит чище

#3

Есть еще монады, в которых значение - это некоторый контейнер, и когда получаешь значение, еще указываешь что делат в случае значения null

Maybe.of(undefined)
  .map(value => value * 2)
  .map(value => value * value)
  .getOrElse(0) === 0 // true

Maybe.of(2)
  .map(value => value * 2)
  .map(value => value * value)
  .getOrElse(0) === 16 // true
1 Like
#4

Интересный, но сложный для понимания материал. Тут надо хорошее знание английского, еще и дорости до понимания необходимости “монад”, проверок на null.

@dmitry пользуясь случаем хочу спросить: как называется такой подход (или термин) и в целом насколько уместно его использовать?

let a;
let b = ((a || {}).c || {}).d || {};
#5

Не знаю названия. Код пытается решить ту же проблему, которая описана в топике: взять значение у чего-то что может быть null-ом.

#6

Как на счёт Elvis operator? ^_^