2010-04-25 11 views
8

Uwaga: Chociaż Pytam w kontekście aplikacji Rails, mam nie mówić o Rails pomocników (tj zobacz pomocnicy)Jaki jest preferowany sposób używania metod pomocniczych w Ruby?

Powiedzmy mam metody pomocnika/funkcja:

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

teraz chcę użyć to z kilku różnych miejscach (głównie kontrolerów, ale także kilku pracowników BackgrounDRb)

Jaki jest preferowany sposób to zrobić?

mogę myśleć o dwóch możliwości:

1. użyć klasy i uczynić pomocnika metody statycznej:

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

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

2. użyć modułu i obejmują metodę do cokolwiek klasa Potrzebuję tej funkcjonalności

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

class MyWorker 
    include MyHelper 

    def run 
    dispatch_job(...) 
    end 
end 

3. Inne możliwości nie znam jeszcze

... 

Pierwszym z nich jest bardziej podobny do Javy, ale nie jestem pewien, czy drugi jest naprawdę właściwe wykorzystanie modułów Ruby.

Odpowiedz

2

Podejście modułowe to kierunek, jaki weźmiemy. Wolę go ze względu na jego elastyczność i to, jak ładnie pozwala ci organizować swój kod. Przypuszczam, że możesz twierdzić, że są po prostu inną formą mixin. Zawsze myślę o wstawek jako bezpośrednie przedłużenie konkretnej klasy

class Foo 
    def hello 
    'Hello' 
    end 
end 

class Foo 
    def allo 
    'Allo?' 
    end 
end 

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

To zawsze wydaje się bardzo specyficzny, natomiast podejście moduł może przedłużyć każdą klasę je umieścić w.

Peer

2

Jeśli zamierzasz użyć tego w kontrolerach i innym kodzie, możesz utworzyć mixin i dodać go do kontrolera aplikacji, z którego pochodzą inne kontrolery, dzięki czemu możesz mieć je w kontrolerach, a następnie możesz dodać moduł do swoich innych zajęć zewnętrznych.

+0

Dlaczego jest to, że lepiej niż statyczny sposób klasy? –

+1

To jest dobre pytanie, myślę, że pójdę z klasą statyczną lub jakąś biblioteką Common dla losowych metod niezależnych, które będę potrzebować w każdym miejscu i rozszerzając kontroler aplikacji, gdy potrzebuję moich metod, aby mieć dostęp do danych kontrolera (jak params i tym podobne). –

Powiązane problemy