Ankündigung

Einklappen
Keine Ankündigung bisher.

Video Diskussion: Wieso man extends vermeiden sollte und was gibt es als alternative?

Einklappen

Neue Werbung 2019

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

  • #46
    Zitat von BlackScorp Beitrag anzeigen
    Ja Fabien hat auch Ahnung von, desswegen gibt es ja den MicroKernelTrait

    https://symfony.com/doc/current/conf...nel_trait.html

    für mich ist es halt nur noch eine weitere Bestätigung, dass man eher auf Trait als auf extends zugreifen muss.
    Die Annahme kann ich nicht nachvollziehen. Nur weil es dort Traits gibt, wird aber an keiner Stelle suggeriert, dass man es extends vorziehen sollte, wie es in deinem Video dargestellt ist.
    Schau Dir mal die Beispiele auf der von Dir verlinkten Seite genau an, dort wird das Trait nicht anstelle von extends verwendet, sondern in Kombination. Das Trait hat an der Stelle seine Funktion ( vielleicht auch Berechtigung ), schließt aber extends nicht aus.

    Der verlinkte Artikel bestätigt aus meiner Sicht in keinster Weise Deine Aussagen, sorry.

    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #47
      Zitat von BlackScorp Beitrag anzeigen
      Ja Fabien hat auch Ahnung von, desswegen gibt es ja den MicroKernelTrait

      https://symfony.com/doc/current/conf...nel_trait.html

      für mich ist es halt nur noch eine weitere Bestätigung, dass man eher auf Trait als auf extends zugreifen muss. Du hast da halt immer noch die Möglichkeit den Trait nicht zu nutzen und stattdessen deine Methode zu verwenden, schütz dich selbst dadurch auch, denn du weiß nie was der Entwickler mit der Basis Klasse so anstellt.

      Kannte ich nicht, thx.
      ein trait nutzen um abstracte methoden in die klasse zu injizieren ?
      auch eine möglichkeit mussmal drüber nachdenken, hab ich noch nicht gesehen...

      Kommentar


      • #48
        Ich greife an dieser Stelle nochmal dieses Beispiel aus der PayPal-API auf.
        Da schließe ich mich der Meinung an, dass das ein Beispiel für unnötige Vererbung ist. In jedem meiner Projekte sind die toArray- und fromArray-Methoden als Interface + Trait abgebildet; der Code würde sonst viel zu wild aussehen wenn auf einmal 15 verschiedene Models die gleiche Basisklasse haben.

        Ein weiteres schönes Beispiel für den Einsatz von Traits sind für mich die Methoden des Subjects aus dem Observer-Pattern.
        attach(Observer);
        detach(Observer);
        notify();

        Diese 3 Sachen laufen ja meistens sehr ähnlich ab, also.. schnell einen Trait (+Interface) erstellt der die Methoden so simpel wie möglich implementiert (und noch das Array mit den gesammelten Events und Observern mitbringt) und in die Subject-Klassen eingebunden.. spart wieder etwas Schreibarbeit und verbaut die Vererbung nicht.
        Das könnte man auch über Vererbung umsetzen, aber sobald man dann Subjects verschiedener Klassentypen hat wird es damit schnell wieder seltsam. "CsvReader extends Subject", "XmlWriter extends Subject" - Vielleicht möchte ich aber auch mal abstrakte Reader und Writer (+ konkrete Reader und Writer) haben, die nicht standardmäßig beobachtet werden können sollen :<

        Zitat von jspit Beitrag anzeigen
        Vererbung und Traits sind Mechnismen der PHP-Programmierung, die beide ihre Berechtigung haben. Richtiger Einsatz der Mechanismen vorausgesetzt.
        Jo!

        ein trait nutzen um abstracte methoden in die klasse zu injizieren ?
        Ye! Über Traits Template Methods umzusetzen ist eine coole Idee.
        https://en.wikipedia.org/wiki/Template_method_pattern
        Relax, you're doing fine.
        RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

        Kommentar


        • #49
          Welche Möglichkeiten Traits allgemein bieten können, halte ich persönlich für den Kernpunkt dieses Thema für irrelevant.
          Wenn ich mir die PHP Doku mal als Basis nehme ( gekürzt und markantes hervorgehoben! ):
          Traits sind ein Mechanismus zur Wiederverwendung von Code, der in Programmiersprachen mit einfacher Vererbung wie PHP verwendet wird. Ein Trait kann verwendet werden, um den Beschränkungen der einfachen Vererbung auszuweichen, indem er erlaubt, dass Mengen von Methoden frei in mehreren unabhängigen Klassen, die in verschiedenen Klassenhierarchien stecken, wiederzuverwenden.
          [...]
          Ein Trait hat Ähnlichkeit mit einer Klasse, ist aber nur dafür vorgesehen, Funktionalität in einer feingranularen und konsistenten Art und Weise zu bündeln.
          [...]
          Es handelt sich um einen Zusatz zur traditionellen Vererbung und erlaubt horizontale Komposition von Verhaltensweisen, d.h. die Verwendung von Klassenmethoden ohne Vererbung vorauszusetzen.
          Darin findet sich die klare Aussage, dass Traits in PHP eingeführt wurden, um eine Möglichkeit zu bieten, die fehlende Mehrfachvererbung zu kompensieren.
          So jedenfalls meine Interpretation der Doku.

          Heißt: Traits sind kein Ersatz für Vererbung ( extends ), sondern dienen eher als Erweiterung der (Einfach-)Vererbung.
          Und hier ging es ja im allgemeinen darum, ob die Aussage des Video: Traits als Alternative zu extends so korrekt dargestellt ist. Ich würde weiterhin sagen: Nein!
          Je mehr diskutiert wird, desto mehr wird klar, dass BlackScorp das so sicher nicht meinte, dennoch wird jeder Anfänger/Einsteiger, der dieses Video ansieht genau die Suggestion erhalten.
          Das ist halt das blöde an der Geschichte.
          Competence-Center -> Enjoy the Informatrix
          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

          Kommentar


          • #50
            Zitat von Arne Drews Beitrag anzeigen
            Welche Möglichkeiten Traits allgemein bieten können, halte ich persönlich für den Kernpunkt dieses Thema für irrelevant.
            Wenn ich mir die PHP Doku mal als Basis nehme ( gekürzt und markantes hervorgehoben! ):

            Darin findet sich die klare Aussage, dass Traits in PHP eingeführt wurden, um eine Möglichkeit zu bieten, die fehlende Mehrfachvererbung zu kompensieren.
            So jedenfalls meine Interpretation der Doku.

            Heißt: Traits sind kein Ersatz für Vererbung ( extends ), sondern dienen eher als Erweiterung der (Einfach-)Vererbung.
            Und hier ging es ja im allgemeinen darum, ob die Aussage des Video: Traits als Alternative zu extends so korrekt dargestellt ist. Ich würde weiterhin sagen: Nein!
            Je mehr diskutiert wird, desto mehr wird klar, dass BlackScorp das so sicher nicht meinte, dennoch wird jeder Anfänger/Einsteiger, der dieses Video ansieht genau die Suggestion erhalten.
            Das ist halt das blöde an der Geschichte.
            Ja Mist, meine Kernaussage war eigentlich ja, "extends" ist nicht so einfach zu nutzen wie ihr denkt (selbst erfahrene Entwickler machen das falsch), nutzt extends im ersten Moment NICHT sondern baut zunächst ein final rein als kleiner "Hinderniss". Ähnlich wie die Bestätigung beim Löschen von Datensätzen wo gefragt wird ob man sich sicher sei dass der Datensatz gelöscht werden soll.

            Damit man dann eben wegen Stress/Zeitmangel/Schlechten Tag etc nicht einfach blind ableitet, soll man kurz abgebremst werden und dann sich gedanken machen. Brauch ich an der Stelle ein Ableitung? Wenn ja kein Problem extends dran, final weg = Profit. Braucht ihr die Ableitung aber nur um auf eine bestimmte Methode zu zugreifen und der Klassen Typ ist nicht wirklich ableitbar, dann nutzt ein Trait im Zweifel.

            Mit extends Baut man sich Abhängigkeiten ein. Wenn ich eine Klasse zur Verfügung stelle, dann muss ich immer an den Fall denken, jemand könnte meine Klasse abgeleitet haben also muss ich immer aufpassen was ich mit der Basis Klasse mache. Wenn ich eine externe Klasse ableite, habe ich auch das Problem dass jederzeit, seblst bei security patches, dann ein Update reinkommen kann der mir alles kaputt macht.

            Bei Traits hat man das gleiche Problem, jedoch kann man ein Trait einfach kopieren und die Kopie dann im Refactoring nutzen, temporär, desswegen bevorzuge ich Traits als extends.

            Im Nachgang kam es im Video sicher nicht so rüber.. in 5 Jahren, sobald ich besser vor der Kamera reden kann und bessere Sätze bilden kann, werde ich die Videos neu drehen. Die Gesammte Situation zeigt halt dass ich mich nicht klar und eindeutig artikulieren kann, sowas muss geübt werden.


            Arne Drews das mit Fabien, ich da davon ausgegangen weil eben Fabien selbst eine Zeitlang Silex gepflegt hat und dann anschließend ja dann der MicroKernel rausgekommen ist. Ich nehme an, dass er auch gesehen hat dass Application eben kein Container ist. Aber das ist nur ein Vermutung.
            apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/witalimik

            Kommentar


            • #51
              Zitat von BlackScorp
              Die Gesammte Situation zeigt halt dass ich mich nicht klar und eindeutig artikulieren kann, sowas muss geübt werden.
              Das ist aber vollkommen normal.
              Das Thema ist komplex, da kann an vielen Stellen immer wieder mal was rein interpretiert werden, was Du so gar nicht gemeint hast. Alles korrekt darzustellen ist in so einem Video gar nicht möglich, denke ich. Auch nicht in 5 Jahren
              Competence-Center -> Enjoy the Informatrix
              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

              Kommentar


              • #52
                Ich bin verwundert dass Composition als Alternative noch gar nicht genannt wurde. Für mich persönlich gehören Traits zu den Bestandteilen von PHP die ich konsequent überhaupt nicht nutze, weil sie die Situation meines Erachtens ebenso leicht verschlimmbessern wie falsch angewandte Vererbung.

                Kommentar


                • #53
                  Zitat von lottikarotti Beitrag anzeigen
                  Ich bin verwundert dass Composition als Alternative noch gar nicht genannt wurde. Für mich persönlich gehören Traits zu den Bestandteilen von PHP die ich konsequent überhaupt nicht nutze, weil sie die Situation meines Erachtens ebenso leicht verschlimmbessern wie falsch angewandte Vererbung.
                  Was kann denn denn verschlimmbessert werden?

                  Composition habe ich erwähnt mit meinen "KannFliegen" und "KannEssen" man würde quasi ein Objekt anlegen der implementiert die "KannIrgendwas" interfaces und bei bedarf dann die dazugehörigen Traits. Du baust dir quasi via Komposition ein Objekt mit bestimmten "Fahigkeiten" zusammen. Wobei man auch hier natürlich aufpassen muss dass man am Ende nicht ein Godobjekt hat.

                  Ich habe es aber natürlich nicht so explizit gesagt. Ich bin eher der Fan von Composition over Inheritance und Trait ist eine meinr Meinung nach eine gute Möglichkeit sowas abzubilden.

                  apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/witalimik

                  Kommentar


                  • #54
                    Zitat von Arne Drews Beitrag anzeigen
                    Das ist aber vollkommen normal.
                    Das Thema ist komplex, da kann an vielen Stellen immer wieder mal was rein interpretiert werden, was Du so gar nicht gemeint hast. Alles korrekt darzustellen ist in so einem Video gar nicht möglich, denke ich. Auch nicht in 5 Jahren
                    Kleiner Rant am Rande

                    https://phpunit.de/getting-started/phpunit-8.html schau dir mal die Beispiele an
                    apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/witalimik

                    Kommentar


                    • #55
                      Zitat von BlackScorp Beitrag anzeigen

                      Kleiner Rant am Rande

                      https://phpunit.de/getting-started/phpunit-8.html schau dir mal die Beispiele an

                      Das ist ja das gleiche wie ich in #34 gesagt habe, wo final Sinn macht.

                      Kommentar


                      • #56
                        Zitat von Zeichen32 Beitrag anzeigen


                        Das ist ja das gleiche wie ich in #34 gesagt habe, wo final Sinn macht.
                        Die klasse src/Email.php macht ja nicht explizit direkt Sinn. Du könntest ja eine TextEmail haben und eine HTMLEmail die dann von Email ableiten

                        Schau mal, phpspec macht das sogar als Regel

                        https://github.com/phpspec/phpspec/w...ding-standards

                        Dann https://matthiasnoback.nl/2018/09/fi...y-default-why/ ein PHP Entwickler der schon einige Bücher geschrieben hat

                        https://ocramius.github.io/blog/when...classes-final/

                        Es geht darum den Sinn im nachhinein zu ermitteln.
                        apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/witalimik

                        Kommentar


                        • #57
                          Zitat von BlackScorp Beitrag anzeigen

                          Die klasse src/Email.php macht ja nicht explizit direkt Sinn. Du könntest ja eine TextEmail haben und eine HTMLEmail die dann von Email ableiten

                          Schau mal, phpspec macht das sogar als Regel

                          https://github.com/phpspec/phpspec/w...ding-standards

                          Dann https://matthiasnoback.nl/2018/09/fi...y-default-why/ ein PHP Entwickler der schon einige Bücher geschrieben hat

                          https://ocramius.github.io/blog/when...classes-final/

                          Es geht darum den Sinn im nachhinein zu ermitteln.
                          Ich bezog mich auf den Test, die E-Mail Klasse hab ich gar nicht beachtet.
                          Bei der E-Mail Klasse würde final Sinn machen, wenn Sie ein Interface implementiert und als "fertig" gelten soll. Wie in dem Beispiel macht final dort aber wirklich keinen Sinn.

                          Kommentar


                          • #58
                            Zitat von Zeichen32 Beitrag anzeigen

                            Ich bezog mich auf den Test, die E-Mail Klasse hab ich gar nicht beachtet.
                            Bei der E-Mail Klasse würde final Sinn machen, wenn Sie ein Interface implementiert und als "fertig" gelten soll. Wie in dem Beispiel macht final dort aber wirklich keinen Sinn.
                            Ja Test abzuleiten macht in der Tat kein Sinn
                            apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/witalimik

                            Kommentar


                            • #59
                              Zitat von BlackScorp Beitrag anzeigen
                              Was kann denn denn verschlimmbessert werden?
                              Ich denke um da weiter darauf einzugehen sollten zunächst die von dir gemachten Punkte klargestellt werden. Ich habe aus Video und den bisherigen Beiträgen interpretiert dass du folgenden Standpunkt vertrittst:
                              • Traits eigenen sich besonders gut um copy & paste zu vermeiden (code reusability)
                              • final verhindert ein Problem das entsteht wenn im Team Vererbung falsch verwendet wird
                              • Traits werden als alternativer Lösungsansatz zur klassischen Vererbung via extends vorgeschlagen (in Kombination mit final?)
                              Kommt das irgendwie hin? Bitte korrigiere mich wenn ich etwas falsch verstanden habe oder ergänze deine Punkte.

                              Kommentar


                              • #60
                                Zitat von lottikarotti Beitrag anzeigen
                                Ich denke um da weiter darauf einzugehen sollten zunächst die von dir gemachten Punkte klargestellt werden. Ich habe aus Video und den bisherigen Beiträgen interpretiert dass du folgenden Standpunkt vertrittst:
                                • Traits eigenen sich besonders gut um copy & paste zu vermeiden (code reusability)
                                • final verhindert ein Problem das entsteht wenn im Team Vererbung falsch verwendet wird
                                • Traits werden als alternativer Lösungsansatz zur klassischen Vererbung via extends vorgeschlagen (in Kombination mit final?)
                                Kommt das irgendwie hin? Bitte korrigiere mich wenn ich etwas falsch verstanden habe oder ergänze deine Punkte.
                                Ja nur das mit Team, es war halt aus dem Team heraus eine Erfahrung. Final soll auch mir selbst auf die Finger hauen und mich dazu zwingen zwei mal zu überlegen ob eine Vererbung notwendig ist.

                                Und der Letzte Punkt, ja mit Final nutze ich traits, wenn es gerade nicht anders geht, normalweise wird aber ein Objekt injeziert. Trait nutze ich in folgenden Fällen.

                                Im Team sieht man in einer meiner Klasse eine Methode X, diese Methode möchte man wiederverwenden, diese Kopiere ich dann in ein Trait und gebe das Trait weiter.

                                Ursprünglich sind meine Klassen ganz normal mit Final und Public/Private Methoden versehen, wenn etwas gebraucht wird, soll es nicht still und heimlich geschehen, sondern so dass ich das auch sehe/mitkriege.
                                apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/witalimik

                                Kommentar

                                Lädt...
                                X