globale Variablen per verändern
-
Hallo,
ich habe mal eine grundsätzliche Frage:
Wie kann man eigentlich globale Variablen innerhalb einer Funktion ändern???
Nicht das ich grundsätzliche Sachen falsch mache...
Schüssi,
Chrissi
-
ja, kann man.
das ist der 'sinn' von globalen variablen
und auch ihre grosse schwachstelle!verwendet keine globalen variablen, wenn es nicht unbindingt sein muss.
und wenn es sein muss, dann bedenke das singleton-pattern und das monostate-pattern - ob diese nicht vielleicht eine bessere moeglichkeit bieten.
-
wie denn???
-
int i; void aendern() { i = 42; }
-
und folgendes geht auch:
int i; void foo() { int i; i=20; //lokales i ::i=30; //globales i; }
-
Hallo Shade kannst du die beiden pattern bitte mal kurz erklären
-
PAD schrieb:
Hallo Shade kannst du die beiden pattern bitte mal kurz erklären
ich bin kein pattern profi, deshalb zeig ich dir nur die haeufigste implementierung der beiden pattern, ok?
Nachzulesen zB hier: Monostate Pattern und Singleton
normalerweise implementiert man einen Singleton so (Meyers Singleton)
class Singleton { private: ~Singleton(); public: static Singleton& Instance() { static Singleton instance; return instance; } };
ein Monostate so
class Monostate { private: static int someData; public: int getSomeData() { return someData; } void setSomeData(int data) { someData=data; } };
ein singleton ist so definiert:
Ensure a class has only one instance and provide a global point of access to it.
und Monostate:
Monostate is similar to the Singleton, but it focuses on state rather than on identity. Instead of controlling the instances of an object, Monostate ensures that only one shared state exists for all instances by declaring all data members static
-
Hallo,
auch auf die Gefahr hin mich zu wiederholen. Singleton löst nicht die konzeptionellen Probleme, die durch globale Variablen entstehen (hauptsächlich hohe Abhängigkeiten). Es hat vielmehr exakt die selben. Singleton ist auch nicht als ersatz von globalen Variablen gedacht. Singleton löst ein paar technische Probleme von globalen Variablen wie z.B. Probleme durch undefinierte Erzeugungsreihenfolge über mehrere ÜEs. Eine "gloable-Variablen-Weg-Wasch"-Wundermittel ist es aber nicht.
-
HumeSikkins schrieb:
Singleton löst nicht die konzeptionellen Probleme, die durch globale Variablen entstehen [...] Es hat vielmehr exakt die selben.
Ausser, dass sich durch ein Singelton Zugriffsfunktionen realisieren lassen welche zwangsmässig benutzt werden müssen, was meines Erachtens eine der grössten Gefahren von globalen (nämlich die Synchronität und die verlorene Kontrolle über Änderungen) löst...
-junix
-
deswegen habe ich ja auch
und wenn es sein muss, dann bedenke das singleton-pattern und das monostate-pattern - ob diese nicht vielleicht eine bessere moeglichkeit bieten.
aber du hast recht.
singleton wird zu oft vergewaltigt.
aber ein singleton bietet wenigstens geschuetzten zugriff auf diese variable, und ist IMHO deshalb ein bisschen besser als eine globale variable.
-
@junix
Dieses Mißverständnis habe ich auch schon oft gelesen. Meine Antwort wie immer: Dazu brauchst du kein Singleton. Das Konzept "Zugriff über wohldefinierte Schnittstelle" ist unabhängig vom Singleton-Muster.
In C++ hat man dafür Klassen und später dann Instanzen.
-
Danke für die Information
Interesssant das so simple Dinge so tolle Namen haben.
-
PAD schrieb:
Interesssant das so simple Dinge so tolle Namen haben.
das haben Design Pattern so ansich - der sinn dahinter ist:
wenn jemand Monostate sagt, kann der andere es nachlesen - da er ein perfektes suchwort hat.wenn jemand:
eine Klasse mit nur static member variablen, aber non static methoden sagt, dann kennt man sich nicht genau aus.
was meint er jetzt? was bringt das? wo kann ich mehr darueber erfahren.um diese fragen vorzubeugen werden namen erfunden.
-
HumeSikkins schrieb:
Dieses Mißverständnis habe ich auch schon oft gelesen.
Wieso Misverständnis?
HumeSikkins schrieb:
Meine Antwort wie immer: Dazu brauchst du kein Singleton. Das Konzept "Zugriff über wohldefinierte Schnittstelle" ist unabhängig vom Singleton-Muster.
Ja und nein. Ein Singleton gibt dir einfach die Möglichkeit, den Zugriff über eine Funktion zu erzwingen... (geschehe was Wolle)
HumeSikkins schrieb:
In C++ hat man dafür Klassen und später dann Instanzen.
Ich dachte Singletons sind auch nichts anderes als Klassen von denen aber einfach nur eine einzigen Instanz erzeugt werden kann? Natürlich könnte man das einfach mit einer globalen Instanz einer beliebigen Klasse regeln...
-junix
-
Interesssant das so simple Dinge so tolle Namen haben.
Ah. Du meinst Singleton wäre simple. Na dann schreib doch bitte mal eine Implementation die das bekannte "How to kill a singleton"-Problem und generell löst. Am Besten auch für den Fall "Zerstörung/Erzeugung bei gegenseitiger Abhängigkeit".
Als Einstieg empfehle ich:
http://www.research.ibm.com/designpatterns/pubs/ph-jun96.txtAchso und Thread-Safe und dabei schnell sollte es auch sein -> Dabei nicht vergessen, das [url=http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
]"Double-Checked Locking Pattern"[/url] ist leider kaputt.Spass beseite. Wenn du mal Gelegenheit hast, lies mal Alexandrescus "Modern C++ Design" Kapitel 6. Ich glaube danach wird man Singleton nicht mehr als so einfach empfinden.
-
Wieso Misverständnis?
Das klärst du doch zwei Absätze später selbst.
Was du haben willst ist eine Instanz einer Klasse mit einer hübschen Schnittstelle. Das ist nicht das, was dir das Singleton-Pattern primär liefert. Das ist das, wass dir früher ADTs und heute Klassen bieten.
Das was dir das Singleton-Pattern bietet ist "eine Instanz" + "globaler Zugriff".
Deshalb ist die Aussage "Das Singleton-Pattern hat aber gegenüber einer globalen Variable den Vorteil, dass es eine hübsche Schnittstelle bietet" ein Mißverständnis des Singleton-Patterns.
Klar?