static class



  • Ist das dein Ernst? Normalerweise läuft euer System mit 0 Messsystemen (denn keiner hat eine Instanz erstellt, verwechsle nicht Klasse mit Objekt). Dann will jemand etwas von eurem physisch vorhandenen Messsystem und erstellt sich kurzerhand ein eigenes Messsystem? Das ist, als ob ich erwarten würde, dass das hier funktioniert:

    vector<int> foo;
    foo.push_back(1);
    foo.push_back(2);
    
    int getSize()
    {
        vector<int> bar;
        return bar.size();    // soll 2 zurückgeben
    }
    

    Übergib das Messsystem als Parameter oder noch besser, falls es möglich ist, nur die Werte, die das Messsystem geliefert hat (was interessiert es den Empfänger, woher die Werte kommen, wenn er nur mit diesen rechnen soll?). Aber wenn du doch selbst sagst, dass es nur ein Messsystem in deinem Use Case gibt, warum werden dann mehrere erstellt?



  • Hallo Michael,

    Aber wenn du doch selbst sagst, dass es nur ein Messsystem in deinem Use Case gibt, warum werden dann mehrere erstellt?

    Ich bin ja nicht der einzige welcher an unseren Applikationen oder der Bibliothek rumprogrammiert, ich muss es nur ausbaden wenn etwas nicht funktioniert 😉

    while (true)
    {
    Programmierer: "Wenn ich meine Komponente testen will,
    dann muss ich doch eine Instanz vom Mess-System erzeugen"
    Ich: "Erzeuge doch das Mess-System in der Testumgebung
    und übergebe den Pointer an Deine Komponente"
    Programmierer: "Ok, dann mach ich's halt so (müffel müffel)"
    2 Wochen später, nach erneuter Fehlersuche
    }

    Seitdem die Schnittstelle klar und es schlicht nicht mehr möglich ist mehrere Instanzen zu erzeugen funktioniert es auch.

    Herzliche Grüsse
    Walter



  • Michael E. schrieb:

    Hast du schon mal ein sinnvolles Singleton gebaut?

    Sicher. Nehmen wir z.B. mal WSAStartup() und WSACleanup(). Das eine muss ich vor dem Erstellen des ersten Sockets ausführen, das andere am Ende des Programms. Für sowas baue ich halt ein kleines unsichtbares Singleton. Ich könnte natürlich auch eine normale Klasse nehmen und ne globale Variable davon anlegen, aber es ist ja nun mal klar ersichtlich und erforderlich, dass nur genau eine Instanz dieser Klasse existiert. Aber wenn du eine schöne Alternative kennst, immer her damit.



  • statische Konstruktoren und Destruktoren :p



  • Kellerautomat schrieb:

    statische Konstruktoren und Destruktoren :p

    Ja ja, nur bitte nicht so wie du sie vor hast. 🤡



  • cooky451 schrieb:

    Michael E. schrieb:

    Hast du schon mal ein sinnvolles Singleton gebaut?

    Sicher. Nehmen wir z.B. mal WSAStartup() und WSACleanup(). Das eine muss ich vor dem Erstellen des ersten Sockets ausführen, das andere am Ende des Programms. Für sowas baue ich halt ein kleines unsichtbares Singleton. Ich könnte natürlich auch eine normale Klasse nehmen und ne globale Variable davon anlegen, aber es ist ja nun mal klar ersichtlich und erforderlich, dass nur genau eine Instanz dieser Klasse existiert. Aber wenn du eine schöne Alternative kennst, immer her damit.

    Jedes Socket kann das für sich machen, WSAStartup() und WSACleanup() zählen mit.



  • TyRoXx schrieb:

    cooky451 schrieb:

    Michael E. schrieb:

    Hast du schon mal ein sinnvolles Singleton gebaut?

    Sicher. Nehmen wir z.B. mal WSAStartup() und WSACleanup(). Das eine muss ich vor dem Erstellen des ersten Sockets ausführen, das andere am Ende des Programms. Für sowas baue ich halt ein kleines unsichtbares Singleton. Ich könnte natürlich auch eine normale Klasse nehmen und ne globale Variable davon anlegen, aber es ist ja nun mal klar ersichtlich und erforderlich, dass nur genau eine Instanz dieser Klasse existiert. Aber wenn du eine schöne Alternative kennst, immer her damit.

    Jedes Socket kann das für sich machen, WSAStartup() und WSACleanup() zählen mit.

    Nope.

    Nur weil aktuell kein Socket offen ist, will ich ja nicht zwangsläufig WSACleanup aufrufen. Etwas Singleton-artiges ist hier schon korrekt.



  • weicher schrieb:

    Seitdem die Schnittstelle klar und es schlicht nicht mehr möglich ist mehrere Instanzen zu erzeugen funktioniert es auch.

    Aber du bist doch derjenige, der den fremden Code aufruft oder nicht? Wenn du beim Aufruf eine Messsysteminstanz übergibst, muss der aufgerufene Code auch die Messsysteminstanz annehmen. Verwirft er die dann oder was? Wenn ich eine Messsysteminstanz übergeben bekomme, komme ich doch nicht auf die Idee und erstelle mir eine eigene Instanz.



  • cooky451 schrieb:

    Nehmen wir z.B. mal WSAStartup() und WSACleanup(). Das eine muss ich vor dem Erstellen des ersten Sockets ausführen, das andere am Ende des Programms. Für sowas baue ich halt ein kleines unsichtbares Singleton. Ich könnte natürlich auch eine normale Klasse nehmen und ne globale Variable davon anlegen, aber es ist ja nun mal klar ersichtlich und erforderlich, dass nur genau eine Instanz dieser Klasse existiert. Aber wenn du eine schöne Alternative kennst, immer her damit.

    Ich hab noch nie mit Sockets gearbeitet, weshalb ich nachfragen muss: Was spricht dagegen, WSAStartup beim Starten des Programms aufzurufen? Sprich WSAStartup als Erstes und WSACleanup als Letztes in der main.



  • Hallo Michael,

    Aber du bist doch derjenige, der den fremden Code aufruft oder nicht?

    Lies meinen letzen Post noch einmal sorgfältig durch.

    Normalerweise macht man in Komponenten in etwa folgendes:

    MeasSystem* measure = Object<MeasSystem> (_T("MeasSystem"));
      assert (measure != NULL);
      if (measure->GoOnline ())
      {
        ...
      }
    

    Da beim testen einer Komponente noch kein MessSystem existiert schlägt der
    assert (measure != NULL) zu.

    Was macht also der bequeme Programmierer (gibt's auch andere? 😉 )

    MeasSystem* measure = CreateObject<MeasSystem> ();
      assert (measure != NULL);
      if (measure->GoOnline ())
      {
        ...
      }
    

    Dann läuft sein Test...

    Herzliche Grüsse
    Walter



  • Michael E. schrieb:

    cooky451 schrieb:

    Nehmen wir z.B. mal WSAStartup() und WSACleanup(). Das eine muss ich vor dem Erstellen des ersten Sockets ausführen, das andere am Ende des Programms. Für sowas baue ich halt ein kleines unsichtbares Singleton. Ich könnte natürlich auch eine normale Klasse nehmen und ne globale Variable davon anlegen, aber es ist ja nun mal klar ersichtlich und erforderlich, dass nur genau eine Instanz dieser Klasse existiert. Aber wenn du eine schöne Alternative kennst, immer her damit.

    Ich hab noch nie mit Sockets gearbeitet, weshalb ich nachfragen muss: Was spricht dagegen, WSAStartup beim Starten des Programms aufzurufen? Sprich WSAStartup als Erstes und WSACleanup als Letztes in der main.

    Prinzipiell nichts. Bis auf dass es bei portablen Libraries halt unpraktisch ist.
    Wenn es aber eine reine Win32 Anwendung ist, spricht nichts dagegen. Es sei denn natürlich man erstellt einen Socket vor main()...



  • In Bezug auf die Socket-Geschichte sehe ich nicht, was man durch ein Singleton gewinnt. Bau eine kleine RAII-Klasse, die WSA* mamangt, dann kannst du sie socketweise benutzen oder dir irgendwo eine globale Konstante hinkloppen, wenn du lustig bist. Sie künstlich auf eine Instanz zu beschränken macht für mich keinen Sinn.

    Ansonsten gelten alle Vorbehalte gegen globale Variablen uneingeschränkt auch bei Singletons.



  • seldon schrieb:

    In Bezug auf die Socket-Geschichte sehe ich nicht, was man durch ein Singleton gewinnt. Bau eine kleine RAII-Klasse, die WSA* mamangt, dann kannst du sie socketweise benutzen oder dir irgendwo eine globale Konstante hinkloppen, wenn du lustig bist. Sie künstlich auf eine Instanz zu beschränken macht für mich keinen Sinn.

    Nope. Geht nicht wenn du Sockets jederzeit initialisieren willst. Man verwendet den Singleton einfach nur dafür, dass die Initialisierung stattfindet sobald sie gebraucht wird. Da gibts nix auszusetzen.

    Nennen wir es statt Singleton einfach das Initialization-on-demand holder idiom oder Construct on First Use Idiom und fertig 😉



  • Für Logdateien benutze ich auch Singletons. (Ein Log pro Programminstanz)

    EDIT: Mir fallen aber noch Einsätze ein, die eher schlecht sind, wie ein Gott Objekt Singleton. (Es kann nur einen geben! :D)



  • Nicht zu vergessen, wir leben in keiner perfekten Welt, oftmals bekommen wir auch Designfehler vererbt.
    Wenn eine Lib / Framework Singleton like Functionalitaet vorschreibt, wird man selbst auch kaum drumherumkommen ...

    Und so unbeliebt ist der Singleton-Ansatz bei frameworks scheinbar gar ned ...

    Ciao ...


Anmelden zum Antworten