В некоторых языках программирования (например, C #, Javascript) меня больше всего беспокоит то, что попытка получить доступ к свойству null
вызывает ошибку или исключение.
Например, в следующем фрагменте кода,
foo = bar.baz;
, если bar null
, C # выдаст неприятный NullReferenceException
, и мой интерпретатор Javascript будет жаловаться на Unable to get value of the property 'baz': object is null or undefined
.
Теоретически я могу это понять, но в реальном коде у меня часто бывают более глубокие объекты, такие как
foo.bar.baz.qux
и если любое из значений foo
, bar
или baz
равно нулю, мои коды не работают. :( Кроме того, если я оцениваю следующие выражения в консоли, результаты могут быть противоречивыми:
true.toString() //evaluates to "true"
false.toString() //evaluates to "false"
null.toString() //should evaluate to "null", but interpreter spits in your face instead
Я абсолютно презираю пишу код для решения этой проблемы, потому что это всегда многословный, вонючий код. Следующие примеры не являются надуманными, я взял их из одного из моих проектов (первый в Javascript, второй в C #):
if (!(solvedPuzzles &&
solvedPuzzles[difficulty] &&
solvedPuzzles[difficulty][index])) {
return undefined;
}
return solvedPuzzles[difficulty][index].star
и
if (context != null &&
context.Request != null &&
context.Request.Cookies != null &&
context.Request.Cookies["SessionID"] != null)
{
SessionID = context.Request.Cookies["SessionID"].Value;
}
else
{
SessionID = null;
}
Все было бы намного проще, если бы все выражение возвращало null
, если какое-либо из свойств было бы нулевым. Приведенные выше примеры кода могли бы быть намного проще:
return solvedPuzzles[difficulty][index].star;
//Will return null if solvedPuzzles, difficulty, index, or star is null.
SessionID = context.Request.Cookies["SessionID"].Value;
//SessionID will be null if the context, Request, Cookies,
//Cookies["SessionID"], or Value is null.
Есть что-то, что я пропускаю? Почему эти языки не используют это поведение вместо ? Это сложно реализовать по какой-то причине? Это вызовет проблемы, которые я пропускаю?