Softwareengineering, Singleton
-
Hallo,
ich verwende eine Datenbank und habe deshalb eine Datenbank Schicht, dort gibt es eine Klasse und in der sind alle datenbank Funktionen drin.
Jetzt dachte ich mir ich mach diese Klasse global und somit kann jeder aus dem Modell darauf zu greifen.
Aber mein Professor dem hat das gar nicht gepasst. Globale Variablen , das geht gar nicht. Also meinte er ich soll ein Singleton Pattern verwenden.
Jetzt müssen die im Modell ständig die getinstance() Funktion aufrufen. Ist das nicht zuviel des Guten ? Wäre eine globale Variable hier nicht besser ?
-
Singleton ist kein Ersatz für eine globale Variable, wird nur oft missbraucht, um globale Variablen hinter einem bunten Vorhang zu verstecken, weil man meint, dass man sich dann weniger schämen muss. Eigentlich müsste man sich dann noch mehr schämen, weil man nicht nur globale Variablen verwendet, sondern auch noch Singleton falsch verstanden hat. Jedenfalls: Beides ist Mist.
blurry333 schrieb:
Wäre eine globale Variable hier nicht besser ?
Ja, denn es handelt sich konzeptionell ja auch um eine globale Variable und nicht um ein Singleton. Natürlich ist die globale Variable auch nicht gut, aber zumindest ein klein wenig besser, da man zumindest nicht zusätzlich auch noch ein völlig unangebrachtes Pattern missbraucht...
blurry333 schrieb:
[...] dort gibt es eine Klasse und in der sind alle datenbank Funktionen drin.
Well, there's your problem.
-
Singleton sind eine wunderbare Möglichkeit , um einzelne Klasseninstanzen überall auf einfache Weise verfügbar zu machen , ohne dass man eine globale Variable dazu verwenden muss.
-
blurry333 schrieb:
Singleton sind eine wunderbare Möglichkeit , um einzelne Klasseninstanzen überall auf einfache Weise verfügbar zu machen , ohne dass man eine globale Variable dazu verwenden muss.
Jo, auch wenn das eben leider ein sehr verbreiteter Irrtum ist, so ist es dennoch Irrtum...
-
Mit dem Singleton muss man halt jetzt immer die Header Datei einbinden und zwar überall . Aber zumindest hat man keine globale Variable mehr.
-
dot schrieb:
Jo, auch wenn das eben leider ein sehr verbreiteter Irrtum ist, so ist es dennoch Irrtum...
In meinem Buch steht es aber so. Und das ist ein Beststeller ! Heiko Kalista: C++ für Spieleprogrammierer
-
blurry333 schrieb:
Mit dem Singleton muss man halt jetzt immer die Header Datei einbinden und zwar überall . Aber zumindest hat man keine globale Variable mehr.
Wieso hat man keine globale Variable mehr? Du hast ja immer noch ein Objekt, das in jedem Scope verfügbar ist...
-
Aber nur wenn man die Headerdatei einbindet!!!!!
-
[quote="blurry333"][quote="dot"]
blurry333 schrieb:
Jo, auch wenn das eben leider ein sehr verbreiteter Irrtum ist, so ist es dennoch Irrtum...
In meinem Buch steht es aber so. Und das ist ein Beststeller ! Heiko Kalista: C++ für Spieleprogrammierer
In meinem Buch steht was anderes. Und das ist auch ein Bestseller ! GoF: Design Patterns...
-
blurry333 schrieb:
Aber nur wenn man die Headerdatei einbindet!!!!!
Header oder nicht ändert nix daran, in welchem Scope es sich befindet...
-
nee da der Singleton nicht in der main angelegt wird sondern in einer .h Datei
-
-
int globaleVariable = 10 ; // jetzt ist sie global int main() { }
// aber !!
headerdatei.h int globaleVariable = 10 ;
#include "headerdatei.h" int main() { cout << globaleVariable // jetzt nicht mehr global }
-
globaleVariable ist in beiden Fällen global...
-
aber wenn ich in einem anderen file nicht
#include "headerdatei.h"
verwende dann kann ich kaum auf die Variable zugreifen ??
-
main.cpp
int x; int main() { void surprise(); surprise(); // who knew... }
surprise.cpp
extern int x; void surprise() { x = 42; }
-
Wie kann man eigentlich in einem großen Projekt eine globale Variable machen ?
Wenn ich in der main.cpp eine globale Variable anlege , dann kann ich die ja nicht so einfach in den anderen files verwenden ?
-
blurry333 schrieb:
Wie kann man eigentlich in einem großen Projekt eine globale Variable machen ?
Wenn ich in der main.cpp eine globale Variable anlege , dann kann ich die ja nicht so einfach in den anderen files verwenden ?Doch, genau so wie in meinem Beispiel oben...
-
Du machst das ganze genau so wie mit Funktionen.
In den Header kommt die Deklaration, in die Sourcedatei die Definition.
Deklaration: extern Type name;
Definition: Type name = default_value;
-
dot fällt auf einen blurry thread rein.