Bücher online kostenlos Kostenlos Online Lesen
Die Programmiersprache Ruby (German Edition)

Die Programmiersprache Ruby (German Edition)

Titel: Die Programmiersprache Ruby (German Edition) Kostenlos Bücher Online Lesen
Autoren: David Flanagan , Yukihiro Matsumoto
Vom Netzwerk:
bieten.
    ----
    Singleton-Terminologie
    Dieser Abschnitt behandelt das »Singleton-Muster«, ein bekanntes Entwurfsmuster aus der objektorientierten Programmierung. In Ruby müssen wir mit dem Begriff »Singleton« vorsichtig sein, weil er unterschiedlich genutzt wird. Eine Methode, die einem einzelnen Objekt und nicht einer Klasse von Objekten hinzugefügt wird, wird Singleton-Methode genannt (siehe „6.1.4 Singleton-Methoden definieren“ ). Das implizite Klassenobjekt, dem solche Singleton-Methoden hinzugefügt werden, wird manchmal als Singleton-Klasse bezeichnet (wobei dieses Buch stattdessen den Begriff Eigenklasse nutzt; siehe „7.7 Singleton-Methoden und die Eigenklasse“ ).
    ----
    Eine korrekte Implementierung eines Singleton erfordert die Anwendung einiger der weiter oben gezeigten Tricks. Die Methoden
new
und
allocate
müssen privat gemacht werden,
dup
und
clone
davon abgehalten werden, Kopien zu erzeugen, und so weiter. Glücklicherweise erledigt das Modul
Singleton
in der Standardbibliothek all das für uns – wir müssen nur
require 'singleton'
angeben und dann
Singleton
in unsere Klasse aufnehmen. Damit wird eine Klassenmethode namens
instance
definiert, die keine Argumente hat und eine Instanz der Klasse zurückliefert. Definieren Sie eine Methode
initialize
, um die Initialisierung dieser einen Instanz der Klasse durchzuführen. Beachten Sie allerdings, dass diese Methode keine Argumente übergeben bekommt.
    Lassen Sie uns als Beispiel zur
Point
-Klasse zurückkehren, mit der wir dieses Kapitel begonnen haben, und uns nochmal mit dem Problem des Sammelns der Statistikdaten zu den erzeugten Punkten anschauen. Anstatt diese Daten in Klassenvariablen der Klasse
Point
selbst abzulegen, werden wir eine Singleton-Instanz einer Klasse
PointStats
nutzen:
require 'singleton' # Singleton-Modul ist nicht eingebaut
class PointStats # Definiere eine Klasse
include Singleton # Mache sie zu einem Singleton
def initialize # Ein normales Initialisierungsmodul
    @n, @totalX, @totalY = 0, 0.0, 0.0
end
def record(point) # Einen neuen Punkt aufnehmen
    @n += 1
    @totalX += point.x
    @totalY += point.y
end
def report # Statistikdaten ausgeben
    puts "Anzahl der erzeugten Punkte: #@n"
    puts "Mittelwert x-Koordinate: #{@totalX/@n}"
    puts "Mittelwert y-Koordinate: #{@totalY/@n}"
end
end
    Mit so einer Klasse können wir die Methode
initialize
unserer Klasse
Point
anders gestalten:
def initialize(x,y)
@x,@y = x,y
PointStats.instance.record(self)
end
    Das Modul
Singleton
erzeugt für uns automatisch die Klassenmethode
instance
, und wir rufen die normale Instanzmethode
record
für diese Singleton-Instanz auf. Wenn wir dann die Punktstatistik ausgeben wollen, schreiben wir
PointStats.instance.report

7.5 Module
    Wie eine Klasse ist ein Modul eine mit einem Namen versehene Gruppe von Methoden, Konstanten und Klassenvariablen. Module werden ähnlich wie Klassen definiert, aber statt des Schlüsselworts
class
wird das Schlüsselwort
module
verwendet. Anders als eine Klasse kann ein Modul nicht instanziiert werden, und es lässt sich auch keine Subklasse bilden. Module stehen für sich allein — es gibt keine »Modulhierarchie« aufgrund von Vererbung.
    Module werden als Namensräume und als Mixins verwendet. Die folgenden Abschnitte erläutern diese beiden Anwendungsfälle.
    So wie ein Klassenobjekt eine Instanz der Klasse
Class
ist, ist ein Modulobjekt eine Instanz der Klasse
Module
.
Class
ist eine Subklasse von
Module
. Das bedeutet, dass alle Klassen Module sind, aber nicht alle Module Klassen. Klassen können wie Module als Namensräume verwendet werden, aber nicht als Mixins.
    7.5.1 Module als Namensräume
    Module sind eine gute Möglichkeit, miteinander in Beziehung stehende Methoden zusammenzufassen, wenn keine objektorientierte Programmierung notwendig ist. Stellen Sie sich zum Beispiel vor, dass Sie Methoden zum Kodieren und Dekodieren von Binärdaten in und aus Text mithilfe der Base64-Kodierung geschrieben haben. Es ist nicht erforderlich, spezielle Kodier- und Dekodierobjekte zu erstellen, daher gibt es auch keinen Grund, hier eine Klasse zu definieren. Alles, was wir brauchen, sind zwei Methoden: eine zum Kodieren und eine zum Dekodieren. Wir könnten einfach zwei globale Methoden definieren:
def base64_encode
end
def base64_decode
end
    Um die Kollision von Namensräumen mit anderen Kodier- und Dekodiermethoden zu vermeiden, haben wir unsere Methodennamen mit dem Präfix
base64
versehen. Das funktioniert, aber

Weitere Kostenlose Bücher