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

本当に使いたいのはStrategyorAdapterパターンのようなものです。アプリに適したメソッドを実装するモジュールを作成する必要がありFlickrPhotoHostます (必ずしも Flickr の API と 1 対 1 である必要はありません)。

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

これは 1 つのホストだけではやり過ぎかもしれませんが、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、インスタグラム:

PhotoHost.new(:instagram).get_albums
于 2012-08-12T13:04:09.693 に答える
1

より高い抽象化の次のレベルに抽象化することは、多くの場合、優れたアイデアです。たとえば、アプリは Flickr ではなく PhotoHost を使用します。

反対の見方は、時期尚早の最適化に注意することです。たとえば、あなたのアプリは Flickr を別のものに置き換える必要がありますか? アプリとそのユーザーにより多くの機能や利点を提供するために、他に何に時間を費やすことができますか?

また、抽象的な PhotoHost を使用して、アプリが一度に複数の実装と通信できるようにする方法についても考えてください (フリッカーと InstaGramの両方の写真を簡単に表示できます)。

また、API メソッドについても尋ねました。

私はそれのスポーツのためだけにメソッドを変更することに注意します. うまくいけば、Flickr api メソッドにいくつかの考えが入りました。

ただし、メソッドを変更して、アプリで利用できる機能を追加する必要があります。たとえば、Flickr API が同期の場合、PhotoHost が要求された操作を完了している間に、エンド ユーザーがマルチタスクを実行できる (または少なくともフィードバックを取得できる) 一連の非同期メソッドを追加することができます。

于 2012-08-12T13:31:43.867 に答える