Введение Null Object — отличный инструмент рефакторинга, когда вы слишком часто проверяете nil. Проверки nil часто являются признаком гораздо более серьезных проблем, поскольку они нарушают правило "Говори, а не спрашивай" и приводят к защитному программированию, подверженному ошибкам. Давайте рассмотрим простой пример рефакторинга nil проверок:

Этот Movie класс невероятно оборонителен, он делает все возможное, чтобы гарантировать, что его account действительно существует. Почему эта ответственность должна падать на Movie? Для Movie было бы намного лучше просто предположить, что у него есть учетная запись ИЛИ что-то похожее на учетную запись. Давайте познакомимся с нулевым объектом:

Мы избавились от всех условий, защищающих от nil, и ввели один, который всегда возвращает объект, подобный Account:

def account
  @account ||= NullAccount.new
end

Давайте рассмотрим точные шаги, которые необходимо предпринять при применении Introduce Null Object:

  1. Определите условия, которые проверяют наличие nil и защищают от объектов, которые потенциально не существуют, например:
def rent
  # nil check
  unless account.nil?
    account.charge(@price)
  end
end

2. Создайте объект, который действует так же, как тот, который вы проверяете как nil. В частности, создайте новый класс и определите все ожидаемые методы, например:

class NullAccount
  def charge(_price)
    "No Charge" 
  end
end

3. Наконец, замените нулевой объект, если ожидаемый не существует, например:

Class Movie
  ...
  def account
    @account ||= NullAccount.new
  end
end

Нулевые объекты отлично подходят для замены условной логики и делают код более читабельным, поскольку вам не нужно продумывать все различные условия ветвления, которые вводятся.