【问题标题】:API and Rails - Best way to goAPI 和 Rails - 最好的方法
【发布时间】:2012-08-12 12:31:25
【问题描述】:

目前我的应用程序使用 FlickRaw gem 从 Flickr 提取数据。我想对其进行更多重构和整理,并删除 FlickRaw 依赖。

所以,我现在使用的是 HttParty 并直接调用 Flickr API 方法。

我创建了一个 Flickr 类,其中有 self.collection、self.photoset 等方法来提取适当的内容。

我担心的是,从我的应用程序中实际需要使用这些方法与 Flickr 集成的位置,我必须调用 Flickr.collection(id)。如果 Flickr 突然存在,我将不得不去寻找所有对 Flickr 的引用并更改它们。我更愿意将我的 Flickr 类重命名为 PhotoHost 之类的名称,并在其中包含可以调用 Flickr 的方法,但由于 Flickr 的特定部分都在一起,因此如果需要,将来应该更容易更改。这听起来是一种明智的处理方式吗?你会怎么做呢?

此外,该类中的方法是否会直接与真正的 API 方法进行 1:1 映射,或者您是否会创建自己的方法并构建您真正想要的数据数组,然后再在应用程序的其他地方使用它,或者您会只需将 flickr 响应发送到其他区域并在那里处理吗? - 实际上,在输入之后,似乎最好的方法是编写一个名为(例如)self.photos_for_album(album_id) 的方法,然后调用适当的 flickr api 方法来构建照片数组,然后使用该方法返回那个。我想这将允许我在应用程序周围编写其他代码来与照片交互,如果我从 Flickr 更改照片主机,那么只要新方法返回相同格式的数组,一切都应该是好的。

抱歉,这个问题有点脑残,但我很想知道其他人会如何解决这个问题?

【问题讨论】:

    标签: ruby-on-rails api methods flickr


    【解决方案1】:

    您真正想要使用的是StrategyAdapter 模式。您应该创建一个 FlickrPhotoHost 模块,该模块实现对您的应用有意义的方法(不一定是 Flickr 的 api 的 1-1):

    module FlickrPhotoHost
       def get_albums
          # fetch from flickr
       end
    
       def get_photo(album_id)
          # fetch from flickr
       end
    end
    

    然后你应该有一个包含这个 Flickr 适配器的 PhotoHost 类:

    class PhotoHost
      include FlickrPhotoHost
    end
    

    然后在应用中任何有意义的地方使用它。

    source = PhotoHost.new
    album = source.get_albums.first
    photos = source.get_albums(album.id)
    # and so on...
    

    当 flickr 死机时,您可以将其替换为 InstagramPhotoHost:

    module InstagramPhotoHost
       def get_albums
          # fetch from instagram
       end
    
       def get_photo(album_id)
          # fetch from instagram
       end
    end
    

    您需要更改应用程序其余部分的唯一部分是PhotoHost

    class PhotoHost
      include InstagramPhotoHost
    end
    

    这对于一个主机来说可能有点矫枉过正,但想象一下您想同时实施 Instagram 和 Flickr?让 PhotoHost 决定运行时间:

    class PhotoHost
      def initialize type
        extend case type
          when :instagram then InstagramPhotoHost
          when :flickr then FlickrPhotoHost
        end 
      end
    end
    

    实例化上,您可以为 flickr 相册执行此操作:

    PhotoHost.new(:flickr).get_albums
    

    然后BAM,instagram:

    PhotoHost.new(:instagram).get_albums
    

    【讨论】:

    • 谢谢。我稍后会详细介绍它,但看起来很棒的想法
    【解决方案2】:

    抽象到更高层次的抽象通常是个好主意。例如,您的应用程序将使用 PhotoHost 而不是 Flickr。

    相反的观点是提防过早的优化。例如,您的应用程序是否有用替代品替换 Flickr 的积极需求?您还可以将时间花在哪些可以为您的应用及其用户提供更多功能/优势的方面?

    另外:考虑一下您的抽象 PhotoHost 将如何使您的应用程序一次与多个实现进行对话(能够轻松地显示 Flicker 和 InstaGram 照片)。

    您还询问了 API 方法。

    我会小心改变方法只是为了它的运动。希望一些想法进入了 Flickr api 方法。

    但您当然应该更改方法以添加您的应用可以使用的其他功能。例如,如果 Flickr api 是同步的,您可能希望添加一组异步方法,使您的最终用户能够在 PhotoHost 完成请求的操作时执行多任务(或至少获得反馈)。

    【讨论】:

    • 谢谢。想我会换成PhotoHost。它仅适用于我的个人网站。没有外部用户,只是为了帮助我在自己的时间学习。我真的不认为我需要出于任何原因更换 Flickr,但我不妨抽象一下。它会比我目前与 Flickr 的紧密 1:1 集成更好。感谢您的建议。
    猜你喜欢
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多