在Ruby中,使用辅助方法的首选方式是什么?

10

免责声明:虽然我是在谈论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个回答

3

我会选择模块化的方法。我更喜欢它,因为它非常灵活,并且可以很好地组织你的代码。你可以说它们只是另一种mixin的形式。我总是把mixin看作是特定类的直接扩展。

class Foo
  def hello
    'Hello'
  end
end

class Foo
  def allo
    'Allo?'
  end
end

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

那种方式似乎总是非常具体,而模块化的方法可以扩展任何你包含它的类。

同行


2
如果您想在控制器和其他代码中使用它,可以创建一个 mixin 并将其添加到应用程序控制器中,从而使其他控制器继承该 mixin,这样您就可以在控制器中使用它,然后可以将模块添加到其他外部类中。

为什么这比静态类更好呢? - Daniel Rikowski
1
这是一个很好的问题,我想我会选择静态类或某种通用库来存放我需要在各个地方使用的随机自包含方法,并在需要访问控制器数据(如params等)时扩展应用程序控制器。 - Francisco Soto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接