globale Variablen per verändern



  • 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.txt

    Achso 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?


Anmelden zum Antworten