2010-04-25 8 views
8

de responsabilidad: A pesar de que estoy pidiendo en el contexto de una aplicación Rails, estoy no hablar de ayudantes carriles (es decir, ayudantes de vista)¿Cuál es la forma preferida de usar métodos de ayuda en Ruby?

Digamos que tengo un método de ayuda/función:

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

Ahora quiero utilizar esto desde varios lugares diferentes (la mayoría de los controladores, sino también a unos pocos trabajadores BackgrounDRb)

¿Cuál es la mejor forma de hacer esto?

puedo pensar en dos posibilidades:

1. utilizar una clase y hacer que el ayudante de un método estático:

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

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

2. Uso de un módulo e incluyen el método en lo clase que necesito esta funcionalidad

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

class MyWorker 
    include MyHelper 

    def run 
    dispatch_job(...) 
    end 
end 

3. Otras posibilidades de que no conozco todavía

... 

El primero de ellos es más similar a Java, pero no estoy seguro de si el segundo es realmente un uso adecuado de los módulos de Ruby.

Respuesta

2

El enfoque de módulo es la dirección que tomaría. Lo prefiero por su flexibilidad y lo bien que le permite organizar su código. Supongo que podrías argumentar que no son más que otra forma de mixin. Siempre pienso en mixins como extensiones directas de una clase particular

class Foo 
    def hello 
    'Hello' 
    end 
end 

class Foo 
    def allo 
    'Allo?' 
    end 
end 

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

que siempre parece muy específico, mientras que el enfoque módulo puede extender cualquier clase de incluirlo en.

Peer

2

Si va a utilizar eso en sus controladores y en algún otro código, puede crear una mezcla y agregarla al controlador de la aplicación, del cual derivan otros controladores, de esa manera puede tenerlo en sus controladores, luego puede agregar el módulo a sus otras clases externas.

+0

¿Por qué es que una mejor que la forma de clase estática? –

+1

Esa es una buena pregunta, supongo que iría con la clase estática o algún tipo de biblioteca común para los métodos autónomos aleatorios que necesitaría en todas partes y ampliando el controlador de la aplicación cuando necesito que mis métodos tengan acceso a los datos del controlador (como params y tal). –

Cuestiones relacionadas