Freitag, 3. Juli 2009

Fluent Interface - schlechter Stil hat einen Namen

Gester oder war es Vorgestern bin ich gleich zweimal auf ein Problem gestossen, dass einige Programmierer in einer Codezeile lange, komplexe, häufig ineinander geschachtelte Anweisungen schreiben. In einigen Fällen sieht da sehr elegant aus und es spart Platz, d.h. man muss nicht so viel scrollen im Editor. Diese Art des Code Schreibens hat aus meiner Sicht zwei Mankos, auch wenn ich weniger scrollen muss sinkt die Verständlichkeit des Codes und wenn ein Fehler in dieser Zeile auftritt (Nullpointer in Zeile 137), muss diesen Ausdruck zerlegen um den Bug zu finden. Aus diesem Grund halte ich auch trinäre Ausdrücke für potentielle Fehler.
Daraufhin habe ich in der Newsgroup de.comp.lang.java den Verweis auf die Idee des Fluent Interface gefunden. Die oben beschrieben Art der Programmierung ist kein Fluent Interface. Fluent Interface ist eine elegante Art der Programmierung die vor allem Domain-spezifisch, sehr effizient sein kann. Der Vorteil der Natürlichsprachlichkeit dieser Ausdrücke halte ich nicht unbedingt für einen Vorteil, das mag vielleicht auch mit mit meinen mit Lingo (Macromedia Director, jetzt Adobe Director) gemachten Erfahrungen zusammenhängen. Die Natürlichsprachlichkeit war ja ein Kernfeature von Lingo.

Kommentare:

  1. Hi Mirko,

    ich habe mich im Zuge meiner Bachelorarbeit mit dem Thema Fluent Interfaces auseinandergesetzt. Als ich die Überschrift gelesen habe war ich doch etwas geschockt, aber der zweite Teil deines Beitrages trifft es schon besser :) In dem ersten Absatz sprichst du von häufig ineinandergeschachtelten Anweisungen. Dieser Ansatz eines Fluent Interface wurde dann offenbar mit dem Prinzip der Nested Functions realisiert, welchen ich auch als nicht gerade sehr hilfreich einstufe. Nested Functions haben beispielsweise das Problem, dass die Autovervollständigung der IDE einen nicht dabei unterstützen kann rauszufinden was man für eine Methode/Funktion als nächstes verwenden soll. Deine besagten schwer nachvollziehbaren Nullpointer-Exceptions sind auch eher ein Problem wie das Fluent Interface realisiert wurde.

    Für meine Bachelorarbeit habe ich versucht ein Meta-Modell für Fluent Interfaces zu formulieren mit dem es möglich ist auf abstrakter Ebene in Form von Diagrammen Fluent Interfaces zu modellieren und aus diesen Code generieren zu lassen. Dabei generiere ich Fluent Interfaces die das Prinzip des Method Chaining verwenden, also die Aneinanderreihung von Methoden. Jede aufgerufene Methode erzeugt dabei eine bestimmte Action was auch die Fehlersuche erleichtert. Hinzukommt und das ist aus meiner Sicht einer der wichtigsten Aspekte von Fluent Interfaces, dass dir die IDE nach jedem setzen eines Punktes nach einer Methode genau sagen kann, welche Methode als nächstes aufgerufen werden darf. Damit habe ich als Entwickler die Möglichkeit APIs anzubieten die im Grunde sich selbst erläutern und kaum falsch verwendet werden können (je nach Realisierung des Interfaces).

    Unter http://www.fluent-interfaces.com findest du dazu noch ein paar Infos.

    Grüße
    Der Philipp

    AntwortenLöschen
  2. Interessant. Vielleicht kannst du deine Arbeit verlinken oder einen Gastbeitrag schreiben und dort Fluent Interfaces aus deiner Sicht einfach und verständlich erklären.

    Gruss Mirko

    AntwortenLöschen