2010-07-09 38 views
5

yazıyorum bir rubygem ve bu bir metinde sözcük olaylar sayarak için yararlıdır, ben sınıf yapıcısı 3 parametre koymak seçin.Sınıf kurucusunda parametreye sahip kabul edilebilir mi?

kodunun çalıştığını, ancak hoşluk için refactor istiyorum. Tecrübelerinize göre , bu yapıcı tüm parametreleri içeren, okuma/hayır parametreleri içeren bir yapıcı ve ayarlayıcılar/alıcıları yöntemin bir sürü veya buna benzer bir kod ile API kullanacağım/a sınıfını mantain daha kolaydır?

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

Kurucularda en az diğer dillerdeki parametrelere sahip olmanın bir yararı, türü değişmez yapabilmenizdir. Her şeyi ayrı ayrı kurarsan bunu yapamazsın. Bunun Ruby için geçerli olup olmadığını bilmiyorum, bu bir cevaptan ziyade bir yorumdur. –

+0

@Jon: http://stackoverflow.com/questions/408208/ruby-immutable-objects, ruby'de değişmez nesneler yapıp yapamayacağınızı (değişmez tipten farklı olabilir) tartışır –

cevap

3

içinde bir çok raylar seçenekleri karma verilmiştir yolu, yapabileceği:

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 

Sonra böyle diyebilirsin:

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

veya bu:

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

Bu kod parçası gerçekten iyi görünüyor –

0

Ben Ruby olduğunu bilmiyorum, ama diğer dillerde genellikle geçerli bir duruma nesneyi başlatmak için gerekli olan yapıcı imza olanlar argümanları koymak . Diğer tüm durumlar, ayarlayıcılarla ayarlanabilir. Tecrübelerime göre

+0

Bu durumda, parametreler, sınıfı özelleştirme seçenekleridir görevini yerine getirirken davranış. Başlatma işlemine gerek yoktur. Ruby opsiyonel argümanları destekliyorsa –

+0

@ thesp0nge, bu isteğe bağlı argümanları isteğe bağlılıklarını yansıtacak şekilde yapabilirsiniz. Veya seçenekler için ayarlayıcıları ekleyin. Diğerlerinin mutabilite hakkında ne söylediğini de düşünmelisiniz. – Gordon

3

ben ayrı sınıf örnekleme kolaylık artan gerçeğinden, çoğu dilde yapıcı parametreleri izin verdiği için çok nedeni, bu kolay API kullanmak için yapmak olduğunu söyleyebilir.

tercih sebebi yapıcı, alıcı/ayarlayıcı örnekleme üzerinde, ayrıca bu, kapsamlı yapıcısını bir nesne oluşturma ve herkes daha sonra onun özelliklerini değiştirmek izin vermiyor, değişmezlik yardımcı olur.

+0

_apart, sınıf örneklemindeki kolaylığın artırılmasından dolayı, API_'in kullanımını kolaylaştırmaktır. "API'yi kullanmayı kolaylaştırmak için" ne anlama geldiğini açıklayabilir misiniz? – zuba

İlgili konular