2011-01-12 2 views
3

In dem Ruby-Standard Library haben wir die Singleton Klasse:
http://ruby-doc.org/stdlib/libdoc/singleton/rdoc/index.htmlWelches ist die beste/am häufigsten verwendete Singleton-Codierungskonvention in Ruby?

Wir können eine Singleton jede Klasse machen, indem diese Klasse innerhalb darunter. Ich sehe das nur selten. Wann würde es Sinn machen, diese Singleton-Klasse zu verwenden oder einfach nur alte Klassenmethoden zu verwenden - auch Singleton-Methoden genannt?

Anders gesagt: Welche Singleton Codierungskonventionen sind die besten und warum? Hier sind drei Möglichkeiten, wie ich denken konnte:

require 'singleton' 
class Foo 
    include Singleton 
    # method definitions go here... 
end 

Foo.instance.do_something! 

Versus

class Foo 
    class << self 
    # method definitions go here... 
    end 
end 

Foo.do_something! 

Versus

module Foo 
    class << self 
    # method definitions go here... 
    end 
end 

Foo.do_something! 
+0

Sind Sie sicher, dass Sie "Konversion" und nicht "Konvention" gemeint haben? –

+0

Gute Frage - habe das nicht gesehen. Ich habe das Conversion-Tag entfernt. Ich meinte http://en.wikipedia.org/wiki/Coding_conventions –

Antwort

4

WARNUNG: Meinungen voraus!


Wenn Sie nur ein einzelnes Objekt benötigen, verwenden Sie nur ein einzelnes Objekt:

class << (Foo = Object.new) 
    # method definitions go here... 
end 

Foo.do_something! 

Module sind für das Verhalten zwischen Objekten zu teilen. Klassen sind Fabriken für Objekte. Beachten Sie den Plural: Wenn Sie nur ein Objekt haben, benötigen Sie weder eine Möglichkeit zum Teilen von Verhalten noch eine Fabrik zum Erstellen mehrerer Kopien.

Ob dies als idiomatischer Ruby gilt, hängt weitgehend davon ab, von welchem ​​"Ruby" Sie sprechen: Sprechen Sie über Ruby wie von Rails-Programmierern, Ruby von Smalltalk-Programmierern, Ruby von Java-Programmierern oder Ruby wie von Ruby-Programmierern verwendet? Es gibt signifikante Unterschiede in den Stilen, die von diesen verschiedenen Gemeinschaften verwendet werden.

Zum Beispiel neigen alte Rubyists wie David Alan Black dazu, immer mit nur Objekte und Singleton-Methoden zu starten. Nur wenn sie später doppeltes Verhalten zwischen Objekten entdecken, werden sie dieses Verhalten in ein Mixin und die Objekte damit extrahieren. (Beachten Sie, dass zu diesem Zeitpunkt noch keine Klassen vorhanden sind!)

Klassen werden nur durch Refactoring erstellt, nicht durch Upfront-Design, wenn und nur, wenn doppelte Struktur zwischen Objekten vorhanden ist.

+0

Ist "duplizierte Struktur" gleichbedeutend mit "dupliziertem Verhalten"? Hat diese Art der Programmierung (prototypbasierte Programmierung?) Auch potentielle Leistungsnachteile bei gängigen Implementierungen von Ruby? –

0

Der häufigste Ansatz, den ich gesehen habe, ist weder ein Singleton noch eine Klasse, die Sie nie instanziieren. Der häufigste und idiomatische Weg, dies zu tun, ist ein Modul.