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
- Try to remain abstract
- DRY - reuse
- testable
- https://github.com/avdi/naught
- 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