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

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.

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

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

Есть еще монады, в которых значение - это некоторый контейнер, и когда получаешь значение, еще указываешь что делат в случае значения 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 лайк

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

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

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

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

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

То что нужно. Интересно, работает ли он со свойствами (не только с методами). Говорю так потому что игрался с подобным оператором в dart, и оказалось что оператор не работает для свойств, только для вызова методов.

Ну сейчас он вообще не работает 😅 Это ведь только proposal. Но то как описано, то должен

Мне тоже показалось из описания (читал не сильно внимательно) что должен работать. Мне нравится это конкретное направление движения. Очень не хватает подобной штуки.

Как всегда, на любой пропозал есть плагин Babel :)