<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Fluent_Interface</id>
	<title>Fluent Interface - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Fluent_Interface"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Fluent_Interface&amp;action=history"/>
	<updated>2026-05-19T21:17:11Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Fluent_Interface&amp;diff=1563344&amp;oldid=prev</id>
		<title>imported&gt;SchlurcherBot: Bot: http → https</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Fluent_Interface&amp;diff=1563344&amp;oldid=prev"/>
		<updated>2025-07-09T11:19:12Z</updated>

		<summary type="html">&lt;p&gt;Bot: http → https&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Fluent Interfaces&amp;#039;&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;Fluent Interfaces&amp;quot;&amp;gt;Martin Fowler: [https://www.martinfowler.com/bliki/FluentInterface.html &amp;#039;&amp;#039;Fluent Interfaces&amp;#039;&amp;#039;.] Bliki-Eintrag&amp;lt;/ref&amp;gt; (deutsch oft übersetzt mit: „flüssige Schnittstellen“, treffender etwa: „sprechende Schnittstellen“) sind ein Konzept für [[Programmierschnittstelle]]n in der Software-Entwicklung, bei dessen Befolgung man beinahe in Form von Sätzen natürlicher Sprache programmieren kann. Der danach verfasste Programmcode ist gut lesbar und erleichtert das Verständnis des Programms.&lt;br /&gt;
&lt;br /&gt;
Schnittstellen werden oft falsch verwendet. Fluent Interfaces können zu ihrer richtigen Verwendung anhalten, indem für sie eine [[Grammatik]] gewählt wird, die von falschen Verwendungen erkennbar verletzt wird. Es gibt zwei Arten, solche „sprechende Schnittstellen“ zu realisieren, mittels Method Chaining (Methodenketten) oder mittels Nested Functions (eingebetteten Funktionen).&lt;br /&gt;
&lt;br /&gt;
== Grundlagen ==&lt;br /&gt;
Als Begründer des Konzepts &amp;#039;&amp;#039;Fluent Interfaces&amp;#039;&amp;#039; gelten Eric Evans und [[Martin Fowler]]. Bei der Beispielimplementierung des [[Entwurfsmuster]]s [[Specification]]&amp;lt;ref name=&amp;quot;Specification&amp;quot;&amp;gt;[https://martinfowler.com/apsupp/spec.pdf Specifications] (PDF; 79&amp;amp;nbsp;kB)&amp;lt;/ref&amp;gt; erfanden sie das Konzept, neue Objekte mit Hilfe von Methodenketten auf sprechende Weise zu erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 Specification colorSpec = new ColorSpecification();&lt;br /&gt;
 Specification lengthSpec = new LengthSpecification();&lt;br /&gt;
 if(colorSpec.and(lengthSpec).isSatisfiedBy(obj)) {&lt;br /&gt;
     ...&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im oberen Beispiel steht in der Bedingung der if-Anweisung ganz ausdrücklich, dass das Objekt &amp;#039;&amp;#039;obj&amp;#039;&amp;#039; auf beide Bedingungen getestet wird. Ein weiteres Beispiel ist das sprechende Erstellen eines Datums.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 DateFactory.newDate().year(2009).month(2).day(7);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anders als bei der Verwendung eines [[Konstruktor]]s, in dem die Bedeutung der drei numerischen Werte versteckt durch ihre Position im Aufruf gegeben wäre, sieht man hier durch die vorstehenden Methodennamen ausdrücklich, welche Bedeutung die einzelnen Werte haben sollen. Außerdem kann der Entwickler einer solchen Schnittstelle die Reihenfolge einschränken, in der die Methoden aufgerufen werden dürfen. Damit können etwa Methodenaufrufe, die mehrere Parameter erwarten, wesentlich verständlicher geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Besonders in Evans’ [[Domain-driven Design]] spielen Fluent Interfaces eine große Rolle, denn sie dienen ihm dazu, spezifische Eigenschaften aus einer Domäne explizit im Programmcode auszudrücken. Fluent Interfaces gehören damit zu den sogenannten [[Interne Domänenspezifische Sprache|Internen Domänenspezifischen Sprachen]],&amp;lt;ref name=&amp;quot;Interne Domänenspezifische Sprachen&amp;quot;&amp;gt;Martin Fowler: [https://www.martinfowler.com/bliki/DomainSpecificLanguage.html &amp;#039;&amp;#039;Domain Specific Language&amp;#039;&amp;#039;.] Bliki-Eintrag&amp;lt;/ref&amp;gt; auch als Eingebettete Sprache bezeichnet.&amp;lt;ref name=&amp;quot;Evolving an Embedded Domain-Specific Language in Java&amp;quot;&amp;gt;[http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.95.3176&amp;amp;rep=rep1&amp;amp;type=pdf &amp;#039;&amp;#039;Evolving an Embedded Domain-Specific Language in Java&amp;#039;&amp;#039;.] (PDF)&amp;lt;/ref&amp;gt; Es sind [[Domänenspezifische Sprache]]n, die in der Syntax einer [[Programmiersprache]] realisiert sind.&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
=== Naiv ohne Grammatik ===&lt;br /&gt;
Die Beispielimplementierung von Evans und Fowler für das Entwurfsmuster Specifications war sehr schlicht gehalten. Um eine Methodenkette mit &amp;#039;&amp;#039;and&amp;#039;&amp;#039; wie oben zu ermöglichen, wurde dem [[Interface]] &amp;quot;Specification&amp;quot; nur die neue Methode &amp;#039;&amp;#039;and()&amp;#039;&amp;#039; hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public interface Specification {&lt;br /&gt;
&lt;br /&gt;
     Specification and(Specification spec);&lt;br /&gt;
&lt;br /&gt;
     boolean isSatisfiedBy(Object obj);&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Aufruf von &amp;#039;&amp;#039;and()&amp;#039;&amp;#039; liefert also jede Specification eine weitere, die ihrerseits wiederum aus einem Aufruf der Methode &amp;#039;&amp;#039;and()&amp;#039;&amp;#039; stammen kann. Durch diesen naiven Ansatz wird jedoch die Implementierung von Typen um Funktionalitäten angereichert, die ihrem eigentlichen Zweck fernliegen. Der Hauptnachteil ist jedoch, dass Methoden in ganz beliebiger Reihenfolge verkettet werden dürfen.&lt;br /&gt;
&lt;br /&gt;
=== Mit Grammatik ===&lt;br /&gt;
Häufig spielt die Reihenfolge, in der die Methoden einer Methodenkette aneinander gereiht werden dürfen, eine große Rolle. Das folgende Beispiel zeigt die Verwendung eines Fluent Interfaces, das einem Objekt vom Typ &amp;#039;&amp;#039;Date&amp;#039;&amp;#039; einige Tage und Stunden hinzufügt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Date date = CalendarUtils&lt;br /&gt;
        .add(5).days()&lt;br /&gt;
        .add(10).hours()&lt;br /&gt;
        .to(date);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Würde man, wie im naiven Ansatz, mit jedem Aufruf einer Methode immer den gleichen Typ zurückliefern, dann kann der „Satz“ vorzeitig oder falsch beendet werden, indem nicht alle obligatorischen „Satzglieder“ oder manche mehrfach verkettet werden. Damit die solches ausschließende [[Grammatik]] erzwungen wird, muss also jeder Aufruf einer Methode einen anderen Typ zurückgegeben, der nämlich nur die jetzt noch erlaubten Folge-Methoden bereithält. Im folgenden Beispiel sieht man, wie der Aufruf der Methode &amp;#039;&amp;#039;newDate()&amp;#039;&amp;#039; von &amp;#039;&amp;#039;DateUtils&amp;#039;&amp;#039; zur Rückgabe eines &amp;#039;&amp;#039;Mediators&amp;#039;&amp;#039; führt. Dieser hält dann die Folge-Methode &amp;#039;&amp;#039;add&amp;#039;&amp;#039; bereit. Der Aufruf der Methode &amp;#039;&amp;#039;add&amp;#039;&amp;#039; wiederum führt ebenfalls zur Rückgabe eines neuen &amp;#039;&amp;#039;Mediator&amp;#039;&amp;#039; usw.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public class DateUtils {&lt;br /&gt;
    public static Mediator newDate() {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 public class Mediator {&lt;br /&gt;
     public Mediator2 add(int i) {&lt;br /&gt;
         ...&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 public class Mediator2 {&lt;br /&gt;
     public Mediator3 days() {&lt;br /&gt;
         ...&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
// possible sentence&lt;br /&gt;
DateUtils.newDate().add(5).days(). ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bernd Schiffer bezeichnet diese &amp;#039;&amp;#039;Mediatoren&amp;#039;&amp;#039; auch als &amp;#039;&amp;#039;Deskriptoren&amp;#039;&amp;#039;.&amp;lt;ref name=&amp;quot;Flüssiger Erbauer&amp;quot;&amp;gt;[https://www.heise.de/developer/artikel/Flexibel-programmieren-mit-dem-Fluent-Interface-227052.html Flüssiger Erbauer]&amp;lt;/ref&amp;gt; Mit obigem Beispiel wird also eine [[Grammatik]] realisiert, die genau vorgibt, in welcher Abfolge die Methoden aufgerufen werden können. Außerdem liefert die Methodenkette solange kein gewünschtes Objekt vom Typ Date, wie sie noch nicht vollständig ist. Deshalb zeigen sich bei Verwendung einer so implementierten Klasse &amp;#039;&amp;#039;DateUtils&amp;#039;&amp;#039; Fehler schon bei der Kompilierung des anwendenden Programms und nicht erst zur Laufzeit.&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
Die Vorteile liegen in der leichteren Entwicklung nutzender Programme und der besseren Lesbarkeit des dazu verfassten Programmcodes.&lt;br /&gt;
* Fluent Interfaces können einem natürlich-sprachlichen Satz sehr nahekommen. Damit muss man nur wenig zusätzlich kommentieren.&lt;br /&gt;
* Durch ein satzähnliches Fluent Interface und den damit insinuierten erlaubten Satzaufbau bekommt der Benutzer klarere Vorstellungen über die angebotenen Funktionalitäten und ihren möglichen Gebrauch.&lt;br /&gt;
* Eine [[Integrierte Entwicklungsumgebung|Entwicklungsumgebung]] mit Autovervollständigung wie etwa [[Eclipse (IDE)|Eclipse]] zeigt an, welche nächsten Methoden aufgerufen werden können.&lt;br /&gt;
&lt;br /&gt;
== Nachteile ==&lt;br /&gt;
Die Nachteile liegen im Aufwand für das Fluent Interface selbst und der erschwerten Entwicklung von nutzenden Programmen.&lt;br /&gt;
* Die Realisierung einer [[Grammatik]] für Fluent Interface ist sehr aufwendig und das notwendige Netzwerk von Mediatoren wird schnell unübersichtlich. Zudem lässt sich auf deren Ebene schwer nachvollziehen, welche Satzkonstruktionen möglich sind. Durch Modellierung von Fluent Interfaces in Form von Diagrammen wird versucht, diesen Nachteil zu meiden. Es wird dazu aus einem Modell der notwendige Mediator-Code automatisch generiert, sodass es nur noch nötig ist, das Verhalten des Fluent Interfaces selbst zu implementieren.&lt;br /&gt;
* Eine lange Kette von Methodenaufrufen auf derselben Zeile erschwert deren Debugging, da ein Callstack typischerweise nur die Zeile des Fehlers enthält, nicht aber die Spalte im Source-File. Das Gleiche gilt für die Zuordnung von Warnungen aus der statischen Codeanalyse. Außerdem lassen sich Haltepunkte oft nur auf vollständige Anweisungen setzen, nicht auf einzelne Methodenaufrufe darin.&lt;br /&gt;
&lt;br /&gt;
== Einsatzmöglichkeiten ==&lt;br /&gt;
Fluent Interfaces werden für verschiedene Zwecke eingesetzt. Im Vordergrund steht immer, explizit zu machen, was in einer Domäne verankert ist.&lt;br /&gt;
&lt;br /&gt;
* Verpacken von Funktionalitäten&lt;br /&gt;
*: Wie oben dargestellt, können Fluent Interfaces bestehende Funktionalitäten verständlicher anbieten.&lt;br /&gt;
* Flüssiger Erbauer&amp;lt;ref name=&amp;quot;Flüssiger Erbauer&amp;quot; /&amp;gt;&lt;br /&gt;
*: Übertragung des Konzepts Fluent Interface auf das [[Entwurfsmuster]] [[Erbauer (Entwurfsmuster)|Erbauer]].&lt;br /&gt;
* Abbildung fremder Syntax&lt;br /&gt;
*: Mit Hilfe von Fluent Interfaces kann man im Programmcode auftretende  [[Zeichenkette]]n etwa für interpretierte Sprachen wie z.&amp;amp;nbsp;B. [[SQL]], [[XPath]] oder [[Hibernate Query Language|HQL]] begrifflich leichter fasslich durch Aufrufe ersetzen.&lt;br /&gt;
&lt;br /&gt;
== Hinweis ==&lt;br /&gt;
Einige Programmiersprachen unterstützen benamte Parameter, z.&amp;amp;nbsp;B. [[Smalltalk (Programmiersprache)|Smalltalk]] oder [[ABAP]]. Bei diesen ist das Konzept der &amp;#039;&amp;#039;&amp;#039;Fluent Interface&amp;#039;&amp;#039;&amp;#039; nicht sinnvoll, da die Methodenschnittstellen bereits durch die Eigenschaften der verwendeten Sprache sprechend sein müssen.&lt;br /&gt;
&lt;br /&gt;
Beispiel Smalltalk:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
  object param1:foo param2:bar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel ABAP:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
  lo_object-&amp;gt;myMethod(&lt;br /&gt;
               iv_param1 = foo&lt;br /&gt;
               iv_param2 = bar&lt;br /&gt;
  ).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* {{Internetquelle | url=https://www.martinfowler.com/bliki/FluentInterface.html | titel=FluentInterface | autor=Martin Fowler | datum=20. Dezember 2005 | zugriff=2012-03-06 | sprache=en }}&lt;br /&gt;
* {{Internetquelle | url=https://www.net-developers.de/blog/2010/02/05/php-verkettete-methoden-fluent-interface/ | titel=PHP: Verkettete Methoden / Fluent Interface | zugriff=2012-03-06 }}&lt;br /&gt;
* {{Internetquelle|url=http://tech.pro/tutorial/1187/creating-a-c-fluent-api|titel=Creating a C# Fluent API|sprache=en|kommentar=Erklärung von Fluent Interfaces in C# für Anfänger|datum=2013-04-09|zugriff=2013-04-14|autor=Khalid Abuhakmeh|hrsg=Tech.Pro}}&lt;br /&gt;
*  {{Internetquelle|url=https://heinerkuecker.de/Fluent_Interface_Code_Generator_auf_Basis_einer_Grammatik.html|titel=Java-Fluent-Interface-Code-Generator auf Basis einer Grammatik|kommentar=Einfaches Java-Programm, welches auf Basis einer Grammatik den erforderlichen Code-Rahmen für ein Fluent Interface generiert|datum=2014-01-31|zugriff=2014-01-31|autor=Heiner Kücker}}&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Navigationsleiste Entwurfsmuster}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Schnittstelle (Software)]]&lt;br /&gt;
[[Kategorie:Entwurfsmuster]]&lt;br /&gt;
[[Kategorie:Softwaretechnik]]&lt;br /&gt;
[[Kategorie:Systems Engineering]]&lt;/div&gt;</summary>
		<author><name>imported&gt;SchlurcherBot</name></author>
	</entry>
</feed>