Ankündigung

Einklappen
Keine Ankündigung bisher.

Verständnis: Design Patterns, Factorys, Singletons u. byRef

Einklappen

Neue Werbung 2019

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

  • Verständnis: Design Patterns, Factorys, Singletons u. byRef

    Hallo,

    ich hab teilweise Probleme damit zu wissen wann ich was verwenden sollte.

    Eine Factory verwende ich um den Code flexible und schlank zu halten zb. bei einer Datenbankklasse ... da wäre eine Factory sinnvoll um zb. ein MySQL-, Orcale- oder was-auch-immer-Objekt zu erstellen je nachdem was gerad gebraucht wird.

    Eine Singleton wäre Sinnvoll wenn ich von einer Klasse nur eine einmalige Instanzierung brauche.

    Referenzen im Construktor ok damit hab ich etwas Probleme nehmen wir noch mal die Datenbankklasse wäre es sinnvoll die durch die DB-Factory erstellte DB Klasse an eine andere Klasse byRef im Constructor zu übergeben oder sollte ich das anders lösen?

    Liege ich mit dem was hier soweit gesagt habe richtig?
    Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.


  • #2
    du hast zwar nicht viel gesagt, aber es ist schon richtig.

    zum ding mit den referenzen:
    es gibt mit OOP im prinzip nur zwei wege, um variabilität und flexibilität zu erreichen.
    der eine ist vererbung - indem du unterklasen von einem objekt bildest und in den unterklassen die einzelnen methoden selektiv überschreibst.

    der andere ist komposition - du kombinierst verhalten durch kombination und rekombination von mehreren objekten. hier kommt dein problem mit der referenz in den konstruktor: im prinzip kennen sich die einzelnen objekte und rufen sich gegenseitig auf. also müssen sie als parameter vorhanden sein.

    beispiel:
    PHP-Code:
    <?php
    class {

       function 
    aMethod() {
            echo 
    "A";
      }
    }

    class 
    {
      private 
    $a;
       function 
    __construct(A $a) {
         
    $this -> $a;
      }

      function 
    bMethod() {
          echo 
    "hello, i am " __CLASS__ ' and am about to call somebody: ' ;
          
    $this -> -> aMethod();
          echo 
    " .... and now i quit.";
      }
    }

    $a = new A();
    $b = new B($a);
    $b -> bMethod();
    ?>
    wie du siehst, hat B eine referenz auf A im konstruktor, und kann damit methoden aus A verwenden.




    beide möglichkeiten haben ihre vor- und nachteile - vererbung hat das problem, dass es mit der zeit immer aufwändiger wird, unterklassen von etwas zu bilden. mit objektkomposition ist man flexibler und kann dinge manchmal leichter basteln.
    allerdings hat man dann ab und zu das problem, dass man zu viele abhängigkeiten erzeugt und damit eine klasse nicht mehr ohne die andere verwenden kann - was genauso kacke ist.

    Kommentar


    • #3
      Zitat von axo
      hat B eine referenz auf A im konstruktor, und kann damit methoden aus A verwenden.
      Wieso muss es eine Referenz sein?
      privater Blog

      Kommentar


      • #4
        Zitat von Ben
        Wieso muss es eine Referenz sein?
        was meinst du?
        in php5 ist es ja wurscht, es wird beim methodeneintritt eh als referenz weitergegeben, aber in php4 würde man ohne & das objekt klonen, und das will man ja nur in den seltensten fällen.

        und das weitergeben von bereits erzeugen objekten und der verzicht auf 'new' vermindert den aufwand, eine einzelne klasse auszutauschen.

        Kommentar


        • #5
          PHP-Code:
          <?php
          ...
          function 
          __construct(A $a
          ...
          ?>
          Ist das ein Schfeibfehler von dir oder gehts neuerdings auch mit "A $a" ?
          Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

          Kommentar


          • #6
            Gähn...

            http://php.net/manual/en/language.oop5.typehinting.php

            Kommentar


            • #7
              Zitat von HStev
              PHP-Code:
              <?php
              ...

              ...
              ?>
              Ist das ein Schfeibfehler von dir oder gehts neuerdings auch mit "A $a" ?
              es ist kein schreibfehler. $a muss ein object von A sein.
              des sinn davon versteh ich auch nicht so richtig, da es ja auch ohne das A geht also:
              function __construct($a);
              und es kommt das selbe ergebnis raus

              eagleScripts.de

              Kommentar


              • #8
                Dabei geht einfach darum, die Schnittstelle klarer zu fassen. Wenn deine Methode per Definition schon nur eine Instanz der Klasse XY entgegennimmt, dann kannst du dir die Überprüfung innerhalb der Methode sparen, um eine (in diesem Punkt) korrkte Bedienung der Klasse zu gewährleisten (wobei auch hier noch einiges an Spielraum offen ist - siehe z.B. die Kommentare im Manual).

                Basti

                Kommentar


                • #9
                  Zitat von N!cKY
                  des sinn davon versteh ich auch nicht so richtig, da es ja auch ohne das A geht also:
                  function __construct($a);
                  und es kommt das selbe ergebnis raus
                  Der Sinn ist, daß es bei großen projekten eben nicht nur darum geht was rauskommt, sondern oft auch wie es gemacht ist. Vielleicht möchtest du als Autor eines Interfaces sicherstellen, daß einer Methode immer ein Objekt eines bestimmten Typs übergeben wird. Es verbessert außerdem die Lesbarkeit des Codes.

                  Kommentar


                  • #10
                    jaja ok!
                    noch ne frage:
                    was bringen einklich interfaces? man muss ja dann eh in der classe die das interface implementiert die methoden deklarieren!
                    also dient es nur zur übersichtlichkeit oder...?

                    eagleScripts.de

                    Kommentar


                    • #11
                      Zitat von N!cKY
                      jaja ok!
                      noch ne frage:
                      was bringen einklich interfaces? man muss ja dann eh in der classe die das interface implementiert die methoden deklarieren!
                      also dient es nur zur übersichtlichkeit oder...?
                      Das implementieren eines Interfaces kommt dem schließen eines Vertrages gleich. Die Vertragsbedingnugen dabei sind, daß die im Interface definierten methoden Implementiert werden müßen. Sinnvoll ist die Verwendung eines Interfaces wenn Du einen Satz von Klassen hast und einen Grundtyp für diese definieren willst. Du könntest jetzt einen anderen Programmierer bitten eine weitere Klasse für Dich zu programmieren, solange er Dein Interface implementiert wird diese Klasse mit deinem restlichen Code problemlos funktionieren.
                      Einfach ausgedrückt ist ein Interface eine Oberklasse, man benutzt sie wenn die Implementierung der einzelnen Methoden den Unterklassen überlassen will, andernfals benutzt man eine Abstrakte Klasse.
                      Es gibt ja dieses bekannte Designprinzip "Program to an interface, not an implementation", das bedeutet jedoch nicht, daß man für alles ein Interface schreiben muß, das Interface kann in auch eine Abstrakte Klasse sein.

                      Kommentar


                      • #12
                        Ich schließe mich da mal an:
                        Ich habe http://de3.php.net/manual/en/language.oop5.patterns.php über Factories gelesen und verstehe das nun so, dass die Factory-Klasse den Zweck hat, nicht immer alle Klassen einbinden zu müssen, sondern nur bei Bedarf!?
                        Ich habe das mal ausprobiert und bei meinen Klassen Probleme bekommen, die Konstruktoren verwenden.

                        Kann mir jemand mal den genauen Factory-Sinn erklären (wann man das genau verwendet/verwenden sollte und wie man mit Konstruktoren umgeht)? Und wann sollte man __autoload() verwenden - ist das nicht einfacher als die Factory, bzw. wie kann ich das voneinander abgrenzen?

                        Ist die Factory nicht auch eine Klasse nach dem "singleton"-pattern, da es sie ja nur einmal geben sollte? Oder ist das hier unwichtig, da Factory gar nicht als Objekt erzeugt wird?

                        Viele Grüße,
                        André

                        Kommentar


                        • #13
                          Zitat von creative-w3.de
                          Ich habe http://de3.php.net/manual/en/language.oop5.patterns.php über Factories gelesen und verstehe das nun so, dass die Factory-Klasse den Zweck hat, nicht immer alle Klassen einbinden zu müssen, sondern nur bei Bedarf!?
                          Der Sinn und Zweck einer Factory ist die Erzeugung von Objekten, dessen Einsatz ist ein gutes Beispiel des von mir schon angesprochenen Designprinzips "Program to an interface, not an implementation". Wenn die von der Factory erzeugten Objekte ein gemeinsames Interface haben können diese beliebig ausgetauscht werden. Mit der Factory kannst Du also zentral steuern welche Objekte erzeugt werden sollen und mußt bei Änderungen nur an einer Stelle den Code ändern, den Vorteile davon muß ich wohl nicht näher erleutern. Das alles funktioniert natürlich nur wenn es ein gemeinsames Interface gibt, wobei das Wort "Interface" nicht wörtlich zu nehmen ist, eine Abstrakte Klasse tut es auch.
                          Mit __autoload() hat das alles wenig zu tun, bzw. das kann nicht funktionalität einer Factory ersetzen. Je weniger new Operatoren in deinen Klassen stehen desto weniger Abhängigkeiten haben sie, bzw. desto besser kannst Du sie wiederverwenden.
                          Die von der Factory erzeugten Objekte können natürlich auch Singletons sein.

                          Kommentar


                          • #14
                            Zitat von axo
                            Zitat von Ben
                            Wieso muss es eine Referenz sein?
                            was meinst du?
                            in php5 ist es ja wurscht
                            Hat sich damit erledigt .. PHP 4 gibt es für mich nicht mehr.

                            Danke für die Antwort.
                            privater Blog

                            Kommentar


                            • #15
                              Zitat von N!cKY
                              des sinn davon versteh ich auch nicht so richtig, da es ja auch ohne das A geht also
                              Der Sinn davon ist mir klar wusste blos nicht das dies in PHP nun auch möglich ist.
                              Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

                              Kommentar

                              Lädt...
                              X