Rails tips: Service Objectパターンでリファクタリング(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

Rails tips: Service Objectパターンでリファクタリング(翻訳)

このリファクタリングパターンは非常にシンプルですが、私が作業しているどのアプリでも非常に有効であることがわかってきました。Service Object(訳注: 単にServiceと書かれることもありますが、本記事では略さない方に統一しています)パターンは、クラスやメソッドのコード量が増えてしまったときにいつでも使えます。私はServiceを作るときは以下のルールを守るようにしています。

  • Service Objectのクラス名の末尾には必ずServiceを付ける
  • 単一責任の原則を守る(この原則はService Objectに限らない一般的なルールです)

Service Objectのアイデアをわかりやすく示すために、サンプルのService Objectクラスを作ってみましょう。

module Users
  class EmailDomainService
    def initialize(user)
      @user = user
    end

    def email_domain
      user.email.split("@").last if user.email.present?
    end

    private
    attr_reader :user
  end
end

このクラスは非常にシンプルでありながら、きわめて便利です。Service Objectのクラス内のコード量は抑えておくべきです。Service Objectはささやかなサービスだけを、一度に1つだけ提供すべきだからです。

このパターンは、巨大なクラスを小さなコード片に分解してサービスを分離するリファクタリングに使えます。


RSpec & TDDの電子書籍を無料でダウンロード

もっと稼ぎたい方や会社をさらに発展させたい方へ: テスティングのスキルの重要性にお気づきでしょうか?テストを正しく書き始めることが、唯一のファーストステップです。無料でダウンロードいただける私の書籍『RSpec & Test Driven Developmentの無料ebook』をどうぞお役立てください。

関連記事

Railsで重要なパターンpart 1: Service Object(翻訳)

Rails: Service Objectはもっと使われてもいい(翻訳)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ