fluent interface
Aus php bar
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
1 /** 2 *.umlmlmlml... 3 */ 4 class FluentString 5 { 6 private $string = ''; 7 8 public function __construct($string) 9 { 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
Weblinks
- Fluent Interface - Wikipedia Artikel
- http://www.fluent-interfaces.com - Modellgetriebene Entwicklung von Fluent Interfaces
- Bliki von Martin Fowler - Hier finden sich die wichtigsten allgemeinen Grundlagen zu Fluent Interfaces

