Eiffel избегает ВСЕХ нулей?

Я на самом деле использую C# - но вопрос о Nulls возник на локальном сайте группы разработчиков (Chester Devs, UK) о проблемах с нулями

У объекта Person есть свойство, скажем, Name, типа String. Если имя неизвестно, то в C# имя равно NULL.

Есть ли у Eiffel лучший способ, чем C# (если x равен нулю...), справиться с этой общей динамической пустотой?

1 ответ

Эйфелева позволяет void ценности (null в C#). Однако он гарантирует, что никогда не будет вызова на пустую цель (то есть, нет NullReferenceException). Это обеспечивается во время компиляции, полагаясь на систему типов, которая дополнена attached/detachable понятие типа и набора специальных правил безопасности void, которые гарантируют, что любое выражение присоединенного типа всегда присоединяется к объекту во время выполнения (то есть никогда null).

В вашем примере объявление класса будет выглядеть

class PERSON ... feature
   name: detachable STRING
end

Тогда в коде его можно использовать как

p: PERSON
a: STRING
d: detachable STRING
...
d := p.name -- OK
a := p.name -- This is not allowed, because `a' is of an attached type.
if attached p.name as q then
   a := q -- OK
   ... -- Both `q' and `a' are equal to `p.name' and are attached.
else
   ... -- The name is `void', do something else.
end

Может быть возможно иметь OPTION введите и положитесь на него, когда какое-либо значение может присутствовать или отсутствовать, но отсутствие значения естественно представляется voidэто то, для чего он предназначен, поэтому обычно нет особого нужды в специальном типе.

Другие вопросы по тегам