globale variable oder nicht?
-
Auf die Gefahr hin, hier aufgrund mangelnder RL-Erfahrung nicht mitreden zu können, aber Schema
class app_t { // <- daraus mach von mir aus ein singleton ... private: int foo; public: int run() { /* backe, backe Kuchen ... */ return EXIT_SUCCESS; } }; int main() { app_t app; return app.run(); }braucht doch nie globale Variablen. Habe doch Eigenschaften von
app_tbis dir schwindlig werde, aber globale!?
-
Braunstein schrieb:
hustbaer schrieb:
Hat dein Programm kein "Session" oder "Connection" Objekt wo man solche Daten reinstopfen könnte?
So ein Session Objekt ist letztendlich doch auch bloß wieder eine, mehr oder minder gekapselte, globale Variable oder?
Wenn ich Session-Objekt schreibe, dann meine ich schon was wovon es mehr als eins geben kann.
Wenn ein Programm immer nur eins davon verwendet, OK, wird nur eins verwendet, aber der Code sollte auch funktionieren wenn es mehrere gibt.Bei der klassischen kleinen GUI Anwendung wird es oft egal sein. Bei Library-Code schon nichtmehr. Und bei Server-Anwendungen erst recht nicht.
Beispiel: DevIL (aka. OpenIL).
Da gibt's tonnenweise globale Daten. z.B. diverse Optionen die gerade aktiv sind, das aktuell ausgewählte Bild mit dem gearbeitet wird etcpp.
DevIL in einem Programm mit multithreading verwenden = sich viel ärgern und viel beten und hoffen.
Heisst du musst überall unnötige Locks einbauen, den kompletten State den du brauchst vor jeder Operation wieder neu einstellen (könnte ja ein anderer Thread verstellt haben). Und ... falls du mal eine Komponente integrieren musst die auch DevIL verwendet, aber nix von deiner "DevIL-Mutex" weiss, dann is feierabend.Diesen globalen State nun in eine DevIL-Session Klasse von der es nur eine geben kann zu packen macht natürlich keinen Sinn.
Wenn es mehrere davon geben kann hat man aber gewonnen: jeder Thread bzw. jede Komponente legt sich dann einfach ihre eigene DevIL-Session an, und juchuii, nix kann mehr schief gehen. Und ganz ohne unnötige Locks.
Wie gesagt, bei GUI Anwendungen ist es nicht unbedingt so wichtig, bzw. wird man kaum jemals echte Nachteile durch Singletons haben.
Ich versuche die Dinger aber grundsätzlich zu vermeiden. Kommt vermutlich auch daher dass ich viel Library-Code schreibe bzw. geschrieben habe.
-
@Swordfish
Jo. Jetzt haste globale Variablen in ein Singleton verwandelt.Was ist jetzt konzeptionell besser geworden dadurch?