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
это то, для чего он предназначен, поэтому обычно нет особого нужды в специальном типе.