Ankündigung

Einklappen
Keine Ankündigung bisher.

best practice - OOP Kern und Komponenten in Applikation wiederverwenden

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • best practice - OOP Kern und Komponenten in Applikation wiederverwenden

    Hallo zusammen,

    ich habe mich hier angemeldet, da ich anhand der Themen davon ausgehe, dass viele sich mit den Problemen und Methoden (mit denen ich gerade zu kämpfen hab) auskennen und mit weiterhelfen können.

    Mein Problem liegt eher am Design und zwar an der Wiederverwendbarkeit einzelner Komponenten.

    In meinem derzeitigem Projekt verwende ich ein sog. Backend mit folgenden Modulen (Auszug):
    - Cache
    - Session
    - Database

    Alle Module sollen nur jeweils einmal initialisiert werden. Dazu habe ich seither ein Singelton-Pattern verwendet:

    PHP-Code:
    public function indexAction()
    {
        
    $db Database::getInstance();
        
    $db->query('...');

    Mein Problem bei dieser Methode ist, dass es mmn. zuviele function-calls verursacht (genauso wie ein Registry-Pattern), welche ich gerne vermeiden möchte um die Laufzeit (bzw. den Stack) möglichst gering zu halten.

    Mein zweiter Versuch war, diese Module anhand meines MVC-Musters direkt in die Controller zu importieren:

    PHP-Code:
    // abstract controller
    public function __contruct()
    {
        
    $this->db = new Database();

    PHP-Code:
    // index-controller
    public function indexAction()
    {
        
    $this->db->query('...');

    Doch damit konnte ich mich irgendwie auch nicht richtig anfreunden. Zudem benötigt z.B. das Modul Session eine Instanz der Klasse Database und das Modul Cache eine Instanz der Klasse Session (wegen Benutzer spezifischen Sachen wie userID oder langID usw usf.).

    Meine Frage nun an auch: Wie handlet Ihr euer Backend und welches Pattern ist das sinnvollste?

    Ich hab mir zu diesem Thema schon einige Quelltexte angesehen. Aber leider setzen viele eben noch nicht auf php5 (geschweige denn php5.3). Im WBB3 arbeitet man mit einer verfremdeten Version des Registry-Pattern (WCF::getDB() etc.), doch da könnte man im Grunde auch direkt ein Singelton implementieren.

    Im Grunde geht es mir darum, einen guten Kompromiss von Performace und Usabiliy zu finden.

    // Ich verwende KEIN fertiges Framework


  • #2
    Hallo,

    so ganz wird mir dein Problem leider noch nicht klar!

    Dazu habe ich seither ein Singelton-Pattern verwendet:
    Was du uns da zeigst, ist nicht das Singleton-Muster, sondern eine Methode, die ein Datenbankobjekt erzeugt. Du meinst wohl, dass die Datenbankklasse nach dem Muster entworfen ist!?

    Mein Problem bei dieser Methode ist, dass es mmn. zuviele function-calls verursacht
    Was meinst du genau? Stört es dich, dass du in jeder Klasse oder Methode das Datenbankobjekt erzeugen musst?

    Du könntest das Datenbankobjekt in die Methoden oder in die Klassen injizieren.
    Code:
    public function indexAction(Database $db) {
      // ...
    }
    Dependency Injection – Wikipedia

    Gruß
    http://hallophp.de

    Kommentar


    • #3
      PHP-Code:
      $db Database::getInstance(); 
      Ist doch eindeutig ein Singelton oder nicht?

      Mit funktion-calls mein ich, dass am ende im php-opcode zu viele mmn. vermeidbare userland-Funktionen aufgerufen werden (ständig Foo::getInstance() oder Registry::get('foo') und der Gleichen). Daher suche ich eine bessere Lösung um Komponenten in anderen Klassen wiederzuverwenden.

      Ein "dependency injection" Muster wende ich derzeit schon an.
      PHP-Code:
      class Cache
      {
          public function 
      __construct()
          {
              
      // beispiel
              
      $user Session::getInstance()->getUser();
              
      $this->userID $user->getId();
              
      $this->langID $user->getLangId();
          }

      Mich interessiert einfach mal wie andere Profis das machen.

      Kommentar


      • #4
        Es heißt Singleton, herrgottnochmal!

        dass es mmn. zuviele function-calls verursacht
        2 Funktionsaufrufe sind jetzt zuviel oder wie? OOP arbeitet nunmal mit Methoden, da wirst Du ne Menge Calls haben.

        Schau Dir halt Dependency Injection an.

        [edit] Überlesen

        Ein "dependency injection" Muster wende ich derzeit schon an.
        Wo denn bitte? Jedenfalls nicht im Beispielcode.
        --

        „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


        • #5
          Und das weißt du anhand des codes? Kennst du meinen Quelltext? Woher weißt du denn ob ich in der Methode getUser nicht ein Factory-Pattern verwende? Oder ob in der Methode getInstance nicht auf ein ein statisches (static::$instance) zugegriffen wird? Was in etwa einem "dependency injection" Muster entspricht (Ich spreche nur die Basis-Klassen an).

          Mir ist klar das hier damit die Übergabe von benötigten Objekten als Attribut gemeint ist.

          Und wegen "Singleton", ich weiß ... da vertippe ich mich oft.

          Meine Frage richtete sich an euch und welches Muster ihr verwendet.

          Kommentar


          • #6
            Und das weißt du anhand des codes? Kennst du meinen Quelltext?
            Ja, das weiß ich genau dadurch.
            Woher weißt du denn ob ich in der Methode getUser nicht ein Factory-Pattern verwende? Oder ob in der Methode getInstance nicht auf ein ein statisches (static::$instance) zugegriffen wird?
            Weder Factory noch statische Zugriffe meinen DI. DI ist das hier:

            PHP-Code:
            $bar = new FooNeedsMe ($parameter);
            $foo = new Foo ($bar); // injection 
            meinetwegen auch mit Singleton oder Registry:
            PHP-Code:
            Registry::store ('FooNeedsMe' , new FooNeedsMe ($parameter));

            // later ..

            $baz FooNeedsMeToo::getInstance ();
            $bar Registry::restore ('FooNeedsMe');
            $foo = new Foo ($bar $baz); // injection 
            --

            „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


            • #7
              Meine Frage richtete sich an euch und welches Muster ihr verwendet.
              Es kommt nicht darauf an, welches Muster man verwendest, sondern welches für den Anwendungsfall am Geeignetsten ist.
              Und das weißt du anhand des codes?
              Du postest laufend Code, der nicht zu deinen Aussagen passt. Und aus diesem Codeschnipsel folgt eben diese Annahme.
              Mir ist klar das hier damit die Übergabe von benötigten Objekten als Attribut gemeint ist.
              Hier redest du von einer Eigenschaft, meinst aber einen Parameter.
              Es gibt Unterschiede zwischen Attributen und Parametern.
              http://hallophp.de

              Kommentar


              • #8
                Ja meine Argument, nicht Attribut - in der Hitze des Gefechts verwechselt.

                Ihr Klugscheißer

                Nochmal Registry- sowie Singelton-Pattern waren (bzw. sind) schon in Verwendung. Meine Frage bezog sich auf alternativen die ggf. performanter sind als gängige Sachen.

                DI kenne ich bereits (danke für die nochmalige Erklärung -.-), nur leider entspricht das nicht meiner Vorstellung, da ich immer wissen muss welche Abhängigkeiten eine Komponente hat und Config-Datein für jede Komponente kommen auch nicht in frage. Zur Laufzeit hab ich keine Zeit für solche Geschichten. Beim obigen Beispiel ggf. falsch verstanden.

                Anders als andere achte ich während dem Schreiben von Scripten auch, dass der code möglichst kurz ist und nicht unnötig viele aufrufe von userland-Funktionen dabei sind.

                Wie dem auch sei... Ich werd wohl bei Singleton bleiben.

                Kommentar


                • #9
                  da ich immer wissen muss welche Abhängigkeiten eine Komponente hat
                  Ja, so ist das bei gutem OOD. Ansonsten musst Du halt generische Ansätze suchen.

                  Zur Laufzeit hab ich keine Zeit für solche Geschichten.
                  Du scheinst generell keine Zeit zu haben. Z.B. dafür, Deine Problem hinreichend zu beschreiben, Deine Bedenken und Vorgaben, die jetzt nach 10 Postings so langsam eintrudeln. Oder dafür, Deine penetrante Singelton-Macke zu kontrollieren. Für Antworten auf solche Threads fehlt mir auch die Zeit.


                  //Raus
                  --

                  „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


                  • #10
                    Ich weiß ja nicht, was an
                    Meine Frage nun an auch: Wie handlet Ihr euer Backend und welches Pattern ist das sinnvollste?
                    Im Grunde geht es mir darum, einen guten Kompromiss von Performace und Usabiliy zu finden.
                    Schwer zu verstehen war?

                    Kommentar


                    • #11
                      wieso soll die DB Singleton sein ?
                      Was machst wenn Du mehrere DB-Verbindungen benötigst ?

                      Du versuchst globale Variablen (bzw. Objekte) durch die Hintertür einzuführen.
                      (Möglichst) alles soll von überall her erreichbar sein.
                      wohl damit der Code "schlank" ist.

                      Das hat natürlich mit OOP nichts mehr zu tun.

                      Hast Du denn ein Software-Design gemäß MVC oder wie sieht Dein Design aus ?

                      Meine Frage nun an auch: Wie handlet Ihr euer Backend und welches Pattern ist das sinnvollste?
                      sorry - aber die Frage ist doch ... Wieso sollte denn im Backend ein anderes Pattern angewendet werden als im Frontend ?

                      Im Grunde geht es mir darum, einen guten Kompromiss von Performace und Usabiliy zu finden.
                      lahme Performance ist im Sinn von Usability immer schlecht.
                      Meinst Du mit "usability" die Bedienbarkeit durch den User
                      oder die Bequemlichkeit des Programmmierers ?

                      Schwer zu verstehen war?
                      ja - drück Dich doch einfach klar aus.
                      Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.

                      Kommentar


                      • #12
                        Ich sehe überhaupt kein Problem darin, jede Menge Funktionsaufrufe zu haben.. Das erinnert mich etwas an die Diskussion, einfache oder doppelte Anführungszeichen zu benutzen.

                        Kommentar


                        • #13
                          Ich weiß ja nicht, was an
                          Schwer zu verstehen war?
                          Nichts. Nur stand darin noch nichts von unabhängigen Komponenten mit individuellen Schnittstellen etc.

                          Das erinnert mich etwas an die Diskussion, einfache oder doppelte Anführungszeichen zu benutzen.
                          mmd
                          --

                          „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
                            Zitat von Koala Beitrag anzeigen
                            wieso soll die DB Singleton sein ?
                            Was machst wenn Du mehrere DB-Verbindungen benötigst ?
                            Ja da hast du recht. Für solche Fälle (dich bisher noch nicht nicht hatte) bietet sich ein Singleton nicht an, aber wenn dann müsste ich mir was anderes überlegen.

                            Du versuchst globale Variablen (bzw. Objekte) durch die Hintertür einzuführen.
                            (Möglichst) alles soll von überall her erreichbar sein.
                            wohl damit der Code "schlank" ist.

                            Das hat natürlich mit OOP nichts mehr zu tun.
                            Vermutlich hatte ich in letzter Zeit zu viel mit JavaScript zu tun. Manchmal wünsche ich mir ein solches Verhalten auch in PHP

                            Hast Du denn ein Software-Design gemäß MVC oder wie sieht Dein Design aus ?
                            Ja MVC, wie im Startposting zu lesen war.

                            sorry - aber die Frage ist doch ... Wieso sollte denn im Backend ein anderes Pattern angewendet werden als im Frontend ?

                            lahme Performance ist im Sinn von Usability immer schlecht.
                            Meinst Du mit "usability" die Bedienbarkeit durch den User
                            oder die Bequemlichkeit des Programmmierers ?

                            ja - drück Dich doch einfach klar aus.
                            Mit "usability" meine ich, wie ICH selbst mein Backend möglichst performat und bequem in den Controllern und eben auch in Modulen ansprechen kann.

                            Der Benutzer bekommt davon nichts mit. Es geht hier rein um mich und meine Bequemlichkeit, du hast Recht

                            ------

                            Ich sehe überhaupt kein Problem darin, jede Menge Funktionsaufrufe zu haben.. Das erinnert mich etwas an die Diskussion, einfache oder doppelte Anführungszeichen zu benutzen.
                            Das ist ein Vorsatz den ich mir selbst gesetzt habe. Möglichst wenig "unnötigen" code für eine schnelle Ausführung. Man beachte den Ausdruck "userland"

                            Kommentar


                            • #15
                              sagmal, hast dich mal selbst beim reden gehört bzw. gelesen was du schreibst? Und dann sollen wir dir helfen? - wenn wir nichtmal wissen wobei und du keine zeit hast dein posting zu überarbeiten/überlesen..

                              Zitat von Murdoc Beitrag anzeigen

                              Ich sehe überhaupt kein Problem darin, jede Menge Funktionsaufrufe zu haben.. Das erinnert mich etwas an die Diskussion, einfache oder doppelte Anführungszeichen zu benutzen.
                              Das ist ein Vorsatz den ich mir selbst gesetzt habe. Möglichst wenig "unnötigen" code für eine schnelle Ausführung. Man beachte den Ausdruck "userland"
                              Dann erfinde aber bitte deine eigene sprache ohne Funktions- und Methodenaufrufe


                              @mods sry für ot :X

                              Kommentar

                              Lädt...
                              X