<div style="display:inline;"> <img height="1" width="1" style="border-style:none;" alt="" src="//googleads.g.doubleclick.net/pagead/viewthroughconversion/961929051/?guid=ON&amp;script=0"/> </div>

Rails tips: Simple Factoryパターンによるリファクタリングの使いどころ(翻訳)

概要

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

Rails tips: Simple Factoryパターンによるリファクタリングの使いどころ(翻訳)

まずはサンプルクラスから始めましょう。

class SocialMediaPublisher
  def publish(social_media_type, user, message)
    social_media_api = nil

    case social_media_type
      when 'facebook'
        social_media_api = Facebook::API.new(user)
      when 'twitter'
        social_media_api = Twitter::API.new(user)
      when 'instagram'
        social_media_api = Instagram::API.new(user)
      else
        fail(InvalidSocialMediaType, social_media_type)
    end

    social_media_api.sign_in
    social_media_api.push(message: message)
  end
end

ここで唯一浮いているのは、オブジェクト作成の部分です。また、Factoryパターンはオブジェクト作成をカプセル化する方法です。オブジェクト作成を担当するコードを別のクラスに切り出して、SocialMediaPublisherFactoryという名前を付けます。

class SocialMediaPublisherFactory
  def create_social_media_api(social_media_type, user)
    case social_media_type
      when 'facebook'
        Facebook::API.new(user)
      when 'twitter'
        Twitter::API.new(user)
      when 'instagram'
        Instagram::API.new(user)
      else
        fail(InvalidSocialMediaType, social_media_type)
    end
  end
end

Simple Factoryができたので、これを用いて元のクラスを更新できるようになりました。

class SocialMediaPublisher
  def publish(social_media_type, user, message)
    factory = SocialMediaPublisherFactory
    social_media_api = factory.create_social_media_api(
      social_media_type, user
    )

    social_media_api.sign_in
    social_media_api.push(message: message)
  end
end

更新後のコードには、実装の詳細が含まれていないのがわかります。今後別のSNSプロバイダを追加でサポートするときにも、同じメソッド名が新しいプロバイダでも使えるので、このクラスを更新する必要はありません。

Railsアプリのリファクタリングでお困りの方へ

知りたいことがありましたら、twitterまたはフォームにてお気軽にお問い合わせください。

コードを正しくテストするには

コードを正しくテストするのは何かと困難であり、しかも最も大変なのはテストを書き始めるときです。テストを書き始めるときに役立つRSpec & Test Driven Developmentの無料ebookをご自由にダウンロードいただけます。

関連記事

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

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

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ