it
February 28, 2023

Принципы написание сервисов на Ruby

class PrintService
  attr_accessor :output_path, :template_path, :tracker_name
  def initialize
    @template_path = 'template.docx'
    @tracker_name = 'Комплект'
    super
  end

  def call
    render_doc
    temp_file
  end

  private

  def render_doc
    template.render_to_file(temp_file, context)
  end

  def temp_file
    @temp_file ||= Tempfile.new('output.docx')
  end

  def context
    { items: mapped_issues }
  end
  
  def mapped_issues
    @mapped_issues ||= issues.each_with_index.map{ |v, i|
        row.new(i, v.subject, v.description, v.created_on.strftime('%d.%m.%Y'))
    }
  end
  
  def row
    @row ||= Struct.new(:index, :subject, :description, :date)
  end
  
  def issues
    @issues ||= Issue.where(tracker: tracker)
  end

  def tracker
    @tracker ||= Tracker.find_by_name(tracker_name)
  end

  def template
    @template ||= Sablon.template(File.expand_path(template_path))
  end

end

Если пользоваться всеми возможностями язык, то получается хорошо.

  1. Публичные методы, методы которые реально используется.
    1. Их не может быть много
  2. Один класс - одна задача.
  3. Один метод - одна отвественность.
  4. Вложенность методов.
  5. Там где возможно, использовать lazy-load.
  6. Методы сортируются по высокоуровненвости.
    1. Те, которые, вызываются первыми находятся - сверху.
    2. Те, которые, вызываются последними - снизу.