Сегодня я (еще раз) разыменовал свойство неопределенного объекта, вызывающее впечатляющий сбой нашего сервера. Решение проблемы: писать одну из моих самых нелюбимых частей шаблонного кода, превращаяПочему разыменование не предназначено для безопасности?
if (foo.bar.baz.id) {...
в
if (foo && foo.bar && foo.bar.baz && foo.bar.baz.id) {...
потому что baz
оказался в краевом случае null
и это вызывает исключение ,
Так что мой вопрос: почему разыменовывает null/undefined такую проблему? Почему не foo.bar.baz.something
просто безопасно вернуть undefined
, когда foo
/bar
/baz
не определены? Я понимаю технические почему, и меня интересует язык Почему? Существуют ли языки, которые имеют безопасное разыменование? Есть ли реальная причина CS, почему нет, или это просто традиция (унаследованная форма C и ее старые друзья)?
Я могу придумать одну причину, которая заключается в том, что с большей логикой «проверки типов» в действии, которое так же часто выполняется как разыменование, может немного замедлить язык. Но потом я также думаю, что большую часть проблемы можно решить, имея правильную обработку исключений в операторах присваивания/if/итак, так что разыменование может просто продолжаться равно, а операторы «более высокого уровня» позаботятся о случайных "oopises".
Еще одна причина, по которой я могу думать, состоит в том, что это просто слишком много из упрямый решение для языкового дизайна для реализации своего рода правила, установленного для решения этой проблемы.
Я был бы очень признателен, если бы кто-нибудь из CS не пролил свет на эту проблему.
Первое, что приходит в голову - проблемы с производительностью: если доступ к полю элемента неявно подтвержден, что все содержащие объекты действительны, тогда ООП будет по своей сути медленнее по сравнению с программированием, отличным от OO (если значение одного поля вычисляется из двух других полей, то действительность всего объекта будет проверяться минимум три раза). Хотя это может быть оптимизировано (только проверяя действительность объекта один раз за операцию, если, например, не используется «volatile» или эквивалент языка, не все компиляторы одинаково квалифицированы для оптимизации. –
* «Существуют ли языки с безопасным разыменованием?» * - Да, [Цель-C] (http://stackoverflow.com/a/2696909/1402846). – Pang