Помогите мне прекратить пахнуть этим кодом? - PullRequest
0 голосов
/ 30 марта 2011

Я написал класс для взаимодействия с amazon-ecs gem , который выглядит следующим образом:

# app/models/aws.rb
require "amazon/ecs"
class Aws

  # various methods such as...
  def lookup(item_id, options = { :id_type => "ean" # etc... })
    Amazon::Ecs.item_lookup(item_id, options)
  end
end

Теперь я подозреваю, что некоторые вещи вонючие в том, как яреализовал это, поэтому у меня есть несколько вопросов noob ...

  1. Как мне сделать так, чтобы мне не нужно было "требовать amazon / ecs" наверху?У меня есть gem, включенный в мой Gemfile.
  2. Как мне сделать так, чтобы мне не приходилось добавлять префикс всех вызовов метода gem к "Amazon :: Ecs"?Я пытался поместить "include Amazon :: Ecs" вверху сразу после открытия класса, но это вызвало ошибку?
  3. Класс не лучший способ сделать это, не так ли?Я понимаю, что не имеет смысла, что я должен делать

    aws = Aws.new
    aws.lookup (an_item_id)

всякий раз, когда яхочу получить доступ к методам класса.Должен ли я использовать модуль вместо?Как мне это сделать?

Ответы [ 2 ]

4 голосов
/ 30 марта 2011
  1. justinxreese уже ответил на это за вас - просто включите строку gem 'amazon/ecs' в свой Gemfile и запустите bundle install.

  2. Я не знаюесли это обычная практика, но я бы не стал смешивать Amazon::Ecs.Я думаю, что префикс помогает читателям легко различать ваш код и код Ecs.

  3. В этом случае класс подходит, но вместо того, чтобы определять каждый метод как метод экземпляра, сделайтевместо них используются методы класса.

Пример:

def self.lookup(item_id, options = { :id_type => "ean" # etc... })
    Amazon::Ecs.item_lookup(item_id, options)
end

или

def Aws.lookup(item_id, options = { :id_type => "ean" # etc... })
    Amazon::Ecs.item_lookup(item_id, options)
end

Все, что соответствует вашим предпочтениям.

Теперь вы можете вызывать этот метод без создания экземпляра нового объекта Aws:

Aws.lookup(an_item_id)

0 голосов
/ 30 марта 2011
  1. Вам понадобится гем, если вам нужна его функциональность в вашем коде.

  2. Вы можете включить только модуль, но Amazon::Ecs - это класс .Вместо этого вы можете сделать это:

    def lookup( ... )
      Amazon::Ecs.instance_eval do
        item_lookup( ... )
      end
    end
    

    Однако, на самом деле, это намного страннее, чем у вас.Вы можете include Amazon, если вы действительно хотите испортить свое пространство имен и просто использовать Ecs.item_lookup.Однако я хотел бы сделать следующее:

    E = Amazon::Ecs
    def lookup( ... )
      E.item_lookup( ... )
    end
    
  3. Если вам нужны только методы с пространством имен, а состояние или параметры не сохраняются для разных экземпляров, используйте модуль:

    module Aws
      E = Amazon::Ecs
      def self.lookup( ... )
        E.item_lookup
      end
    end
    Aws.lookup( ... )
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...