andela-amagana
11/23/2017 - 11:19 AM

Single responsibility principle at work

Single responsibility principle at work

# The class FinancialReportMailer uses composition
# i.e an instance of another class FinancialReportGenerator
# and it's methods to implement SRP.
# FinancialReportGenerator generates a report.
# The report is passed to FinancialReportMailer, where method, deliver
# is invoked to send the generated report 
class FinancialReportMailer
  def initialize(report, account)
    @report = report
    @account = account
  end

  def deliver
    Mailer.deliver(
      from: 'reporter@example.com',
      to: @account.email,
      subject: 'Financial report',
      body: @report
    )
  end
end

class FinancialReportGenerator
  def initialize(transactions)
    @transactions = transactions
  end

  def generate
    @transactions.map { |t| "amount: #{t.amount} type: #{t.type} date: #{t.created_at}"
    }.join("\n")
  end
end

report = FinancialReportGenerator.new(transactions).generate
FinancialReportMailer.new(report, account).deliver