Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

21

31.01.2011, 20:19

Deine Lösung, nämlich den Codeabschnitten die Objekte verwenden Referenzen (Zeiger) auf diese Objekte zu übergeben ist die richtige Lösung. Gratuliere dass du einer der wenigen Neulinge bist die sich Gedanken machen und nicht sofort blind darauf vertrauen was schon falsch in vielen Büchern steht :)

Nein, ein Singleton ist keine globale Variable, auch wenn es leider ständig als solche verwendet wird. Das wichtigste was es über Singletons zu wissen gilt ist dass man Singletons nicht verwendet ;)

Am besten zitiere ich vielleicht einfach mal die beiden am öftesten missverstandenen Sätze in der Geschichte der Softwareentwicklung:

Zitat von »Design Patterns«


Use the Singleton pattern when
  • there must be exactly one instance of a class, and it must be accessible to clients from a well-known access point.
  • when the sole instance should be extensible by subclassing, and clients should be able to use an extended instance without modifying their code.

Da steht nirgendwo dass man ein Singleton verwenden soll wenn man bequem von überall aus Zugriff auf ein Objekt haben möchte. Das Singleton Pattern dient dazu um jeden Preis sicherzustellen dass der jeweilige Typ unter allen Umständen und überhaupt exakt nur ein einziges Mal instanziert werden kann. Das, und nur das ist der Zweck des Singleton Pattern (so macht dann plötzlich auch der Name Sinn). Leider verstehen aber die meisten Singleton als die OOP Variante einer globalen Variable. Und da globale Variablen alles so schön einfach machen verwendet alle Welt globale Variablen getarnt als Singletons. Das ist aber eben genau nicht der Sinn von Singleton. Globale Variablen werden nicht plötzlich zu gutem Stil nur weil eine bunte Verpackung drumherum ist. Die Tatsache dass es einen globalen Zugriffspunkt auf den Singleton gibt ist lediglich eine Konsequenz und nicht der eigentliche Zweck des Singleton Pattern.

Ich hab sicher schon tausende Singletons gesehn. Und jedes einzelne davon war ein Designfehler. Die tatsächlichen Anwendungsfälle für Singleton sind extrem rar. Auch wenn man sehr oft erstmal einfach nur ein Objekt eines Typs hat, wie oft hat man wirklich das Problem dass man sicherstellen muss dass bis in alle Ewigkeit auf keinen Fall mehr als nur eine einzige Instanz einer Klasse erzeugt werden kann? Richtig: Nie. Aber genau das würde man mit einem Singleton ausdrücken. Ich kenn vielleicht das ein oder andere rein hypothetische Szenario wo ein Singleton unter anderem gerechtfertigt sein könnte. In der Praxis ist mir aber noch nie eine Situation untergekommen in der ich einen Singelton für sinnvoll gehalten hätte, im Gegenteil, auch ich war schon ein- oder zweimal versucht der Einfachheit halber ein Singleton zu verwenden. Und ich war noch in jedem einzelnen dieser Fälle froh mich dagegen entschieden zu haben da es sich später als grobes Designproblem herausgestellt hätte.

Dieser Beitrag wurde bereits 36 mal editiert, zuletzt von »dot« (31.01.2011, 21:33)


22

01.02.2011, 16:09

Ok, Danke dot :) !
Eigentlich ist mir das mit den Zeigern auch lieber... Erst mal versteh ich das irgendwie besser und man muss schon wirklich gezielt Fehler machen um einer Funktion die den Zeiger nicht benötigt, diesen zu übergeben und dann auch noch zu "benutzen"... ^^

Also thx nochmal :thumbsup:

LG bennichamp

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

23

01.02.2011, 17:02

Meine Lösung währe: Man definiert eine Instanz der Klasse z.B CLogfile in der main funktion und übergibt diese dann per Zeiger an alle Funktionen in der man sie braucht... Is zwar etwas mehr Arbeit aber halt sicherer, oder?
Das was zu beschreibt nennt sich "Dependency Injection" und ist auch einer der üblichen Wege um Singletons zu verhindern.

24

01.02.2011, 20:00

Siehste schon wieder was gelernt :D

Werbeanzeige