我有服务api。我的Base
类中有一些方法,我有继承此类并实现其方法的具体实现。我有几个Base
类的实现者。
我有大约20种方法,我想修剪所有这些方法的返回值。但是我不愿意添加一些代码来修改20个方法中的每个方法的返回值。我一直在寻找更好的方法。
我虽然在这里找到了它:
http://cheind.blogspot.com/2008/12/method-hooks-in-ruby.html
但是这种方法只适用于我的Base
类,而不适用于实现Base
类的类。如何将它应用于我的所有实现者类?
答案 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