Ankündigung

Einklappen
Keine Ankündigung bisher.

Singleton vs. new Object ()

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Singleton vs. new Object ()

    Hallo zusammen,

    momentan arbeite ich an einem Webshop. Dazu gehört natürlich eine dynamische Menügenerierung. Über folgenden Aufruf lasse ich mir ein Menü ausgeben:

    PHP-Code:
    Menu::getInstance()->plotMenuCoupled($lang7$sec3'menu');
    Menu::getInstance()->plotMenuCoupled($lang3$cat2'menu'); 
    Die Menü-Klasse habe ich nach dem Singletonmuster angelegt. Wenn ich nun die Klasse entsprechend abändere, kann ich ein Menü auch folgendermaßen aufrufen:

    PHP-Code:
    $menu = new Menu();
    $menu->plotMenuCoupled($lang7$sec3'menu');
    $menu->plotMenuCoupled($lang3$cat2'menu'); 

    Mir ist klar, dass Ersteres Vorgehen verhindert, dass von der Klasse Menu mehr als ein Objekt erzeugt wird. Inwiefern ist es besser/schlechter, wenn ich die Menüs über new Menu() aufrufe?


  • #2
    IMHO braucht man an der Stelle keinen Singelton. Der Singelton an sich soll gewährleisten, dass von deinem Objekt nur eine Instanz initialisiert wird, das ist aber beim Menü nicht notwendig!
    "My software never has bugs, it just develops random features."
    "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

    Kommentar


    • #3
      Sofern du ein Pattern anwendest, solltest du zunächst das WARUM verstehen nicht umgekehrt. Lies dir mal die Beschreibung und die Rahmenbedingungen genau durch!
      Viele Grüße,
      Dr.E.

      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      1. Think about software design before you start to write code!
      2. Discuss and review it together with experts!
      3. Choose good tools (-> Adventure PHP Framework (APF))!
      4. Write clean and reusable software only!
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      Kommentar


      • #4
        Soweit vielen Dank für die Antworten. Irgendwie hatte ich schon vermutet, dass das Singleton-Muster bei meinem Menü ziemlich sinnlos ist.

        Wenn ich das richtig verstanden habe, macht das Singleton-Muster bspw. bei einer Datenbankverbindung Sinn, korrekt?
        Bspw. habe ich einen Bestellprozess als Klasse realisiert. In diesem Fall ist Singleton ebenfalls angebracht?

        Kommentar


        • #5
          Nicht wirklich. Es kann ja theoretisch mehrere Datenbankverbindungen geben und möglicherweise auch mehrere Bestellvorgänge.

          Kommentar


          • #6
            Okay, mehrere Datenbankverbindungen ist akzeptiert. Aber mehrere Bestellvorgänge? Ich meine, dass es schließlich ein Vorgang ist, wenn ich eine Bestellung abschicke (Adressdaten eintippe, Versand auswähle etc.).

            Könnt Ihr mir praxisorientierte Beispiele nennen, bei denen das Singleton-Muster Sinn macht? Vielleicht wird es mir dann klarer.

            Kommentar


            • #7
              Wenn du dein Datenbankobjekt parametrisiert erzeugst, würde das Singletonmuster dort schon Sinn ergeben. Du brauchst ja nicht mehrere Objekte für ein und dieselbe Verbindung, sondern verschiedene Objekte für verschiedene Datenbanken.
              http://hallophp.de

              Kommentar


              • #8
                Es können einige Dinge mit einem Singleton Pattern gelöst werden. ABER die Frage ist immer ob man es nicht vermeiden kann. Denn Singletons bringen so einige Probleme mit sich.

                Beim Zend Framework wird z.B. der FrontController als Singleton verwendet. Der FrontController steuert den ganzen Ablauf im Framework, also wann das Routing stattfindet, wann und welcher Controller geladen wird, welche Action ausgeführt wird und wann die Ausgabe erfolgt.

                Allerdings würde sich dieses Singleton vermeiden lassen. Ich würde so gut wie es geht aufs Singleton Pattern verzichten.

                Kommentar


                • #9
                  Ich erzeuge meine Datenbankverbindung parametrisiert. Für einen gewöhnlichen Webshop ist eine Datenbank wohl ausreichend.

                  Bei meinem Bestellprozess habe ich ähnliche Gedanken wie bei dem FrontController. Die Bestellprozess-Klasse steuert den Bestellvorgang und zeigt je nach validierter Dateneingabe den entsprechenden Schritt an bzw. erzeugt Fehler, falls Eingaben fehlerhaft sind. Wurden alle Eingaben getätigt, wird der letzte Schritt freigegeben. Emails werden versandt, die Session wird gelöscht. Daher dachte ich, dass ein Singleton-Muster in diesem Fall Sinn macht.

                  Kommentar


                  • #10
                    Zitat von Asipak Beitrag anzeigen
                    Wenn du dein Datenbankobjekt parametrisiert erzeugst, würde das Singletonmuster dort schon Sinn ergeben. Du brauchst ja nicht mehrere Objekte für ein und dieselbe Verbindung, sondern verschiedene Objekte für verschiedene Datenbanken.
                    Wieso dann keine Registry nutzen?

                    Kommentar


                    • #11
                      Worauf zielt dieser Thread ab?

                      - Was ist eine sinnvolle Anwendung für Singletons?
                      oder
                      - Ist ein Menücontroler ~

                      Frage 2 scheint mir eindeutig mit NEIN zu beantworten. Ich kann mir jedenfalls gut einen Shop vorstellen, der eine Haupt-Navi mit einigen wichtigen Kategorien hat, oder ein zusätzliches Favoritenmenü für Kategorien, aus denen ich schon mal Produkte bestellt habe oder dergl.
                      --

                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                      --

                      Kommentar


                      • #12
                        @ nikosch

                        Wenn ich dich richtig verstehe, ist deiner Meinung nach mein Menücontroler kein Fall für das Singleton-Muster?
                        Auf jeden Fall komme ich mit meiner momentan Singleton-Klasse bestens zurecht. Ich erzeuge damit insgesamt drei Navis, zwei werden mit der Tabelle "menu" gefüttert, eine mit der "products" Tabelle.

                        Mir geht es darum, ob die Anwendung des Singleton-Musters in diesem Fall "falsch" ist?

                        Zudem wäre ich natürlich erfreut, wenn du mir sinnvolle Singleton-Anwendungen zeigen kannst. Wie schon gesagt, habe ich meine Datenbank-Klasse als Singleton realisiert. Und ich behaupte, dass es in diesem Fall sinnvoll ist (mal abgesehen von theoretisch mehreren Datenbankverbindungen, die in meinem Fall nicht von Bedeutung sind). Daraufhin meinte Flor1an, dass statt Singleton auf Registry zurückzugreifen ist.

                        Meine berechtigte Frage an dieser Stelle: Wozu überhaupt Singleton?

                        Kommentar


                        • #13
                          Auf jeden Fall komme ich mit meiner momentan Singleton-Klasse bestens zurecht. Ich erzeuge damit insgesamt drei Navis, ....
                          Mir geht es darum, ob die Anwendung des Singleton-Musters in diesem Fall "falsch" ist?
                          Wenn Du mit einem Singleton mehrere Instanzen erzeugst, dann ist die Antwort: Ja.

                          Zudem wäre ich natürlich erfreut, wenn du mir sinnvolle Singleton-Anwendungen zeigen kannst.
                          ..
                          Singleton vs. Registry() vs. new Object() - Ich sehe den Wald vor lauter Bäumen nicht.
                          Der Doc hat recht - Ein Pattern folgt dem Anwendungsfall, nicht anders herum. Klar - man muss die Dinger irgendwie lernen, aber künstliche den Anwendungsfall Singleton zu konstruieren ist Unsinn.

                          mal abgesehen von theoretisch mehreren Datenbankverbindungen, die in meinem Fall nicht von Bedeutung sind
                          Was heute gilt, kann morgen anders sein. Eine gewisse Weitsicht ist gerade beim Softwareentwurf wichtig.
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar


                          • #14
                            Um das ganze zu konkretisieren: Ich rufe in meiner Index folgendes auf:

                            PHP-Code:
                            Menu::getInstance()->plotMenuCoupled($lang7$sec3'menu');
                            Menu::getInstance()->plotMenuCoupled($lang0$cat2'categories');
                            Menu::getInstance()->plotMenuCoupled($lang0$cat1'menu'); 
                            Meinem Verständnis nach erzeuge ich damit nicht mehrere Instanzen. Also ist meine Anwendung doch nicht falsch?


                            Was die Weitsicht angeht: Wichtiger Punkt, da stimme ich dir zu. Sollte allerdings solch ein Fall eintreten, werde das garantiert nicht mehr ich übernehmen, sondern Profis engagieren, die sich um eine entsprechende Shop-Lösung kümmern. Schließlich betreibe ich das Programmieren nur in meiner Freizeit.

                            Kommentar


                            • #15
                              Zitat von Trainmaster Beitrag anzeigen
                              Um das ganze zu konkretisieren: Ich rufe in meiner Index folgendes auf:

                              PHP-Code:
                              Menu::getInstance()->plotMenuCoupled($lang7$sec3'menu');
                              Menu::getInstance()->plotMenuCoupled($lang0$cat2'categories');
                              Menu::getInstance()->plotMenuCoupled($lang0$cat1'menu'); 
                              Meinem Verständnis nach erzeuge ich damit nicht mehrere Instanzen. Also ist meine Anwendung doch nicht falsch?
                              Besser wäre es wnen es eine Klasse Menü gäbe und für jedes Menü eine Objektinstanz Menü erzeugt würde.

                              Das ist der Sinn hinter der objektorientierten Programmierung.
                              "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

                              Kommentar

                              Lädt...
                              X