帮我停止这段代码嗅到这么多?

时间:2011-03-30 16:47:36

标签: ruby-on-rails ruby ruby-on-rails-3 rubygems

我写了一个与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

现在我怀疑我实施这个方法有点臭,所以我有一些菜鸟问题......

  1. 如何制作它以便我不必在顶部“需要amazon / ecs”?我的Gemfile中包含了gem。
  2. 如何制作它以便我不必使用“Amazon :: Ecs”为所有gem方法调用添加前缀?在我打开课程之后,我尝试将“包括Amazon :: Ecs”放在顶部,但是却出错了?
  3. 一个班级不是最好的办法吗?我觉得我必须做的事情没有意义

    aws = Aws.new
    aws.lookup(an_item_id)

  4. 每当我想访问类的方法时。我应该使用模块吗?我该怎么做?

2 个答案:

答案 0 :(得分:4)

  1. justinxreese已经为您解答了这个问题 - 只需在您的Gemfile中加入gem 'amazon/ecs'行并运行bundle install

  2. 我不知道这是否是常见做法,但我会避免尝试混合Amazon::Ecs。我认为这个前缀可以帮助读者轻松区分你的代码和什么是Ecs代码。

  3. 在这种情况下,一个类很好,但不是将每个方法定义为实例方法,而是改为使用类方法。

  4. 示例:

    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)

答案 1 :(得分:0)

  1. 如果您的代码中需要其功能,则需要宝石。

  2. 您只能包含一个模块,但Amazon::Ecsa class。相反,你可以这样做:

    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( ... )