2011-01-28 13 views
10

(StackOverflow mi sta dicendo che questa domanda è "soggettiva e rischia di essere chiuso" ... beh, io ti do un colpo a prescindere)Le migliori pratiche per le funzioni di namespace in Ruby? (Domanda novizio)

sto scrivendo un sacco di metodi helper (per un pacchetto TextMate), e mi piacerebbe (e ho bisogno) di ordinarli in modo ordinato.

Questi metodi sono in realtà solo funzioni, ovvero non operano su qualcosa al di fuori del proprio ambito di applicazione e quindi non appartengono realmente a una classe. Non c'è niente che abbia bisogno di istanziare.

Finora, ho fatto questo e quello funziona bene

module Helpers::Foo 
    module_function 
    def bar 
     # ... 
    end 
end 
Helpers::Foo.bar # this is how I'd like to call the method/function 

Ma sarebbe meglio:
1. Skip module_function e dichiarare i metodi/funzioni come self.*?
2. O sarebbe meglio dichiarare una classe invece di un modulo?
3. O utilizzare class << self (all'interno di un modulo o di una classe)?
4. O qualcos'altro interamente?

Mi rendo conto che questa è una domanda abbastanza aperta, ma sto solo cercando di capire cosa stanno facendo le persone.

risposta

8

preferisco sia

module Foo 
    def self.bar 
    "bar" 
    end 
end 

Foo.bar #=> "bar" 

o

module Foo 
    def Foo.bar 
    "bar" 
    end 
end 

Foo.bar #=> "bar" 

ma probabilmente inclinarsi verso l'ex, penso self. è davvero descrittivo.

Modifica: Dopo aver letto i commenti, propongo una terza opzione che preferisco per la leggibilità. Tecnicamente penso che questo sarebbe definito come l'estensione dei metodi inclusi nella classe Eigen.

module Foo 
    module ClassMethods 
    def baz 
     "baz" 
    end 
    end 
    extend ClassMethods 
end 

Foo.baz #=> "baz" 
+0

+1 per il primo, alias auto. –

+2

Buon punto. Ma temo che 'self' perderà il suo significato nel mio codice, dal momento che praticamente tutto è un modulo che non contiene nient'altro che funzioni ausiliarie. Quindi tutto dovrebbe essere definito come "sé", nel qual caso potrei anche non definire nulla come "self" e usare invece "module_function". – Flambino

+0

vedo, aggiornerò la risposta per includere una terza opzione che preferisco per questa situazione. –

Problemi correlati