9

デザインパターンについてアドバイスをお願いします。私はJavaのインターフェースに非常に慣れていますが、Rubyで同様のメカニズムを取得する方法がわかりません。必要なのは、連絡先などのメソッドを持つ一種のインターフェースです。連絡先を取得するには、API に対して呼び出しを行う必要があります。これは、google、linkedid、またはその他の Web サービスである可能性があります。したがって、連絡先メソッドを提供するインターフェイスを使用したいのですが、プロバイダーについてそれ以上知りたくありません。

私の最初の試みは次のようになります(疑似コード):

Module AbstractContact
 def contacts
  #do some stuff with @data
  @data
 end
end

class Impl
  include AbstractContact
 def build_provider(provider)
  if provider == :google
   #get the data from google
    gdata= api_call
   @data = gdata
   elsif provider == :linkedin
   end
 end
end


c=Impl.new
c.build_provider

c.contacts

しかし、これが「ルビーの道」であるかどうかはわかりません。

ヘルプ、提案、推奨事項を歓迎します。ベスト、フィル

4

4 に答える 4

6

ここで戦略パターンを適用できます

def Provider
  def contacts
    raise "Abstract method called"
  end
end

class Google < Provider
  def contacts
    data = # Google API call
  end
end

class LinkedIn < Provider
  def contacts
    data = # LinkedIn API call
  end
end

class Impl
  def initialize(provider)
    case provider
    when :google
      @provider = Google.new
    when :linkedin
      @provider = LinkedIn.new
    else
      raise "Unknown provider"
    end
  end

  def contacts
    @provider.contacts
  end
end

impl = Impl.new(provider)
impl.contacts
于 2013-01-29T03:10:37.117 に答える
4

これにはいくつかの良いアプローチがあります。1 つは、さまざまな機能をモジュールにカプセル化することです。

module Google
  def contacts
    puts 'contacts from Google'
  end
end

module LinkedIn
  def contacts
    puts 'contacts from LinkedIn'
  end
end

class Impl
  def self.create provider
    o = new
    o.extend(provider)
  end
end

Impl.create(Google).contacts
Impl.create(LinkedIn).contacts

出力:

contacts from Google
contacts from LinkedIn

ここで、createメソッド onImplは、指定されたモジュールのメソッドを追加する Impl インスタンスのファクトリ メソッドです。モジュールが同じメソッド名を実装し、互換性のある値を返すことを確認してください。

于 2013-01-21T16:51:10.607 に答える
2

モジュールは通常、複数のオブジェクトの共通の動作を除外するために使用されます。この場合に必要なのはダックタイピングだけだと思います。contactsJava ソリューションでインターフェースを共有するすべてのクラスにメソッドを実装するだけです。

このソリューションを使用すると、さまざまなタイプのオブジェクトを単一のコレクションに保持できることに注意してください。それらを反復処理している間 (または、これらの共通インターフェイス オブジェクトを使用したい他の方法で) contacts、何を気にせずにこのメソッドを呼び出すだけです。彼らは本当にタイプします。

このインターフェイスを実装するすべてのクラスで共通の動作が必要な場合は、contactsメソッドの存在に基づくモジュールを作成し、それを使用できるすべてのクラスに含めることができます。

于 2013-01-21T12:09:08.873 に答える