为什么我们没有两个空值?

ajl*_*ane 31 null programming-languages

我常常想知道为什么null代表"没有价值"的语言不能区分被动的"我不知道它的价值是什么"和更加自信的"没有价值"..

有几种情况我喜欢区分这两者(特别是在使用用户输入和数据库时).

我想下面,我们两人的名字的状态unknownnull:

var apple;

while (apple is unknown)
{
    askForApple();
}

if (apple is null)
{
    sulk();
}
else
{
    eatApple(apple);
}
Run Code Online (Sandbox Code Playgroud)

显然,我们可以通过手动存储其他地方的状态来避开它,但我们也可以为空值做到这一点.

所以,如果我们能有一个null,为什么我们不能有两个呢?

Avi*_*Avi 39

我们有一个 null 还不够糟糕吗?

  • 这有关系吗?http://www.qconlondon.com/london-2009/presentation/Null+References:+The+Billion+Dollar+Mistake"我称之为十亿美元的错误.这是1965年空引用的发明." (5认同)
  • 因为null不是类型的适当值。如果我有一个Car类型的变量,我希望能够调用car.drive()而不必担心它实际上根本不是一辆汽车。其他状态应该在其他变量中。 (2认同)

kgi*_*kis 34

在大多数编程语言中,null表示"空"或"未定义".另一方面,"未知"是不同的.本质上,"未知"描述了对象的状态.这个状态必须来自你程序中的某个地方.

看看Null对象模式.它可以帮助您实现您想要实现的目标.


dda*_*daa 34

在我的编程中,我最近采用了区分"language null"和"domain null"的做法.

"语言空"是编程语言提供的特殊值,用于表示变量具有"无值".它需要作为数据结构,参数列表和返回值中的虚拟值.

"域null"是实现NullObject设计模式的任意数量的对象.实际上,每个域上下文都有一个不同的域null.

程序员使用null作为catch-all域null是相当常见的,但我发现它往往使代码更具程序性(更少面向对象)并且更难以辨别.

每次想要一个null,问问自己:语言是null还是域null?


teh*_*van 11

javascript实际上有null和undefined(http://www.w3schools.com/jsref/jsref_undefined.asp),但许多其他语言都没有.


mar*_*jne 11

如果您需要这样的东西,很少会创建一个表示未知的静态常量.

var apple = Apple.Unknown;
while (apple == Apple.Unknown) {} // etc
Run Code Online (Sandbox Code Playgroud)


var*_*tec 7

存在价值:

  • 蟒蛇: vars().has_key('variableName')
  • PHP: isset(variable)
  • JavaScript的: typeof(variable) != 'undefined'
  • Perl:(variable != undef)或者如果你愿意:(defined variable)

当然,当变量未定义时,它不是NULL