Что предпочтительный путь состоит в том, чтобы использовать вспомогательные методы в Ruby?

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

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

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.

9
задан Daniel Rikowski 26 April 2010 в 19:49
поделиться

2 ответа

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

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
ответ дан 3 November 2019 в 07:47
поделиться

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

2
ответ дан 3 November 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: