Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

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をご自由にダウンロードいただけます。

関連記事

[保存版]人間が読んで理解できるデザインパターン解説#1: 作成系(翻訳)

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

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


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。