2010-04-25 6 views
8

Disclaimer: Anche se mi sto chiedendo in un contesto di un'applicazione Rails, sto non parlando di Rails aiutanti (cioè view helpers)Qual è il modo migliore di usare i metodi di aiuto in Ruby?

Diciamo che ho un metodo di supporto/funzione:

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

Ora voglio usare questo da diversi luoghi diversi (per lo più controllori, ma anche alcuni operai BackgrounDRb)

Qual è il modo migliore per fare questo?

Mi vengono in mente due possibilità:

1. utilizzare una classe e fare l'aiutante di un metodo statico:

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

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

2. Usare un modulo e includere il metodo in qualunque classe ho bisogno di questa funzionalità

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

class MyWorker 
    include MyHelper 

    def run 
    dispatch_job(...) 
    end 
end 

3. Altre possibilità che non conosco ancora

... 

Il primo è più simile a Java, ma non sono sicuro se il secondo è in realtà un uso appropriato dei moduli di Ruby.

risposta

2

L'approccio del modulo è la direzione che prenderei. Lo preferisco per la sua flessibilità e per quanto bene ti permette di organizzare il tuo codice. Suppongo che potresti argomentare che sono solo un'altra forma di mixin. Penso sempre mixins come estensioni diretti di una particolare classe

class Foo 
    def hello 
    'Hello' 
    end 
end 

class Foo 
    def allo 
    'Allo?' 
    end 
end 

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

che sembra sempre molto specifico, mentre l'approccio modulo può estendere qualsiasi classe di includere in.

Peer

2

Se lo si utilizza nei controller e in qualche altro codice, è possibile creare un mixin e aggiungerlo al controller dell'applicazione, da cui derivano altri controller, in questo modo è possibile averlo nei controller, quindi puoi aggiungere il modulo alle altre classi esterne.

+0

Perché è che una migliore rispetto al modo statico di classe? –

+1

Questa è una buona domanda, suppongo che andrei con la classe statica o un qualche tipo di libreria comune per i metodi autonomi casuali che avrei bisogno dappertutto ed estendere il controller dell'applicazione quando ho bisogno dei miei metodi per avere accesso ai dati del controller (come parametri e così via). –

Problemi correlati