- Ruby / Rails関連
READ MORE
原著者の許諾を得て翻訳・公開いたします。
まずはサンプルクラスから始めましょう。
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プロバイダを追加でサポートするときにも、同じメソッド名が新しいプロバイダでも使えるので、このクラスを更新する必要はありません。
知りたいことがありましたら、twitterまたはフォームにてお気軽にお問い合わせください。
コードを正しくテストするのは何かと困難であり、しかも最も大変なのはテストを書き始めるときです。テストを書き始めるときに役立つRSpec & Test Driven Developmentの無料ebookをご自由にダウンロードいただけます。