Рефакторинг с шаблонами проектирования - шаблонный метод

  • 1 апреля, 09:30
  • 4269
  • 0

Шаблонный метод описывается как «шаблон проектирования поведения, который позволяет вам определять каркас алгоритма и позволяет подклассам переопределять определенные этапы алгоритма без изменения его структуры».

Цель состоит в том, чтобы отделить код, который изменяется от кода, который не изменяется, сохраняя проблемы изолированными для специализированных классов. Такие подклассы реализуют потом все конкретные шаги.

Допустим, мы создаем приложение для мониторинга, и нам нужно отправить электронное письмо менеджерам с отчетом, содержащим количество отработанных часов для каждого сотрудника.

Реализация Report класса довольно проста

class Report
  def generate_report!
    get_employees_worked_time
    format_report
    send_to_stakeholders
  end


  def get_employees_worked_time
    # Retrieve this info from the database
  end


  def format_report
    # Generate the HTML with the Report design
  end


  def send_to_stakeholders
    # Call send email service
  end
end

Код работает отлично. Но если нам необходимо будет сгенерировать такой же отчет в текстовом формате? Единственная часть, будет меняться - шаг формирования отчета. Именно в таком случае хорошим решением будет применить Шаблонный метод. 

Чтобы применить этот шаблон, мы преобразуем Report класс в абстрактный класс, который может быть унаследован от нескольких конкретных классов.

Возвращаясь к нашему коду, единственное необходимое изменение - оставить реализацию метода format_report для дочернего класса

class ReportTemplate
  def generate_report!
    get_employees_worked_time
    format_report
    send_to_stakeholders
  end


  def get_employees_worked_time
    # Retrieve this info from the database
  end


  def format_report
    raise NotImplementedError
  end


  def send_to_stakeholders
    # Call send email routine
  end
end

И для каждого варианта отчета нам нужно создать конкретный подкласс

class HTMLReport < ReportTemplate
  def format_report
    # implement the report in HTML format
  end
end

Если нам прежде необходимо будет создать новый формат, мы только создадим новый конкретный класс. Таким образом, получаем прекрасный пример принципа открытости/закрытости. Организовав наш код таким образом, мы сможем безопаснее и проще применять любые изменения в будущем.

Если вам нужно изменить только несколько методов или сделать их опциональными, этот шаблон - идеальное решение. Шаблонный класс реализует скелет, а подклассы - детали реализации так, как это необходимо.


0 комментариев
Сортировка:
Добавить комментарий

IT Новости

Смотреть все