2010-04-25 2 views
8

Отказ от ответственности: Несмотря на то, что я прошу в контексте приложения Rails, я не говорить о Rails хелперы (т.е. Помощники)Каков предпочтительный способ использования вспомогательных методов в Ruby?

Скажем, у меня есть вспомогательный метод/функцию:

def dispatch_job(job = {}) 
    #Do something 
end 

Теперь я хочу использовать это из нескольких разных мест (в основном контроллеров, но и нескольких рабочих BackgrounDRb)

Что предпочтительный способ сделать это?

Я могу думать о двух возможностях:

1. Использование класса и сделать Helper статический метод:

class MyHelper 
    def self.dispatch_job(job = {}) 
    end 
end 

class MyWorker 
    def run 
    MyHelper.dispatch_job(...) 
    end 
end 

2. Используйте модуль и включить метод в любой класс мне нужна эта функциональность

module MyHelper 
    def self.dispatch_job(job = {}) 
    end 
end 

class MyWorker 
    include MyHelper 

    def run 
    dispatch_job(...) 
    end 
end 

3. Других возможностей я не знаю пока

... 

Первая больше Java-как, но я не уверен, что если второй один действительно соответствующее использование модулей в Ruby.

ответ

2

Подход модуля - это направление, которое я бы взял. Я предпочитаю его из-за его гибкости и того, насколько хорошо он позволяет вам организовать свой код. Я полагаю, вы могли бы утверждать, что это всего лишь еще одна форма mixin. Я всегда думаю о Mixins как прямых расширения конкретного класса

class Foo 
    def hello 
    'Hello' 
    end 
end 

class Foo 
    def allo 
    'Allo?' 
    end 
end 

f = Foo.new 
f.hello => 'Hello' 
f.allo => 'Allo?' 

Это всегда кажется очень специфичны, в то время как модульный подход может расширить любой класс вы включите его.

Peer

2

Если вы собираетесь использовать это в своих контроллерах и каком-то другом коде, вы можете создать mixin и добавить его в свой контроллер приложений, из которого получаются другие контроллеры, таким образом вы можете иметь его в своих контроллерах, затем вы можете добавить модуль к другим внешним классам.

+0

Почему это лучше чем статический класс? –

+1

Это хороший вопрос, я думаю, что я бы пошел со статическим классом или какой-то общей библиотекой для случайных автономных методов, которые мне понадобятся повсюду и расширения контроллера приложения, когда мне нужны мои методы для доступа к данным контроллера (например, параметры и т. д.). –

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