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’ and the more assertive ‘There is no value.’.
There have been several cases where I’d have liked to differentiate between the two (especially when working with user-input and databases).
I imagine the following, where we name the two states unknown and null:
var apple; while (apple is unknown) { askForApple(); } if (apple is null) { sulk(); } else { eatApple(apple); }
Obviously, we can get away without it by manually storing the state somwhere else, but we can do that for nulls too.
So, if we can have one null, why can’t we have two?
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?