我有服务 api。我的 Base
类中有一些方法,我有继承此类并实现其方法的具体实现。我有几个 Base
类的实现者。
我有大约 20 个方法,我想减少所有这些方法的返回值。但是我犹豫要不要添加一些代码来修剪 20 种方法中每一种方法的返回值。我一直在寻找一种更好的方法来做到这一点。
我虽然在这里找到了它:
http://cheind.blogspot.com/2008/12/method-hooks-in-ruby.html
但这种方法只适用于我的 Base
类,而不适用于实现 Base
类的类。如何将它应用到我所有的实现类?
最佳答案
我认为实现 Presenter(又名 Exhibit)模式是有意义的。基本概念是用代理包装您的对象,代理添加一层表示逻辑。您可以在此处找到有关此模式的更多信息:
- Ruby on Rails patterns - decorator vs presenter
- https://gist.github.com/jordelver/3230399
- http://www.saturnflyer.com/blog/jim/2013/03/21/ruby-delegate-rb-secrets/
- http://blog.steveklabnik.com/posts/2011-09-09-better-ruby-presenters
获取一些真实的代码,你可以想象有一个这样的类:
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}"
关于ruby-on-rails - 使用某种机制来修剪方法的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17277362/