Kompakte Schreibweise bei Singleton



  • Hallo,

    ich habe gerade in meinem Programm die globalen Konstanten als Singleton implementiert (wie in "Design Patterns - Elements of Reusable Object-Oriented Software" beschrieben). Wenn ich nun auf die globale Konstante "theta" zugreifen will sieht das so aus

    Constants::instance()->theta()
    

    was für meinen Geschmack etwas lang ist. Fällt jemandem hier etwas ein außer

    • Makros
    • "Constants" und "instance" durch kürzere Bezeichner ersetzen?

    ?



  • typedef



  • typedef für eine Methode... alles klar...
    Ich benutze es ausgeschrieben, in einem Buch, das ich gelesen habe(Ich weiß nicht mehr ob es vl sogar Code Complete war) wurde die Makroversion benutzt.
    Ich sehe nicht unbedingt so einen großen Nachteil darin an dieser Stelle Makros zu benutzen, ich fand es nur unschön.
    edit: oh, sorry, das war ja gar nicht die Frage, aber vl ist es dennoch nicht ganz fehl am Platz.



  • Ich würds so machen:

    C::i()->t()
    

    Ist viel cooler so. Auf einen Buchstaben sollen immer mindestens 2 andere Zeichen kommen 🤡



  • Du kannst auch eine globale Referenz auf das Objekt erstellen. Meiner Ansicht nach schöner als Makros.



  • ingobulla schrieb:

    Wenn ich nun auf die globale Konstante "theta" zugreifen will sieht das so aus

    Constants::instance()->theta()
    

    Bei mir würde es etwa so aussehen:

    Constants::XYZ(); // XYZ stellvertretend für einen sprechenden Konstantennamen
    

    Weil ich das holen der Instanz in das Singleton selbst verlagere (Nachfolgend unter Verwendung des Meyer-Singletons, auf das wesentliche gekürzt...):

    class Constants
    {
        public:
           static long XYZ()
           {
               return instance().xyz;
           }
    
        private:
           Constants()
           : xyz(1234)
           {}
    
           static Constants& instance()
           {
               static Constants constants;
               return constants;
           }
    
           const long xyz;
    };
    

    cu André



  • ingobulla schrieb:

    ich habe gerade in meinem Programm die globalen Konstanten als Singleton implementiert

    Diese Designentscheidung würde ich mal überdenken, was soll denn das bringen? Mach sie statisch.



  • <Edit: Nicht genau genug gelesen xD>



  • grundsätzlich zur eigentlichen Frage: Du kannst von der Singletonklasse zwar kein eigenes Objekt erstellen, Referenzen/Zeiger sind dennoch drin. In deinem Fall ginge also sowas wie:

    Constants* pc = Constants::instance();
    pc->theta;
    

    Allerdings würde ich fürs singleton eine instance()-Methode vorziehen die eine Referenz zurückgibt. Das Hängt allerdings von der Implementierung ab.



  • Bashar schrieb:

    ingobulla schrieb:

    ich habe gerade in meinem Programm die globalen Konstanten als Singleton implementiert

    Diese Designentscheidung würde ich mal überdenken, was soll denn das bringen? Mach sie statisch.

    Das war ungenau von mir formuliert. Es handelt sich um globale Konstanten im Sinne der Berechnung, die das Programm durchführen soll. Das sind also nicht globale Konstanten im programmiertechnischen, sondern im mathematischen Sinne. So kann es durchaus Situationen (wenn auch recht wenige) geben, in denen es zulässig ist, den Wert der "globalen Konstante" theta zu ändern.



  • typedef constants<theta_tag, double> theta;
    
    void foo()
    {
        theta() = 0.5; // geht wenn man entsprechende operatoren definiert
        double x = theta(); // genauso
        // ...
    }
    

    ?

    ABER. Wozu zum Geier soll das gut sein? Ein solches "Singleton" ist um keine Spur besser als eine einfache dumme globale Variable.



  • ingobulla schrieb:

    Bashar schrieb:

    ingobulla schrieb:

    ich habe gerade in meinem Programm die globalen Konstanten als Singleton implementiert

    Diese Designentscheidung würde ich mal überdenken, was soll denn das bringen? Mach sie statisch.

    Das war ungenau von mir formuliert. Es handelt sich um globale Konstanten im Sinne der Berechnung, die das Programm durchführen soll. Das sind also nicht globale Konstanten im programmiertechnischen, sondern im mathematischen Sinne. So kann es durchaus Situationen (wenn auch recht wenige) geben, in denen es zulässig ist, den Wert der "globalen Konstante" theta zu ändern.

    Ich hab dich schon verstanden gehabt und bleibe dabei, Singleton ist hier nicht angebracht.



  • Bashar schrieb:

    ingobulla schrieb:

    Bashar schrieb:

    ingobulla schrieb:

    ich habe gerade in meinem Programm die globalen Konstanten als Singleton implementiert

    Diese Designentscheidung würde ich mal überdenken, was soll denn das bringen? Mach sie statisch.

    Das war ungenau von mir formuliert. Es handelt sich um globale Konstanten im Sinne der Berechnung, die das Programm durchführen soll. Das sind also nicht globale Konstanten im programmiertechnischen, sondern im mathematischen Sinne. So kann es durchaus Situationen (wenn auch recht wenige) geben, in denen es zulässig ist, den Wert der "globalen Konstante" theta zu ändern.

    Ich hab dich schon verstanden gehabt und bleibe dabei, Singleton ist hier nicht angebracht.

    Ein Sache, die ich mir vorstellen könnte, wäre, dass es verschiedene Sätze globaler Konstanten gibt, die man situationsabhängig wählen kann. Also statt

    Constants* Constants::instance()
    {
    	if (!m_instance)
    		m_instance = new Constants();
    	return m_instance;
    }
    

    dann

    Constants* Constants::instance()
    {
    	const char* constants_style = getenv("CONSTANTS_STYLE"):
    	if (!m_instance)
    		m_instance = new Constants(constants_style);
    	return m_instance;
    }
    


  • @ingobulla: das kann ich mit globalen Variablen genauso, da überschreib ich dann einfach alle Werte 🙂

    Singletons sind sowieso nur das "schöntrinken" von globalen Variablen. Wenn man sich die technische Seite anguckt wird das auch schnell klar. Wieso sollte man dann das eine als OK durchgehen lassen und das andere verteufeln?



  • Singletons sind auch kein Ersatz für globale Variablen. Das Singleton-Pattern hat den Sinn, mehrfache Instanziierung einer Klasse zu verhindern.



  • hustbaer schrieb:

    Singletons sind sowieso nur das "schöntrinken" von globalen Variablen. Wenn man sich die technische Seite anguckt wird das auch schnell klar. Wieso sollte man dann das eine als OK durchgehen lassen und das andere verteufeln?

    Zumindestens einen Vorteil haben sie: Die Initialisierungsreihenfolge ist definiert (Wichtig bei Abhängigkeiten). Wobei ich bei Einzelwerten einfache Funktionen mit einem statischen Wert der zurückgeliefert wird, vorziehe.


Log in to reply