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:



Categories: Ruby on Rails & other tech

Tags: ,

%d bloggers like this: