2

目前我的应用程序使用 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 更改照片主机,那么只要新方法返回相同格式的数组,一切都应该是好的。

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

4

2 回答 2

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
于 2012-08-12T13:04:09.693 回答
1

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

相反的观点是提防过早的优化。例如,您的应用程序是否有用替代品替换 Flickr 的积极需求?您还有什么可以花时间为您的应用程序及其用户提供更多功能/好处的事情?

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

您还询问了 API 方法。

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

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

于 2012-08-12T13:31:43.867 回答