3

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

我有大约 20 种方法,我想修剪所有这些方法的返回值。但是我很犹豫是否要为 20 个方法中的每一个添加修剪返回值的代码位。我一直在寻找更好的方法来做到这一点。

我虽然在这里找到了它:

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

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

4

2 回答 2

1

我认为实现 Presenter(又名 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}"
于 2013-06-24T14:41:27.300 回答
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
于 2013-06-24T15:22:17.347 回答