Null Object pattern

Why?


if object.nil?
  do_this
else
  object.do_that
else

object.try(:do_that) || do_this

object && object.do_that

What?

  • encapsulate the absence of an object by providing a substitutable alternative 
  • mimic default behaviour 
  • prevent conditionals (try, nil?, && ...)
  • Nil Object pattern?

How?

module ContactDatum
  class Address < ContactData

    validates :address, presence: true
    validates :city, presence: true
    validates :zipcode, presence: true
    validates :country, presence: true

    def full_address
      "#{address}, #{country_address}"
    end

    def country_address
      "#{city} #{zipcode}, #{country}"
    end
  end
end

How?

%address
    - if @address.present?
      %p= @address.address
      %p= @address.country_address
    - else
      %p= '< no address entered >'
      %p= '< no city entered >, < no country >'
@address = current_account.addresses.first

How?

 

@address = current_account.addresses.first
if @address.blank?
  @address = ContactDatum::Address.new
  @address.address = '< no address entered >'
  @address.city = '< no city >'
  @address.country = '< no country >'
end
%address
    %p= @address.address
    %p= @address.country_address

How?

module ContactDatum
  class NullAddress
    def address
      '< no address >'
    end

    def city
      '< no city >'
    end

    def zipcode
      '< no zipcode >'
    end

    def country
      '< no country >'
    end

    def full_address
      "#{address}, #{country_address}"
    end

    def country_address
      "#{city} #{zipcode}, #{country}"
    end
  end
end

How?

@address = current_account.addresses.first || 
           ContactDatum::NullAddress.new
%address
    %p= @address.address
    %p= @address.country_address

Conclusion

 

 

 

  • This pattern should be used carefully as it can make errors/bugs appear as normal program execution

Null Object Pattern

By Jan Varljen

Null Object Pattern

  • 570