2017-01-15 2 views
0

Что такое соглашение о повторном использовании методов между ведущими?Что такое обычный способ повторного использования методов для ведущих?

Например, скажем, приложение имеет следующие ведущие

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.

+0

Модули, вероятно, то, что вам нужно. – meagar

ответ

4

То, что вы ищете, это traits. В Ruby это относится к модульным микшинам.

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 является ведущим с аватаром, это приведет к действительно запутанной диаграмме классов в будущем, если вам нужно добавить другие функции.

+0

Это действительно относится к любым типам объектов в Ruby, а не только к ведущим. – max

+0

спасибо @max. где вы ожидаете найти черты презентатора/модули в приложении Rails? 'Приложение/Ведущие/modules'? 'Приложение/traits'? Есть ли конвенция для этого? –

+0

Правильно ли я понял ваш последний абзац? «наследование ..... должно использоваться только». Это касается идеи 'UserPresenter

Смежные вопросы