Why don't we have two nulls?

后端 未结 27 1085
孤独总比滥情好
孤独总比滥情好 2021-02-02 08:38

I\'ve often wondered why languages with a null representing \"no value\" don\'t differentiate between the passive \"I don\'t know what the value is\"

相关标签:
27条回答
  • 2021-02-02 08:39
    boolean getAnswer() throws Mu
    
    0 讨论(0)
  • 2021-02-02 08:41

    In my programming, I recently adopted the practice of differentiating "language null" and "domain null".

    The "language null" is the special value that is provided by the programming language to express that a variable has "no value". It is needed as dummy value in data structures, parameter lists, and return values.

    The "domain null" is any number of objects that implement the NullObject design pattern. Actually, you have one distinct domain null for each domain context.

    It is fairly common for programmers to use the language null as a catch-all domain null, but I have found that it tends to make code more procedural (less object oriented) and the intent harder to discern.

    Every time to want a null, ask yourself: is that a language null, or a domain null?

    0 讨论(0)
  • 2021-02-02 08:41

    Isn't is bad enough that we have one null?

    0 讨论(0)
  • 2021-02-02 08:43

    The problem is that in a strongly typed language these extra nulls are expected to hold specific information about the type.

    Basically your extra null is meta-information of a sort, meta-information that can depend on type.

    Some value types have this extra information, for instance many numeric types have a NaN constant.

    In a dynamically typed language you have to account for the difference between a reference without a value (null) and a variable where the type could be anything (unknown or undefined)

    So, for instance, in statically typed C# a variable of type String can be null, because it is a reference type. A variable of type Int32 cannot, because it is a value type it cannot be null. We always know the type.

    In dynamically typed Javascript a variable's type can be left undefined, in which case the distinction between a null reference and an undefined value is needed.

    0 讨论(0)
  • 2021-02-02 08:43

    I think having one NULL is a lower-common denominator to deal with the basic pattern

    if thing is not NULL
      work with it
    else
      do something else
    

    In the "do something else" part, there are a wide range of possibilities from "okay, forget it" to trying to get "thing" somewhere else. If you don't simply ignore something that's NULL, you probably need to know why "thing" was NULL. Having multiple types of NULL, would help you answering that question, but the possible answers are numerous as hinted in the other answers here. The missing thing could be simply a bug, it could be an error when trying to get it, it may not be available right now, and so on. To decide which cases apply to your code -- which means you have to handle them -- it domain specific. So it's better to use an application defined mechanism to encode these reasons instead of finding a language feature that tries to deal with all of them.

    0 讨论(0)
  • 2021-02-02 08:44

    VB6

    • Nothing => "There is no value."
    • Null = > "I don't know what the value is" - Same as DBNull.Value in .NET
    0 讨论(0)
提交回复
热议问题