Singleton oder "rein statische" Klasse



  • Und nein, ich werde die Eigenschaften des Singleton-DPs hier nicht aufzählen.

    Doch. Wir machen hier so lange Unfug, bis Du weich wirst.



  • Doch. Wir machen hier so lange Unfug, bis Du weich wirst.

    Na dann noch viel Spass.



  • Original erstellt von Helium:
    OOP beschäftigt sich doch damit, die im Problem vorhandenen Objekte zu erzeugen und interagieren zu lassen. Ein Singleton ist Einfach ein Objekt, das es nur einmal geben kann. Das Singleton dient dazu, dass man nicht fälschlicherweise mehrere Instanzen erstellt. Es ist also eigentlich ein Schutz vor OOA-technischen Fehlern.

    Also noch mal langsam, für Menschen wie mich: Ein Objekt ist eine Sammlung von Zugriffsmöglichkeiten ('Methoden'), die auf einem Zustand ('Variablen') rumfuhrwerken. Jetzt baut man zusätzlich irgendetwas (man macht sein Programm komplexer) damit man die Abstraktion, die man vorher gebaut hat, wieder zu entfernen. Irgendwie erschließt sich mir der Sinn nicht.



  • Der Vorteil eines Singletons ist doch, dass garantiert ist, dass das Teil korrekt instanziiert ist, wenn es das erste mal benutzt wird. Bei Klassen mit statischen Members ist das genauso garantiert, wie bei globalen Variablen: garnicht. Die Reihenfolge der Instanziierung ist modulübergreifend nicht definiert.

    Dann kann ich auch gleich die Funktion main(){...} implementieren und globale Variablen und Funktionen einführen. Evtl. verpacke ich sie noch in einen Namespace, um es übersichtlicher zu strukturieren.

    Könntest Du, außer dass Du die Vorteile von OO aufgibst, nur weil es sich um ein konstrukt handelt, dass es nur einmal geben soll: Datenkapselung, Zugriffsschutz. Mit welchem Grund sollte sich aber etwas anders verhalten, nur weils global ist?



  • Ein Objekt ist eine Sammlung von Zugriffsmöglichkeiten ('Methoden'), die auf einem Zustand ('Variablen') rumfuhrwerken.

    Technisch ja, semantisch nein.

    Jetzt baut man zusätzlich irgendetwas (man macht sein Programm komplexer) damit man die Abstraktion, die man vorher gebaut hat, wieder zu entfernen. Irgendwie erschließt sich mir der Sinn nicht.

    Inwievern zerstöre ich durch Singletons in irgendeinerweise die bereits vorhandene Abstraktion?



  • Original erstellt von Helium:
    Technisch ja, semantisch nein.

    Was ist es dann? Eine Abstraktion von einem Tischbein?

    Inwievern zerstöre ich durch Singletons in irgendeinerweise die bereits vorhandene Abstraktion?

    Wieso quätscht man Dinge, die man exakt ein mal braucht in eine Klasse und diese Klasse in ein Singleton? Um die Probleme mit mit der Instantierreihenfolge zu umgehen und welche mit der Zerstörung (Zeitpunkt, Ressourcenfreigabe etc) anzufangen?
    Ich bin noch nie in die Verlegenheit gekommen, in ein Büch über Designpatterns hineinzusehen, muss ich zugeben. Vielleicht sollte ich das mal tun, aber irgendetwas in mir wehrt sich dagegen ...



  • Original erstellt von Daniel E.:
    Wieso quätscht man Dinge, die man exakt ein mal braucht in eine Klasse und diese Klasse in ein Singleton? Um die Probleme mit mit der Instantierreihenfolge zu umgehen und welche mit der Zerstörung (Zeitpunkt, Ressourcenfreigabe etc) anzufangen?

    Hab mal die drei Hauptgründe zusammengetragen:
    - Um das Prog ein wenig lahmer zu machen. (Beim Umbau von globaler Variablen in Meyers-Singleton.)
    - Weil der Lehrer immer sagte "nehmt keine globalen Variablen". (Ich wär fast vom Stuhl gefallen, als mir das einer als Begründung antat.)
    - Weil das Wort "Singleton" so hübsch ist. (Mein Favorit.)



  • Hallo,
    also ich verstehe ja nach wie vor nicht, warum soviele so blind auf das Singleton-DP (oder Highlander) abfahren, wo ein Monostate (oder Borg) doch häufig viel besser geeignet ist. Und häufig ist eine simple globale Variable sowieso am Einfachsten.



  • Ich bin noch nie in die Verlegenheit gekommen, in ein Büch über Designpatterns hineinzusehen, muss ich zugeben. Vielleicht sollte ich das mal tun, aber irgendetwas in mir wehrt sich dagegen ...

    Wahrscheinlich dein Genie. Um mal etwas unfreundlich zu werden: Ich habe die Erfahrung gemacht, dass viele Extrem-Viel-Wisser wie du (oder Volkard) dazu neigen ihr Wissen als erschöpfend und einzig richtig zu betrachten. Ab einem bestimmten Punkt ist einfach kein Platz/Interesse mehr da für neue Anregungen (die man ja von mir aus alle als Mist ab tun kann).

    Das Problem das ich in diesem konkreten Fall damit habe ist, dass du damit erwartest, dass alle die mit dir kommunizieren wollen dein Genie besitzen müssen.

    [ Dieser Beitrag wurde am 31.03.2003 um 15:52 Uhr von HumeSikkins editiert. ]



  • Original erstellt von HumeSikkins:
    Das Problem das ich in diesem konkreten Fall damit habe ist, dass du damit erwartest, dass alle die mit dir kommunizieren wollen dein Genie besitzen müssen.

    Das hast Du jetzt mit deinen hellseherischen Kräften herausgefunden, nehme ich an? 🙂

    Deine 'Erfahrungen mit Extrem-Viel-Wissern wie mir' in allen Ehren, aber Du überschätzt mich gewaltig. Ich will _wirklich_ etwas lernen und trolle nicht (genau darum hatte ich ja geschrieben, dass ich auf dem Gebiet neu bin...). Wenn ich mal etwas mehr Zeit habe als diese Woche, dann werde ich mich mal da reinlesen. Versprochen.

    [ Dieser Beitrag wurde am 31.03.2003 um 16:03 Uhr von Daniel E. editiert. ]



  • Ich habe mir vor zwei Monaten auch mal das "Entwurfsmuster"-Buch von Addison-Wesley gekauft. Manche Design-Patterns finde ich ganz nützlich wenn es Sinn macht. Manches ist einfach zu abgehoben... Singletons sind manchmal ok aber wenn ich sehe wofür manche Leute sie verwenden und dass viele sich für jeden kleinen Mist eine AbstractFactory schreiben dann frage ich mich ob Design-Patterns manchmal nicht einfach ein Rückschritt sind...



  • Original erstellt von kartoffelsack:
    **Der Vorteil eines Singletons ist doch, dass garantiert ist, dass das Teil korrekt instanziiert ist, wenn es das erste mal benutzt wird. Bei Klassen mit statischen Members ist das genauso garantiert, wie bei globalen Variablen: garnicht. Die Reihenfolge der Instanziierung ist modulübergreifend nicht definiert.
    **

    außerdem wirds nur instanziert wenn man es braucht

    zeigt mir ein besseren weg

    - Um das Prog ein wenig lahmer zu machen. (Beim Umbau von globaler Variablen in Meyers-Singleton.)

    hmm ich habe mich schon immer gefragt wieso ein compilier nicht zu compilier zeit merkt das die getinstanz() aufgerufen wird und dann die getinstanz umwandelet zu

    foo f;
    
    class foo
    {
        statuc foo & getinstanz()
        {
            return f;
        }
    };
    

    ich sollte mal mit einen der neueren compiliern das testen



  • foo f;

    class foo
    {
    statuc foo & getinstanz()
    {
    return f;
    }
    };

    Hättest Du dann nicht wieder eine globale Variable die keine Garantie zur Zeit der Instanziierung hat ?!



  • Original erstellt von Knuddlbaer:
    Hättest Du dann nicht wieder eine globale Variable die keine Garantie zur Zeit der Instanziierung hat ?!

    nicht für der compilier bauer, er hat die lizenz zum zaubern



  • Jo stimmt.

    Aber wo wäre dann der Vorteil ?



  • wenn ich sehe wofür manche Leute sie verwenden und dass viele sich für jeden kleinen Mist eine AbstractFactory schreiben dann frage ich mich ob Design-Patterns manchmal nicht einfach ein Rückschritt sind...

    Was meinst du wohl, warum *nahezu jeder* DP-Auskenner auch vor DPs warnt? Auch DPs sind nicht die lang gesuchte "silver-bullet". DPs helfen häufig in verzwickten Situationen (schließlich sind sie genau aus solchen entstanden). Wer aber ohne Not DPs anwendet, holt sich unnötige Komplexität ins Haus. Das resultiert im bekannten "overengineering" und das wiederum führt gerne auch mal zum Scheitern eines Projekts.



  • Original erstellt von Dimah:
    hmm ich habe mich schon immer gefragt wieso ein compilier nicht zu compilier zeit merkt das die getinstanz() aufgerufen wird und dann die getinstanz umwandelet zu...

    weil er's nicht kann.
    Im Konstruktor vom Singleton SocketProvider wird die winsock.dll geöffnet. Sofern sie da ist, natürlich. Im Handbuch zum Programm steht: Falls die winsock.dll nicht da ist, dann versuchen Sie nicht, Dinge zu verschicken.

    Da ist ja der Witz am Meyers-Singleton. Das Objekt wird erst konstruiert, wenn (falls) es gebraucht wird. Dafür zahlt man bei jedem Zugrif die Kosten für ein if.

    Falls der Konstruktor nix schlimmes anstellt, darf der Compiler natürlich ein

    Bla& getInstance()
    {
      static Bla bla;
      return bla;
    }
    

    in ein

    static Bla bla;//ups, globale variable UND singleton auf einmal.
    //jetzt ist der schöne unterschied kaputt.
    Bla& getInstance()
    {
      return bla;
    }
    

    verwandeln.
    Andererseits darf das der Programmierer auch gerne selber tun. Er muß sich eh Gedanken machen, wann immer sein Objekt leben soll, sobald er mit Singleton-Dingen beginnt.



  • Original erstellt von volkard:
    Andererseits darf das der Programmierer auch gerne selber tun. Er muß sich eh Gedanken machen, wann immer sein Objekt leben soll, sobald er mit Singleton-Dingen beginnt.

    ich: ich will aber ne lib schreiben, die nicht nur ich benutzen soll
    fritz: dann teile die lib auf header auf und include nur das was du brauchst
    ich: aber dann habe ich immer noch das problem das mein singelton mehrfach instanzier werden kann
    fritz: fang das doch mit ein assert ab
    ich: aber ist so ein assert nicht schon aufwändiger als ein singelton? ich meine in der docu erwähnen wieso und wann usw. (und bevor die leute die docu lesen rätseln sie eine halbe stunde wieso es in diesem ctor ein assert gibt), bei ein singelton muss ich nicht viel erklären

    vielleicht mache ich mir das leben unötig schwer in den ich alles versuche in eine schöne(IMO) lib zu packen.
    ich hoffe das sich irgend wann mein code output mit den anderen messen kann nur das meiner schöner ist, da für trenniere ich, benutze singeltons in programmen die nur ich zu gesicht bekomme (ist der grund auch so ein lacher wie "globale variablen vermeiden"?)

    [ Dieser Beitrag wurde am 01.04.2003 um 01:27 Uhr von Dimah editiert. ]



  • Original erstellt von Dimah:
    ich: ich will aber ne lib schreiben, die nicht nur ich benutzen soll
    fritz: dann teile die lib auf header auf und include nur das was du brauchst
    ich: aber dann habe ich immer noch das problem das mein singelton mehrfach instanzier werden kann
    fritz: fang das doch mit ein assert ab
    ich: aber ist so ein assert nicht schon aufwändiger als ein singelton? ich meine in der docu erwähnen wieso und wann usw. (und bevor die leute die docu lesen rätseln sie eine halbe stunde wieso es in diesem ctor ein assert gibt), bei ein singelton muss ich nicht viel erklären

    versteh ich net. Natürlich ist ein assert ein Laufzeitfehler und daher böse. Ne globale Variable liegt in ner *.cpp und kann auch durch mehrfaches inkludieren der *.h dadurch nicht mehrfach angelegt werden. ob man jetzt den konstruktor dichtmacht, ist bei globale-var-singleton und bei meyers-singleton ne ganz andere frage. ich habs der einfachheit halber gelassen, und getInstance allein angeboten, denn der dichmachcode wäre bei beiden ja gleich.



  • Monostate (oder Borg)

    Was ist das? Wie wird es implementiert?


Anmelden zum Antworten