Singleton oder "rein statische" Klasse



  • Original erstellt von <C++0x>:
    **wäre das nicht eine gute Idee für C++0x ?
    **

    naja denke nicht, c++ ist jetzt schon mit syntax und co. überladen



  • Original erstellt von wischmop2:
    Trotzdem weiss ich nicht, wozu man sich die Mühe machen soll, erst einen objektorientieren Ansatz zu wählen, wenn man anschliessen gewaltsam mit Singleton-Eigenschaften diesen Ansatz wieder auf nicht OOP-Elemente reduziert.

    ???

    Ein Singleton ist doch gerade ein OOA-Element... man erkennt, daß genau _eine_ Instanz einer Klasse notwendig ist und setzt dafür diese Vorgehensweise ein, um die Stückzahl zu limitieren.



  • /me schließt sich Marc++us an

    warum denkt ihr, dass eine Klasse bestehend aus static Methoden schöner ist, als ein Singleton?

    vorallem: eine klasse mit nur static Methoden hat einen großen nachteil: man kann nicht gut von ihr erben.

    wie sieht es mit dem Ctor aus? wann wird er aufgerufen? den muss man anscheinend explizit aufrufen, zumindest fällt mir keine möglichkeit ein.



  • Hallo,
    ich habe es schonmal geschrieben und schreibe es auch nochmal:
    Singleton != Static Data + Static Functions.

    Vielleicht sollte ihr erstmal über das DP lesen (z.B. im GoF-Book oder im CUJ-Ausgabe 2/2003) bevor ihr drüber redet. Die wichtigsten Eigenschaften von Singletons wurden in diesem Thread noch überhaupt nicht genannt.

    Das Problem ist, dass scheinbar nur wenige die Vorteile von Singletons kennen, trotzdem aber alle welche benutzen. Und dabei leider vergessen, dass *jedes* DP seine eigene Komplexität mit sich bringt.

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

    [ Dieser Beitrag wurde am 30.03.2003 um 19:00 Uhr von HumeSikkins editiert. ]



  • Wäre ein Singleton als Sammlung von Funkionen und Variablen gedacht, würde sie tatsächlich keiner Verwenden.

    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.



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


Anmelden zum Antworten