在演示者之间重用方法的惯例是什么?
例如,假设某个应用有以下演示者
class UserPresenter < BasePresenter end class AdminPresenter < BasePresenter end class EventPresenter < BasePresenter end
用户和管理员都有头像.avatar
在User和Admin演示者之间共享方法的正确方法是什么?
一种解决方案可能是从AvatarPresenter继承
class UserPresenter < AvatarPresenter end class AdminPresenter < AvatarPresenter end class EventPresenter < BasePresenter end class AvatarPresenter < BasePresenter end
在这个简单的例子中哪个有效.但是如果事情在未来变得更加复杂(例如,Admin和Event之间共享的其他方法)会怎样.
我想我想分享主持人之间的担忧.这是一种传统方法,如果是这样,模板实现会是什么样子?我所有的尝试都在引发method not found
错误.
你在寻找什么是特质.在Ruby中,它采用模块mixins的形式.
module Avatar def self.included(base) base.extend ClassMethods base.class_eval do # in this block you are operating on the singleton class # where the module is included end end def an_instance_method_from_avatar end module ClassMethods def a_class_method_from_avatar end end end class UserPresenter include Avatar end class AdminPresenter include Avatar end
这使我们可以创建可以以多种不同方式组合的可重用组件.ActiveSupport :: Concern采用上述模式并简化它:
module Avatar # modules can be extended by other modules extend ActiveSupport::Concern included do # in this block you are operating on the singleton class # where the module is included end class_methods do def a_class_method_from_avatar end end def an_instance_method_from_avatar end end
另一方面,如果对象是其父对象的真实子类型,则应该真正使用继承(基于类).虽然你可以说AdminPresenter是一个带有头像的演示者,如果你需要添加其他功能,这将导致一个非常复杂的类图.