• Flüssiges Interface

    von am 15. August 2008

    Ein flüssiges Interface bedeutet das jede Methode eine Referenz zu dem Objekt zurückgibt auf das es aufgerufen wurde, so das sofort ein erneuter Aufruf einer anderen Methode stattfinden kann. (Quelle: Zend)

    Bis vor kurzem kannte ich dieses Interface oder besser diese Art zu programmieren auch nicht. Bei meinen Recherchen über das Zend Framework stieß ich dann auf das flüssige Interface. Am Beispiel von Klassen und ihren Settern möchte ich diese Technik kurz erläutern. Prinzipiell ist das Anwendungsszenario ganz einfach skizziert. Wir haben eine Klasse mit diversen Set Methoden, die alle nacheinander aufgerufen werden sollen. Betrachtet man eine Standard Implementierung einer solchen Klasse, dann sollte dieser Aufruf wie folgt aussehen.

           $class = new StandardClass( );
           $class->setFirstAttribute( 'firstAttributeValue' );
           $class->setSecondAttribute( 'secondAttributeValue' );
           $class->setThirdAttribute( 'thirdAttributeValue' );

    Solche Codeblöcke sollte jeder schon einmal geschrieben haben. Das flüssige Interface geht jetzt davon aus, dass alle Set Methoden keine Rückgabewerte besitzen. Dieser Wert kann also noch frei verwendet werden. Und genau an diesem Fakt setzt das Interface an. Es benutzt diesen Wert einfach um die Instanz der Klasse selber zurückzugeben.

           class StandardClass
           {
             public function setFirstAttribute( $value )
             {
              // ... do something
              return $this;
             }
             // ... other methods
           }

    Wichtig ist hier, dass durch diese Änderung das Verhalten der Klasse nicht verändert wurde. Es wird weiterhin der Legacy Code ohne Probleme, falls es vorher keine gab, durchlaufen. Funktionsaufrufe können nun viel einfacher konkateniert werden und somit eine flüssige Verwendung ermöglichen.

           $class = new StandardClass( );
           $class->setFirstAttribute( 'firstAttributeValue' )
                 ->setSecondAttribute( 'secondAttributeValue' )
                 ->setThirdAttribute( 'thirdAttributeValue' );

    Fazit: Ich finde es nett von diesem Interface einmal gehört zu haben, keine Frage. Ich denke aber, dass ich es nie anwenden werde, da der Benefit dieser Technik meiner Meinung nach leider viel zu gering ist, um die Nachteile auszugleichen. Verwendet man das flüssige Interface verbaut man sich die Möglichkeit Setter mit einem Rückgabewert auszustatten. Ab und zu kommt man ja doch in die Situation, dass ein Setter z.B. einen boolschen Wert zurückliefert, da man wissen will auf das setzen nun geklappt hat oder nicht.

    Nils Langner

    Auch wenn Ihr es mir nicht glauben werdet, aber ich habe nichts gegen PHP. Ich rege mich einfach nur gerne auf. Ok so schlimm ist es auch nicht. Eigentlich wollte ich schon immer einen Blog haben und da ...

    Zum Profil von Nils Langner

    5 Kommentare »


    • Robert
      am 17. August 2008 um 21:10 Uhr

      sher angenehm ist diese Technik, oftmals auch chaining genannt, allerdings im zusammenhand mit der Javascript-Bibliothek jQuery, wo diese Methode beinahe religiös durchgezogen wird. Dein Anspruch bezüglich Getter / Setter wird dann eher über Exceptions (im Fehlerfall) gelöst. Sehr elegant.


    • Christopher
      am 18. August 2008 um 03:11 Uhr

      Ich persönliche nutze diese Methode bereits seit geraumer Zeit und muss sagen, dass ich sie nicht mehr missen möchte.

      Bzgl. deinem Punkt eines Rückgabewertes habe ich zusätzlich zur setX-Funktion eine issetX-Funktion hinzugefügt die mir einen boolschen Wert zurückgibt – bzgl. aufgrund einer isset($this->Variable)-Abfrage.


    • Kanotchi
      am 13. November 2008 um 23:53 Uhr

      Zend hat so ein wenig die eigene Auffassung von Fluid die ich selber auch lieber als Chaining bezeichne – vergleiche jQuery.

      Nett zum Hintergrund:
      http://www.martinfowler.com/bliki/FluentInterface.html


    • Chaining in Symfony | PHP hates me - Der PHP Blog
      am 21. April 2009 um 08:00 Uhr

      [...] Es ist nichts schlimmes. Es geht einfach um eine wirklich übermäßige Nutzung von Chaining (flüssiges Interface). Interfaces so flüssig wie möglich zu halten ist natürlich eine angenehme Sache, aber was die [...]


    • Jens Prangenberg
      am 12. Mai 2011 um 08:39 Uhr

      Hallo zusammen,

      ich sehe keine Vorteile in einem flüssigen Interface.

      Ich verliere die Möglichkeit einen Rückgabewert zu liefern und kann dadurch besser konkatenieren? Das soll ein Vorteil sein?

    RSS Feed für Kommentare zu diesem Artikel. TrackBack URL

    Hinterlasse einen Kommentar

    Werbung
    PHP Magazin
    Ausgabe 02/2010

    Dieses Mal mit Artikeln zu den Themen OpenSocial und Apache Shindig, Graphentheorie, Smarty3

    t3n
    Ausgabe 19

    Social Media (R)evolution. Weitere Themen sind noSQL, Crowdsourcing ...

    PHP Journal
    Ausgabe 2/2010

    PHP & Windows optimal nutzen, die besten PHP-CMS im Überblick, Google-API mit Zend Framework nutzen.

    Wir wurden schon öfters gefragt, ob man uns nicht irgendwie unterstützen kann. Die Antwort war immer einfach: Klar! Am einfachsten ist es eure nächsten Einkäufe bei Amazon über unsere Link abzuwickeln. Damit würdet ihr uns schon sehr helfen. Über Co-Autoren freuen wir uns aber noch mehr.