Null Object Pattern

Bad:

ids = ['pig', '', 'sheep']

animals = ids.map {|id| Animal.find(id)}

animals.each do |animal|
  puts animal.nil? ? 'no animal' : animal.name
end

Good:

animals = ids.map{ |id| GuaranteedAnimal.find(id) }
animals.each{ |animal| puts animal.name }

class GuaranteedAnimal
  def self.find(id)
    Animal.find(id) || MissingAnimal.new
  end
end

class MissingAnimal
  def name
    'no animal'
  end
end

Seen in the video of Sandi Metz in RailsConf 2015:



Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s