2010-07-09 1 views
5

ein Rubygem Ich schreibe und das ist nützlich für das Zählen von Wortvorkommen in einem Text, ich wähle 3 Parameter im Klassenkonstruktor.Ist es akzeptabel, Parameter im Klassenkonstruktor zu haben?

Der Code funktioniert, aber ich möchte es für die Nettigkeit umgestalten. Erfahrungsgemäß ist es einfacher, eine Klasse mit einem Konstruktor ohne params und einer Menge Setter/Getter-Methode oder einem Code wie diesem mit allen Parametern im Konstruktor als API zu lesen/zu halten.

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

Ein Vorteil von Parametern im Konstruktor in anderen Sprachen ist, dass Sie den Typ unveränderlich machen können. Sie können das nicht tun, wenn Sie alles separat einstellen. Ich weiß nicht, ob das für Ruby gilt oder nicht, weshalb dies eher ein Kommentar als eine Antwort ist. –

+0

@Jon: http://StackOverflow.com/Questions/408208/Ruby-immutable-Objects diskutiert, ob Sie unveränderliche Objekte in Ruby (die sich von unveränderlichen Typ unterscheiden können) –

Antwort

3

Man könnte es den Schienen Weg machen, wo Optionen in einem Hash angegeben:

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 

Dann können Sie es so nennen:

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

oder dies:

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

Mate dieses Stück Code sieht wirklich gut aus –

0

Ich weiß nicht, wie es in Ruby ist, sondern auch in anderen Sprachen, die Sie in der Regel diese Argumente im Konstruktor Unterschrift setzen, die das Objekt zu initialisieren, in einen gültigen Zustand benötigt werden . Alle anderen Zustände können über Setter eingestellt werden.

+0

In diesem Fall sind Parameter Optionen zum Anpassen der Klasse Verhalten beim Abfeuern seiner Aufgabe. Es sind keine Objektinitialisierungen erforderlich. –

+0

@ thesp0ge Wenn Ruby optionale Argumente unterstützt, können Sie diese optionalen Argumente verwenden, um ihre Optionalität widerzuspiegeln. Oder fügen Sie Setter für die Optionen hinzu. Sie sollten auch darüber nachdenken, was die anderen über die Veränderbarkeit gesagt haben. – Gordon

3

Nach meiner Erfahrung kann ich feststellen, dass der Grund für die Zulassung von Konstruktorparametern in den meisten Sprachen neben der Tatsache, dass die Klasseninstanziierung einfacher wird, die Verwendung der API ist.

Der favorierende Konstruktor, über die Getter/Setter-Instantiierung, hilft auch bei der Unveränderlichkeit, das heißt, ein Objekt durch seinen Konstruktor zu erstellen, und niemanden später seine Eigenschaften ändern zu lassen.

+0

_ab von der Tatsache, die Leichtigkeit der Klasseninstanziierung zu erhöhen, ist es einfach, die API_ zu verwenden. Können Sie erklären, was bedeutet "API leicht zu benutzen"? – zuba