Введение Null Object — отличный инструмент рефакторинга, когда вы слишком часто проверяете nil
. Проверки nil
часто являются признаком гораздо более серьезных проблем, поскольку они нарушают правило "Говори, а не спрашивай" и приводят к защитному программированию, подверженному ошибкам. Давайте рассмотрим простой пример рефакторинга nil
проверок:
Этот Movie
класс невероятно оборонителен, он делает все возможное, чтобы гарантировать, что его account
действительно существует. Почему эта ответственность должна падать на Movie
? Для Movie
было бы намного лучше просто предположить, что у него есть учетная запись ИЛИ что-то похожее на учетную запись. Давайте познакомимся с нулевым объектом:
Мы избавились от всех условий, защищающих от nil
, и ввели один, который всегда возвращает объект, подобный Account
:
def account @account ||= NullAccount.new end
Давайте рассмотрим точные шаги, которые необходимо предпринять при применении Introduce Null Object:
- Определите условия, которые проверяют наличие
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
Нулевые объекты отлично подходят для замены условной логики и делают код более читабельным, поскольку вам не нужно продумывать все различные условия ветвления, которые вводятся.