【问题标题】:Does Eiffel avoid ALL nulls?Eiffel 是否避免所有空值?
【发布时间】:2016-02-09 11:54:27
【问题描述】:

我实际上正在使用 C# - 但是 Nulls 的问题出现在本地开发人员小组(英国 Chester Devs)社交网站上,关于 nulls 的问题

一个对象 Person 有一个属性,比如 Name,类型为 String 如果名称未知,则在 C# 中名称为空

Eiffel 有比 C#(如果 x 为 null ...)更好的方法来处理这种常见的动态 void 吗?

【问题讨论】:

  • C# 也有更好的方法来处理nullOptional/Maybe 类似类型、空对象模式等。它们当然没有被广泛使用,但它们确实存在。您可以在 Eiffel 中做类似的事情,尽管我对此了解的不够多,无法告诉您他们更喜欢哪个特定选项。
  • @Cubic 你能精确的 C# 解决方案来处理 null 吗?
  • 不在评论范围内。只需查看我在之前的 cmets 中概述的术语,您一定会发现 something 有用。

标签: null eiffel void-safety


【解决方案1】:

Eiffel 允许使用void 值(C# 中的null)。但是,它确保永远不会调用 void 目标(即,没有 NullReferenceException)。这是在编译时通过依赖于类型系统来确保的,该类型系统增加了attached/detachable 类型的概念以及一组特殊的 void-safety 规则,这些规则保证附加类型的任何表达式总是附加到运行时的对象(即永远不是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 表示,这就是它的设计目的,所以通常几乎不需要特殊类型。

【讨论】:

  • 谢谢。这将运行时的 Null 问题推向了属性值的来源。 (通常是数据库)TBW 这引发了为什么大多数数据库允许 null 的相关(但不是主题)问题..
猜你喜欢
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
相关资源
最近更新 更多