Zur Abwechslung mal etwas Sourcecode
Hi Leute,
ihr habt sicher schon bemerkt, dass hier seit Neujahr nicht viel passiert. Ich könnte euch jetzt die Ohren voll jammern, wie viel Arbeit ich habe und bla bla bla... Stattdessen mache ich hier lieber ein kleines Experiment. Inspiriert vom lieben Angelslayer, beginne ich auch mal damit, etwas Sourcecode um mich zu werfen.
Zuerst muss ich euch aber noch etwas über meinen Kollegen erzählen:
Er macht den Job schon länger als ich und hat wesentlich mehr Erfahrung. Früher großer Delphi Fan ist er zusammen mit mir jetzt bei C# gelandet. Ich hatte schon ein wenig .NET Vorbelastung, da ich vorher VB.Net programmierte. Ich wollte weg von dieser Kindersprache (nein, das meine ich nicht ernst, viele Personalchefs allerdings schon) und er wollte auch mal etwas Neues testen. So kamen wir vor ca. 4 Jahren zu C# und sind immer noch begeistert dabei.
Da wir sehr unterschiedliche Stile haben, entwickeln sich immer wunderbare Diskussionen darüber, wie man was besonders elegant, verständlich oder optimal implementiert. Die Gegenstände dieser Diskussionen und deren Lösung will ich euch in dieser kleinen Kategorie vorstellen.
Im ersten Teil geht es um das Singleton man könnte es auch Einzellstück nennen. Es ist eine Klasse die immer nur genau ein mal instanziert werden kann. Sie verhält sich in etwa wie eine globale Variable, was nüchtern betrachtet auch der größte Nachteil bei einer objektorientierten Sprache sein kann.
Dazu switche ich mal in Codeview
?//Die Klasse ist sealed,
//so kann man wirksam verhindern, dass andere Objekte
//von ihr erben.
sealed class clsHaus {
//Beim ersten Aufruf, wird eine Instanz der clsHaus erzeugt
//und hier gespeichert. Ab jetzt kann man auf die
//Klasse und alle Funktionen global zugreifen.
private static clsHaus instance = null;
//Der private Konstruktor verhindert, dass die Klasse von
//außen instanziert wird.
private clsHaus() { }
//Im geter wird, falls die Klasse noch null ist,
//eine neue Instanz erzeugt.
public static Singleton Instance {
get {
//Ist die Klasse noch null
if (instance==null) {
//Wird eine neue Instanz erzeugt
instance = new clsHaus();
}
//ab jetzt wird genau diese Instanz immer zurück gegeben
return instance;
}
}
Achtung, bei dieser Implementierung fehlt noch einiges, um das Teil wirklich sicher zu beherrschen. In dieser Version zum Beispiel, ist unser Singleton noch nicht thread-safe. Falls es euch interessiert, kann ich euch in den Kommentaren noch ein bissel was dazu erzählen. Ich denke halt an meine Leser
Wozu benötigt man das jetzt?
Kurz, für alle Aufgaben die bei großen Projekten (manchmal auch kleine) zenral verwaltet werden müssen. Dazu zählen zum Beispiel Logger, globale Variablen (auch wenn diese böse sind), Verwaltung von Datenklassen und so weiter.
Ich benutze es zum Beispiel für eine Bandanlage. Jedes Teil auf dem Band bekommt ein Objekt zugeordnet, dieses wird von einer solchen Klasse verwaltet. Auf dem Band gibt es mehrere Stationen, die Daten zu den Objekten benötigen. Ich kann an jeder Station auf dem Band auf jedes Objekt und dessen Daten zugreifen. Außerdem können Datenbankzugriffe zentral in eben dieser Klasse vorgenommen werden, was wiederum für übersichtlichen Code und einfache Transaktionen sorgt.
Jetzt seid ihr gefragt. Was haltet ihr von dem Singleton? Benutzt ihr es selbst? Ist es böse? Macht ihr es ganz anders? Habe ich etwas nicht bedacht? Habt ihr noch Fragen zur Implementation oder wollt ihr mehr Beispiele? Dann schreibt mir einfach einen Kommentar.
Twitter: NerdTrash
Januar 18th, 2011
Oh, ich habe jemanden inspiriert
Ich hatte bisher noch keine Anwendung für die Verwendung von Singleton. Und für das Beispiel mit der Bandanlage erlaube ich mir kein Urteil, da ich den genauen Anwendungsfall nicht kennt (spricht: Wieso muss jede Station zu einem beliebigen Zeitpunkt auf die Eigenschaften eines Teils zugreifen?).
Twitter: thinkJD
Januar 18th, 2011
Die Teile fahren auf kleinen Paletten im Kreis. Jede Palette hat ein Objekt, welches an der ersten Station erstellt wird. Das Singleton verwaltet diese Objekte. Jede Station ist voneinander unabhängig und man weiß erst, welches Teil davor steht, wen dessen Barcode gescannt wurde.
Nach dem Scannen kann man mithilfe des Singletons auf das entsprechende Objekt zugreifen, was wesentlich schneller geht als ein Datenbankzugriff.
Die Datenbankzugriffe erfolgen ebenfalls im Singleton, es weiß, wann es Daten nachladen muss und wann es etwas zum Speichern gibt. Beim Beenden wird die Liste mit den Datenobjekten einfach auf die Platte serealisiert, nach dem Einschalten hat man so den alten Zustand.
Ich glaube das war alles
Jetzt musst du mir noch sagen wie dein syntax highliter heißt
Twitter: NerdTrash
Januar 19th, 2011
OK, dann würde sich das anbieten. Geschwindigkeitsverbesserungen sind immer ein Argument. Und letztendlich kommt es immer auf den Programmierer an, wie “fahrlässig” er mit sowas umgeht. Denn wie netass schon schrieb: Watch your variables!
Soso, meinen Syntax-Highlighter… der, der valides XHTML macht…
Guckst Du hier: http://kpumuk.info/projects/wordpress-plugins/codecolorer/
Januar 19th, 2011
So, jetzt meldet sich mal der Kollege zu Wort:
Ein Singleton verwendet man tatsächlich zum Beispiel bei Loggern. Diese sollen
aus den verschiedensten Objekten, Methoden und Threads heraus, aufgerufen werden können. Da sie in der Regel in die gleiche Logdatei schreiben, ist ein Singleton an dieser Stelle bestimmt die richtige Wahl. Denn dadurch werden
Zugriffskonflike auf die Logdatei vermieden.
Zu exzessiver Einsatz von Singletons und globalen Variablen in einem Programm führt allerdings zu prozeduraler Programmierung und widerspricht
dem Gedanken objektorientierter Programmierung.
Wenn Objekte, andere Objekte, Variablen, beziehungsweise irgend eine Form von Daten benötigen, sollten diese übergeben werden, anstatt die Variablen/Objekte global zu deklarieren.
Zudem sind Klassen die auf globale Vaiablen zugreifen, nicht so gut
wiederverwendbar, da ja auch die globale Variable immer im Programm vorhanden sein muss.