使用somekind of mechanism来修剪方法的返回值

时间:2013-06-24 13:59:31

标签: ruby-on-rails ruby

我有服务api。我的Base类中有一些方法,我有继承此类并实现其方法的具体实现。我有几个Base类的实现者。

我有大约20种方法,我想修剪所有这些方法的返回值。但是我不愿意添加一些代码来修改20个方法中的每个方法的返回值。我一直在寻找更好的方法。

我虽然在这里找到了它:

http://cheind.blogspot.com/2008/12/method-hooks-in-ruby.html

但是这种方法只适用于我的Base类,而不适用于实现Base类的类。如何将它应用于我的所有实现者类?

2 个答案:

答案 0 :(得分:1)

我认为实施Presenter(a.k.a Exhibit)模式是有意义的。基本概念是使用代理包装您的对象,该代理添加了一层表示逻辑。您可以在此处找到有关此模式的更多信息:

获取一些真实的代码,你可以想象有一个像这样的类:

class Test
  def baked
    "  baked"
  end

  def beans
    "  beans  "
  end

  def food_methods
    [:baked, :beans]
  end
end

test = Test.new
p "#{test.baked} #{test.beans}"

Ruby标准库提供了一个名为SimpleDelegator的简洁实用程序,它提供了我们需要的大多数功能。因此,我们只需要动态定义一些方法并将原始对象包装在新的呈现的对象中:

require 'delegate'

class TestPresenter < SimpleDelegator
  Test.new.food_methods.each do |method|
    define_method(method) do |*args|
      __getobj__.send(method, *args).strip
    end
  end
end

presenter = TestPresenter.new(test)
p "#{presenter.baked} #{presenter.beans}"

答案 1 :(得分:0)

警告:此解决方案不像@ ju-liu那样“干净”,它可能不是最有效的,但它在您的工作流程中更短,更容易实现。您可能还希望限制要重新定义的方法并构建更好的错误处理。

您可以在Base课程内完成:

(Base.instance_methods - Class.instance_methods).each do |method|  
  alias_method "#{method}_backup", method    
  class_eval %Q{    
    def #{method}(*args)
      #{method}_backup(*args).strip rescue #{method}_backup(*args)
    end
  }
end