Programmierstil flüssiges Interface

Ich möchte heute kurz eine einfache Programmiertechnik, bzw. Programmierstil vorstellen. Es geht um die Implementierung von Set Methoden (Settern)

Nach dem vor kurzem das Open Source PHP Framework von Zend (kurz: Zend Framework) in der Version 1.0 erschienen ist, bin ich beim lesen der Zend Framework Dokumentation auf einen Namen für diese Programmiertechnik, bzw. Programmierstil gestoßen. Das flüssige Interface.

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)

Set Methoden haben normal die Eigenschaft, dass man ihnen ein Wert übergibt, welcher dann in nicht öffentliche (nicht als public deklarierte) Klassenvariablen gespeichert werden, ohne dass die Methode etwas zurück gibt.
Der Trick dieser Technik ist nun, dass Set Methoden eine Referenz zum Objekt zurück geben. Einfach formuliert, in jeder Methode steht am Ende ein return $this. Das könnte dann so aussehen:

  public function setAuthor($author)
  {
    $this->author = $author;
    return $this;
  }

Gut, was bringt das nun? Wie der Name bequemes flüssiges Interface schon sagt bietet es ein flüssigeres programmieren, weil durch die zurückgegebene Referenz auf das Objekt lässt sich direkt nach dem Methodenaufruf wieder eine Methode der Klasse aufrufen.

Anschaulich bedeutet es, dass ein flüssiges Interface folgenden Aufruf ermöglicht:

  $iArticle = new iArticle();
  $iArticle->setID(1)
           ->setAuthor('ilimitado OHG')
           ->setDate(1188498902)
           ->setTitle('Flüssiges Interface in PHP')
           ->setLanguage('de');

Während einfache (normal) implementierte Setter Methoden, welche nichts zurückgeben, dies nicht bereitstellen können. Der obere Aufruf würde hier folgendermaßen aussehen.

  $iArticle = new iArticle();
  $iArticle->setID(1);
  $iArticle->setAuthor('ilimitado OHG');
  $iArticle->setDate(1188498902);
  $iArticle->setTitle('Flüssiges Interface in PHP');
  $iArticle->setLanguage('de');

Zugegeben, diese Programmiertechnik (Programmierstil) ist jetzt nichts weltbewegendes, aber es ist ja auch kein großer Aufwand in Setter Methoden und anderen Methoden, welche an sich nichts zurückgeben, einfach mal return $this einzufügen. So ein flüssiges Interface bringt vielleicht keine Geschwindigkeitsvorteile, es lässt aber den Quellcode ein klein weniger übersichtlicher aussehen, spart etwas Tipparbeit und macht auf jeden Fall das Aufrufen mehrerer Methoden auf dem selben Objekt bequemer.

Wenn dir dieser Beitrag gefällt, lade den Autor doch mal zu einem Drink ein ;-)

Broadcast us
  • Yigg
  • Webnews.de
  • Digg
  • MisterWong
  • del.icio.us
  • Technorati
  • DZone
  • Facebook
  • Google Bookmarks
  • Reddit
  • StumbleUpon
  • TwitThis

Tags: , , , , ,

8 Responses

  1. Das ist eine recht interessante Methode, aber ich erwarte von Settern doch eher, dass sie mir als Rückgabewert – sofern vorhanden – das Ergebniss meiner Aktion mitteilen. Also ein true, false oder evtl. der neue Wert.

    Naja, Geschmacksache, aber auch jeden Fall interessant mal darüber nach zu denken.

  2. Danke für die Erklärung, ich bin auch in der Zend Doku über die Liquid Interfaces gestolpert und hab’ bei meiner kurzen Recherche nicht herausfinden können was die Idee dahinter ist.
    Da ich grundsätzlich in meinen Setter Methoden nichts zurückgebe, werde ich in Zukunft wohl diese Methode einsetzen.
    @tex: Du könntest einfach annehmen, dass beim Gebrauch einer Setter Methode alles klappt, sofern keine Exception geworfen wird. Dann hast du zwar den Umstand, dass du um jeden Setter-Aufruf einen try-catch Block schreiben musst, aber du kannst trotzdem die Liquid Interface Methode verwenden.

  3. @tex entweder du machst es so wie anty sagt indem du eine exception wirfst wenn das ganze fehlschlägt oder du returnst im Falle eines Fehlers statt einer Exception einfach FALSE dann musst du deinen Code net mehr ändern wenn du dort deine Setter auf FALSE prüfst…

  4. @eltiburon: Wenn du false returnst bekommst du einen Fehler wenn du die Idee dieses Patterns verwenden willst:

    setX()->setY()->setZ()

    Was, wenn setX() fehl schlägt und false returned? Dann funktionieren setY() und setZ() nicht mehr. Ich würde die Exception Methode vorziehen.

  5. Das kann ganz nett sein, zum Beispiel in der Hibernate API (http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Criteria.html). Die Beispiele illustrieren es ganz gut. Ich persönlich tendiere aber das ganze etwas mehr auseinander zu ziehen und Verschachtelungen zu vermeiden.

    Bei Settern finde ich die Übersichtlichkeit nicht unbedingt besser. In Java müsste man zudem beachten, dass die Setter aufgrund des Rückgabewertes dann nicht mehr Bean konform wären.

  6. @anty Ja klar das hab ich net bedacht dann funtzt das ganze prinzip ja net mehr…Gruß

  7. Ich finde das eine interessante Sache, kann mir aber z.Z. nicht vorstellen, wie ich das in meine Apps sinnvoll nutzen könnte. Aber man weis ja nie was so kommt.

  8. Wirklich interessant, danke für den Beitrag! Werd ich gleich mal ausprobieren.

Leave a Reply