Originally published on Beezwax.net.
What is nothing?
undefined? A vast void of emptiness that fills your soul with dread? Oh sorry, that's just my stomach.
We often think of nothing as... well, nothing. It's when something doesn't exist and therefore cannot be interacted with. So in our code, we try account for having nothing. No
User? No problem.
def display_name if @user.present? @user.name.titlecase else "Guest User" end end
Fixed it with a conditional. Right...?
But what happens when you want something else from the
User elsewhere? Use another conditional?
def avatar if @user.present? @user.avatar else default_avatar end end
Technically it would solve your problem for now, but soon there will a bunch of
if statements cluttering your code when all you really want to do is simply call a method.
What if instead of nothing, you had a something. Something that responded to the API of your object. That something would be the "null object"-- It is an object that represents when you have no object, kind of like a placeholder.
Instead of having to check whether or not you have a
User object, you can ensure you always have something that will respond to your method calls by providing a null object that responds to the API of your object.
class GuestUser def name "Guest User" end def avatar default_avatar end end
Now you can use this
GuestUser whenever you don't have a
def initialize(user = GuestUser.new) @user = user end def display_name @user.name.titlecase end def avatar @user.avatar end
As you can see in the above example, I've injected the
GuestUser in as a default parameter in the constructor. Now if a
User isn't passed in, the code will use the
GuestUser, and no more need for additional conditionals!
To the keen eye, you'll notice that this Null Object Pattern is actually an example of Composition over Inheritance! Check out this post on Composition over Inheritance if you'd like to learn more.
The code examples are in Ruby, but the concept can be applied to any Object Oriented programming.
Cover photo by Casey Horner.