We've all been there. Tireless hours of testing and careful development halted by a mysterious NullPointerException or similar problem all due to some undefined value. What are we to do?
Whoever came up with null, None, nil, etc. really hated humanity. I get it. We need a value that represents none-existence but isn't there a better way? Let's try skipping null altogether will lists. I'm going to show some code examples in Javascript since most people here understand it and it's a particularly stupid language given that it somehow justifies having two none-existing values null and undefined. Ah, yes, undefined. The Schroedinger's cat of the Web.
We might encounter the following in the wild:
let counter;
...some code that may or may not define counter...
if ( counter !== undefined && counter !== null ) {
counter++;
}
What a mess, amirite? Some might even say we should be using typeof to be extra careful but we can remove this whole problem with lists. Here's a basic attempt.
const counters = [];
...some code that may or may not define a counter inside counters...
if ( counters.length >== 1 ) {
counters[0]++;
}
Now our if statement is a bit simpler but we still have to check before actually performing the operation. Wouldn't it be great if we could just perform the operation without checking for null or if the containing list is empty? Well, let's see what our good, old friend forEach can do for us.
const counters = [];
...some code that may or may not define a counter inside counters...
counters.forEach( counter -> counter++ );
And, boom! This operation will never fail! If counters is empty then the operation will run 0 times. If counters has 1 counter in it, the operation will run 1 time. Finally, if counters has n counters in it, the operation will run n times.
Amazing! We don't need to check for undefined values anymore. We can just reliably define container lists and run list operations on those lists which guarantees that operations will not throw exceptions when no values are defined.