ウェブエンジニア珍道中

日々の技術的に関する経験を書いていきます。脱線もしますが助けになれば幸いです。

Rubyのmoduleでサービスクラスを作る

Rubyにおけるサービスクラスの作り方で、一つ作り方を考えたので残しておきます。

サービスクラスとは複数のモデルを使ってビジネスロジックを記述を行うものです、ここでの詳細は割愛しますが、以下の記事が有名でとても勉強になります。

qiita.com

例として「AとBを行うHogeService」を作ります。

ソース

実際のソースがこんな感じ。

module HogeService
  def execute(hoge, fuga)
    a(hoge)
    b(fuga)
  end

  def a(hoge)
    puts "execute a action"
  end

  def b(fuga)
    puts "execute b action"
  end

  # ↓によってHogeService.executeの形で呼べる
  module_function :execute, :a, :b
  # プライベートメソッド化
  private_class_method :a, :b
end

よく見る例として moduleではなく class内で以下のように定義しているものがあります。

class HogeService
  def self.execute(hoge, fuga)
    a(hoge)
    b(fuga)
  end
end

これでも良いのですが newでインスタンス作成できてしまったり self.executeという形があまり好きじゃなかったりするのでmoduleを使って作成しました。

module内で定義したメソッドはプライベートメソッドとして定義されるため他のクラスでincludeしないと使えませんが、 module_functionメソッドにメソッド名を渡すことで、そのメソッドがクラスの特異メソッドになります。要は executeがクラスメソッドになって、外側から使えるようになります。

あとはコントローラー等から叩いてやればOKです。

class AnyController
  def create
    @any_value = HogeService.execute(params[:a], @account)
  end
end