Какой предпочтительный способ использовать вспомогательные методы в Ruby? - PullRequest
9 голосов
/ 25 апреля 2010

Отказ от ответственности: хотя я спрашиваю в контексте приложения на Rails, я не говорю о помощниках Rails (то есть просматриваем помощников)

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

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

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

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

Я могу представить две возможности:

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

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 ]

2 голосов
/ 26 апреля 2010

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

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 голосов
/ 25 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...