2012-08-12 144 views
2

目前,我的应用程序使用FlickRaw gem从Flickr中提取数据。我想重新整理它的一部分,并删除FlickRaw依赖。API和Rails - 最佳途径

所以,我现在使用的是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更改照片主机,那么只要新方法以相同格式返回数组,所有应该都是好的。

对不起,这个问题一直是一个问题,但我会非常有兴趣听到别人会怎么做呢?

回答

4

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

module FlickrPhotoHost 
    def get_albums 
     # fetch from flickr 
    end 

    def get_photo(album_id) 
     # fetch from flickr 
    end 
end 

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

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 
+0

谢谢你。我会在后面详细介绍它,但看起来很好主意 – rctneil 2012-08-12 15:14:56

1

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

反对的观点是要提防早熟优化。例如,您的应用程序是否有积极的需求来替代Flickr?你还有什么可以花时间为你的应用程序和用户提供更多功能/好处?

另外:想想你的抽象PhotoHost如何使您的应用程序一次与多个实现对话(能够轻松显示两个闪烁和InstaGram照片)。

您还询问了有关API的方法。

我会小心改变它的运动方法。希望有人想到Flickr API方法。

但是您应该改变方法来添加您的应用可以使用的其他功能。例如,如果Flickr api是同步的,那么您可能需要添加一组异步方法,以便在最终用户完成所请求的操作的同时,让最终用户进行多任务(或至少获得反馈)。

+0

谢谢。想想我将改为PhotoHost。这只适用于我的个人网站。没有外部用户,只是为了帮助我在自己的时间里学习如此完成。我真的不认为我会因为任何原因需要换出Flickr,但我可能会抽象出一些。这比我目前与Flickr的紧密1:1集成要好。感谢您的建议。 – rctneil 2012-08-12 15:16:34