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

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

Объект Person имеет свойство, скажем, Name типа String. Если имя неизвестно, то в C# Name имеет значение null.

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


person Andrew Bingham    schedule 09.02.2016    source источник
comment
C# также имеет лучший способ работы с null; Типы типа Optional/Maybe, шаблон Null-object и т. д. Они, конечно, не очень широко используются, но они существуют. Вы можете сделать то же самое в Eiffel, хотя я недостаточно знаю об этом, чтобы сказать вам, какой именно вариант они предпочитают.   -  person Cubic    schedule 09.02.2016
comment
@Cubic Не могли бы вы уточнить решение C # для работы с нулем?   -  person Emmanuel Stapf    schedule 10.02.2016
comment
Не в рамках комментария. Просто просмотрите термины, которые я описал в предыдущих комментариях, и вы обязательно найдете что-нибудь полезное.   -  person Cubic    schedule 10.02.2016


Ответы (1)


Eiffel допускает void значений (null в C#). Однако он гарантирует, что никогда не будет вызова пустой цели (т. Е. Нет NullReferenceException). Это обеспечивается во время компиляции за счет использования системы типов, дополненной attached/detachable понятием типа, и набора специальных правил безопасности, которые гарантируют, что любое выражение присоединенного типа всегда будет присоединено к объекту при запуске. -time (т.е. никогда не 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, для этого он и предназначен, поэтому обычно нет необходимости в специальном тип.

person Alexander Kogtenkov    schedule 09.02.2016
comment
Спасибо. Это подталкивает проблему Null во время выполнения к тому, откуда берутся значения свойств. (Как правило, база данных) TBW Что поднимает связанный (но не по теме) вопрос о том, почему большинство баз данных допускают null.. - person Andrew Bingham; 10.02.2016