fluent interface

Aus php bar

Wechseln zu: Navigation, Suche

Es handelt sich bei "fluent interfaces" um einen Codingstil. Bei diesem Stil geben Methoden eines Objektes neue Instanzen zurück an denen weitere Methoden aufgerufen werden können. Somit können Methoden aneinandergereiht werden (Methodenketten). Dies sorgt vor allen Dingen für verständlicheren Code aber auch weniger Zeilen im Code und damit auch gleichzeit weniger Tipparbeit.

Inhaltsverzeichnis

Beispiel

 /**
  *.umlmlmlml...
  */
 class FluentString
 {
     private $string = '';
 
     public function __construct($string) 
     {
10         $this->string = (string) $string;
11     }
12 
13     public function replace($what, $to)
14     {
15         $this->string = str_replace($what, $to, $this->string);
16         return $this;  // AN DIESER STELLE WIRD DIE INSTANZ ZURUECKGEGEBEN
17     }
18 
19     public function addOink()
20     {
21         $this->string .= 'oink';
22         return $this;  // AN DIESER STELLE WIRD DIE INSTANZ ZURUECKGEGEBEN
23     }
24 
25     public function schlamadanata()
26     {
27         $this->string = 'haha' . $this->string;
28         return $this;  // AN DIESER STELLE WIRD DIE INSTANZ ZURUECKGEGEBEN
29     }
30 
31     public function __toString()
32     {
33         return $this->get();
34     }
35 
36     public function get()
37     {
38         return $this->string;
39     }
40 }
41 
42 // $s1 und $s2 werden zum gleichen Ergebniss führen!
43 $s1 = new FluentString('hallo ich bin ein echt lustiger string');
44 $s1->replace('hallo', 'hola')
45     ->addOink()
46     ->replace('oink','MUH')
47     ->schlamadanata()
48     ->addOink();
49 
50 $s2 = new FluentString('hallo ich bin ein echt lustiger string');
51 $s2->replace('hallo', 'hola');
52 $s2->addOink();
53 $s2->replace('oink','MUH');
54 $s2->schlamadanata();
55 $s2->addOink();
56 
57 if ($s1->get() === $s2->get()) {
58     echo "DAS GLEICHE: <br />";
59 }
60 echo "1: {$s1} <br />\n 2: {$s2}";


Ergebnis

DAS GLEICHE:
1: hahahola ich bin ein echt lustiger stringMUHoink
2: hahahola ich bin ein echt lustiger stringMUHoink

Das obige Beispiel stellt die einfachste Möglichkeit dar ein Fluent Interface umzusetzen. Möchte man z. B. erzwingen, dass Methoden nur in einer bestimmten Reihenfolge oder an einer bestimmte Stelle aufgerufen werden dürfen, muss man nach jedem Methodenaufruf ein Objekt von einem anderen Typen zurückliefern, welches dann die entsprechenden Methoden anbietet. Somit können Fluent Interfaces erstellt werden die es ermöglichen schon fast in Satzform Code schreiben zu können.

Anwendung

Man sollte den einfachen Ansatz für die Realisierung von Fluent Interfaces vorsichtig nutzen. Bei solchen Klassen wie einer String Klasse ist diese Methode optimal. Allerdings wäre sie bei einer MySql-Klasse ziemlich fehl am Platz. Hier sollte eine Grammatik erzeugt werden, die es ermöglicht die Befehle nur in einer bestimmten Reihenfolge aufzurufen.

1 $fluentApi->select("*")
2     ->from()
3     ->table("tableName")
4     ->where("whereClause");


Fluent Interfaces sollten in der Regel so umgesetzt werden, dass die Methoden für die Satzkonstruktionen in separaten Typen untergebracht werden. Andernfalls würden die Entitäten durch Methoden angereichert werden die nichts mit dem eigentlich Sinn dieser zu tun haben. Demnach setzen Fluent Interfaces eher auf bestehende Funktionalitäten auf und vereinfachen deren Verwendung und Verständnis.

Siehe Auch

OOP

Weblinks

Persönliche Werkzeuge