在演示者之间重用方法的惯例是什么?
例如,假设某个应用有以下演示者
avatar
用户和管理员都有头像。在User和Admin演示者之间共享class UserPresenter < AvatarPresenter
end
class AdminPresenter < AvatarPresenter
end
class EventPresenter < BasePresenter
end
class AvatarPresenter < BasePresenter
end
方法的正确方法是什么?
一种解决方案可能是从AvatarPresenter继承
method not found
在这个简单的例子中,哪个有效。但是如果将来事情变得更加复杂(例如,管理员和事件之间共享的其他方法)会怎样。
我想我想分享主持人之间的担忧。这是一种传统方法,如果是这样,模板实现会是什么样子?我的所有尝试都会引发kallsyms
错误。
答案 0 :(得分:5)
您要找的是traits。在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是一个带有头像的演示者,如果你需要添加其他功能,这将导致一个非常复杂的类图。