2010-07-09 11 views
5

un rubygem che sto scrivendo e che è utile per il conteggio occorrenze di parola in un testo, ho scelto di mettere 3 parametri in costruttore della classe.È accettabile avere parametri nel costruttore di classi?

Il codice funziona, ma voglio refactoring per gentilezza. Nella sua esperienza, è più facile da leggere/mantenere/uso di API una classe con un costruttore senza params e un sacco di setter metodo/getter o di un codice come questo, con tutti i params nel costruttore?

TIA

Paolo

def initialize(filename, words, hide_list) 

    if ! filename.nil? 
    @filename = filename 
    @occurrences = read 
    else 
    @filename = STDIN 
    @occurrences = feed 
    end 

    @hide_list = hide_list 
    @sorted = Array(occurrences).sort { |one, two| -(one[1] <=> two[1]) } 
    @words = words 

end 
+1

Un vantaggio di avere parametri nel costruttore almeno in altre lingue è che è possibile rendere il tipo immutabile. Non è possibile farlo se si imposta tutto separatamente. Non so se questo si applica a Ruby o no, ed è per questo che questo è un commento piuttosto che una risposta. –

+0

@ Jon: http://stackoverflow.com/questions/408208/ruby-immutable-objects discute se è possibile fare oggetti immutabili in Ruby (che può essere diverso dal tipo immutabile) –

risposta

3

Si potrebbe farlo nel modo rotaie, in cui le opzioni sono date in un hash:

def initialize(filename = nil, options = {}) 
    @hide_list = options[:hide_list] 
    @words = options[:words] 

    if filename 
    @filename = filename 
    @occurrences = read 
    else 
    @filename = STDIN 
    @occurrences = feed 
    end 

    @sorted = Array(occurrences).sort { |one, two| -(one[1] <=> two[1]) } 

end 

Poi si può chiamare in questo modo:

WC.new "file.txt", :hide_list => %w(a the to), :words => %w(some words here) 

o questo:

wc = WC.new 
wc.hide_list = %w(a the is) 
wc.words = %w(some words here) 
+0

Accoppia questo pezzo di codice sembra davvero buono –

0

Non so come sia in Ruby, ma in altre lingue che di solito mettere tali argomenti nella firma costruttore che sono necessari per inizializzare l'oggetto in uno stato valido . Tutti gli altri stati possono essere impostati tramite setter.

+0

In questo caso, i parametri sono opzioni per personalizzare classe comportamento durante l'esecuzione del suo compito. Non ci sono tenuti ad oggetto l'inizializzazione. –

+0

@ thesp0nge se Ruby supporta gli argomenti facoltativi, è possibile rendere quegli argomenti facoltativi in ​​modo che riflettano la loro opzionalità. Oppure aggiungi setter per le opzioni. Dovresti anche considerare cosa hanno detto gli altri riguardo alla mutabilità. – Gordon

3

Nella mia esperienza, posso dire che il motivo per cui i parametri del costruttore sono consentiti nella maggior parte delle lingue, oltre al fatto di aumentare la facilità nell'istanziazione della classe, è quello di rendere più semplice l'utilizzo dell'API.

costruttore Favorendo, oltre getter/setter esemplificazione, aiuta anche immutabilità, cioè, la creazione di un oggetto approfondito il suo costruttore, e non lasciare che chiunque modificarne le proprietà in seguito.

+0

_apart dal fatto di aumentare la facilità di classe di esemplificazione, è quello di rendere più facile da usare l'API_. Puoi spiegare cosa significa "rendere facile l'uso dell'API"? – zuba

Problemi correlati