概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Rails / Refactoring: Simple Factory Pattern - learn when and how to use it
- 原文公開日: 2018/01/08
- 著者: Paweł Dąbrowsk
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をご自由にダウンロードいただけます。