2010-07-09 6 views
5

a rubygem piszę i to jest przydatne do liczenia wystąpień słów w tekście, wybieram umieszczenie 3 parametrów w konstruktorze klasy.Czy dopuszczalne jest posiadanie parametru w konstruktorze klasy?

Kod działa, ale chcę go zmienić na wygodę. Z twojego doświadczenia wynika, że ​​łatwiej jest odczytać/używać/używać jako API klasy z konstruktorem bez parametrów i wieloma metodami ustawiającymi/pobierającymi lub kodem takim jak ten, ze wszystkimi parametrami w konstruktorze?

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

Jedną z zalet posiadania parametrów w konstruktorze co najmniej w innych językach jest to, że można uczynić ten typ niezmiennym. Nie możesz tego zrobić, jeśli wszystko ustawisz osobno. Nie wiem, czy to dotyczy Rubiego, czy nie, dlatego jest to raczej komentarz niż odpowiedź. –

+0

@Jon: http://stackoverflow.com/questions/408208/ruby-immutable-objects omawia, czy można wykonywać niezmienne obiekty w ruby ​​(które mogą różnić się od typu niezmiennego) –

Odpowiedz

3

Można zrobić to tak, szyny, gdzie opcje są podane w tablicy asocjacyjnej:

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 

Następnie można nazwać to tak:

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

lub to:

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

Mate ten kawałek kodu wygląda naprawdę dobrze –

0

Nie wiem, jak to jest w Ruby, ale w innych językach zazwyczaj umieścić te argumenty w podpisie konstruktora, które są potrzebne do zainicjowania obiektu do prawidłowego stanu . Wszystkie inne stany można ustawić za pomocą ustawiaczy.

+0

W tym przypadku parametry są opcjami dostosowywania klasy zachowanie podczas wykonywania zadania. Nie ma potrzeby inicjowania obiektu. –

+0

@ thesp0nge, jeśli Ruby obsługuje opcjonalne argumenty, możesz wprowadzić te opcjonalne argumenty, aby odzwierciedlić ich opcjonalność. Lub dodaj setery dla opcji. Powinieneś także rozważyć, co inni powiedzieli o zmienności. – Gordon

3

Z mojego doświadczenia wynika, że ​​głównym powodem dopuszczenia parametrów konstruktora w większości języków, poza faktem zwiększenia łatwości w tworzeniu instancji klas, jest ułatwienie korzystania z interfejsu API.

Korzystający konstruktor, na podstawie instancji gettera/settera, pomaga również w niezmienności, czyli w tworzeniu obiektu na jego konstruktorze, i nie pozwala nikomu modyfikować jego właściwości w późniejszym czasie.

+0

_zadowolenie z faktu zwiększania łatwości w tworzeniu instancji klasy, ma na celu ułatwienie korzystania z API_. Czy możesz wyjaśnić, co oznacza "aby ułatwić korzystanie z API"? – zuba

Powiązane problemy