Fluent Interface in der GUI-Entwicklung
Veröffentlicht: 29-09-2009 um 17:08 von AmicaNoctis
Vor einigen Tagen beschloss ich, etwas zu ändern und zwar solchen Code:
Ich war schon eher einmal unzufrieden beim Programmieren von GUIs, damals hatte ich es noch mit unzähligen Variablen geschrieben:
Nun sollte es anders werden und ich beschloss, dass alle einfachen Setter ab sofort die aktuelle Instanz zurückgeben sollen. Setter, die z. B. Kindelemente oder andere Objekte hinzufügen, sollen das hinzugefügte Objekt zurückgeben. Die Änderungen in allen Widget-Klassen hat nicht mal besonders lange gedauert, sich aber imho durchaus gelohnt, weil man dadurch sofort mit dem Rückgabewert weiterarbeiten kann, statt das Objekt erst wieder anzusprechen. Durch konsequente Einrückungen weiß ich, auf welcher Ebene ich grade bin und so sieht der Code nun aus:
Das gefiel mir viel besser, die Idee selbst auch.
Heute habe ich durch Zufall gelesen, dass diese Methode schon seit 2005 bekannt ist und auch einen Namen hat: "Fluent Interface". Das ist übrigens ein sehr typisches Problem von mir. Ich schau mich zu wenig um, was es schon gibt. Dann habe ich eine Idee, von der ich selbst ganz begeistert bin, nur um kurze Zeit später festzustellen, dass ich damit viel zu spät komme.
Wem dieser Ansatz gefällt oder bisher auch unbekannt war, der sei herzlich eingeladen, einen Kommentar zu hinterlassen. Was ich davon hab? Na ist doch klar: ich weiß dann wenigstens, dass ich nicht die einzige bin, die bisher noch nie was von Fluent Interfaces gehört hat.
Gruß,
Amica
Code:
this.setPaddingHor(5);
this.setPaddingVer(5);
this.setTitle("Klient");
this.setChild(new jsoox.jwit.Container(4, true));
this.getChild().setFillHor(true);
this.getChild().setFillVer(true);
this.getChild().setSpacing(5);
this.getChild().setChild(new jsoox.jwit.Label(), 0);
this.getChild().getChild(0).setFontSize("20px");
this.getChild().getChild(0).setFillHor(true);
this.getChild().getChild(0).setCollapseVer(true);
this.getChild().getChild(0).setText("TestFirma");
this.getChild().getChild(0).setTextAlign("left");
this.getChild().setChild(new jsoox.jwit.TitlePane(), 1);
this.getChild().getChild(1).setTitle("Kontakt");
this.getChild().getChild(1).setFillHor(true);
this.getChild().getChild(1).setCollapseVer(true);
this.getChild().getChild(1).setChild(new tsm.tos.ContactPane());
this.getChild().getChild(1).getChild().setFillHor(true);
this.getChild().getChild(1).getChild().setMarginHor(5);
this.getChild().getChild(1).getChild().setMarginVer(5);
...
Code:
this.setPaddingHor(5);
this.setPaddingVer(5);
this.setTitle("Klient");
var container1 = new jsoox.jwit.Container(4, true)
container1.setFillHor(true);
container1.setFillVer(true);
container1.setSpacing(5);
var label1 = new jsoox.jwit.Label();
label1.setFontSize("20px");
label1.setFillHor(true);
label1.setCollapseVer(true);
label1.setText("TestFirma");
label1.setTextAlign("left");
container1.setChild(label1, 0);
var titlePane1 = new jsoox.jwit.TitlePane();
titlePane1.setTitle("Kontakt");
titlePane1.setFillHor(true);
titlePane1.setCollapseVer(true);
var contactPane1 = new tsm.tos.ContactPane();
contactPane1.setFillHor(true);
contactPane1.setMarginHor(5);
contactPane1.setMarginVer(5);
titlePane1.setChild(contactPane1);
container1.setChild(titlePane1, 1);
this.setChild(container1);
...
Code:
this
.setPaddingHor(5)
.setPaddingVer(5)
.setTitle("Klient")
.setChild(new jsoox.jwit.Container(4, true))
.setFillHor(true)
.setFillVer(true)
.setSpacing(5)
.setChild(new jsoox.jwit.Label(), 0)
.setFontSize("20px")
.setFillHor(true)
.setCollapseVer(true)
.setText("TestFirma")
.setTextAlign("left")
.getParent()
.setChild(new jsoox.jwit.TitlePane(), 1)
.setTitle("Kontakt")
.setFillHor(true)
.setCollapseVer(true)
.setChild(new tsm.tos.ContactPane())
.setFillHor(true)
.setMarginHor(5)
.setMarginVer(5)
.getParent()
.getParent()
...
Heute habe ich durch Zufall gelesen, dass diese Methode schon seit 2005 bekannt ist und auch einen Namen hat: "Fluent Interface". Das ist übrigens ein sehr typisches Problem von mir. Ich schau mich zu wenig um, was es schon gibt. Dann habe ich eine Idee, von der ich selbst ganz begeistert bin, nur um kurze Zeit später festzustellen, dass ich damit viel zu spät komme.
Wem dieser Ansatz gefällt oder bisher auch unbekannt war, der sei herzlich eingeladen, einen Kommentar zu hinterlassen. Was ich davon hab? Na ist doch klar: ich weiß dann wenigstens, dass ich nicht die einzige bin, die bisher noch nie was von Fluent Interfaces gehört hat.
Gruß,
Amica
Kommentare 3
Kommentare
-
Hi Amica,
ich habe mich im Zuge meiner Bachelorarbeit mit Fluent Interfaces beschäftigt. Schau mal auf Fluent-Interfaces.com nach. Ich habe ein kleines Tool entwickelt mit dem es möglich ist komplexere Fluent Interfaces zu modellieren. Sobald du nämlich noch Nebenbedingungen wie z.B. dass die Methoden nur in einer bestimmten Reihenfolge oder Methoden nur einmal aufgerufen werden dürfen wird das Erstellen eines Fluent Interfaces sehr umständlich.
Grüße
Der PhilippVeröffentlicht: 12-10-2009 um 07:24 von wipeouter
-
Hi Philipp,
ja, wenn man mit Mediatorklassen arbeitet, aber das tu ich ja in diesem Fall nicht. Die einfachste Variante (Setter gibt this zurück) reicht mir hier schon aus, um das fluent zu machen, zumal die Reihenfolge unerheblich ist und auch, ob eine Eigenschaft überhaupt gesetzt wird. Also keinerlei Seiteneffekte oder Abhängigkeiten.
Aber dein Generator ist auf jeden Fall einen Blick wert, da ich inzwischen so ziemlich auf den Geschmack gekommen bin und in einem künftigen Projekt mal das volle Programm (mit Mediatorklassen) ausprobieren möchte.
Gruß,
AmicaVeröffentlicht: 13-10-2009 um 08:03 von AmicaNoctis
-
Fluent-Interfaces sind nicht nur für solche einfachen Konfigurationsvorgänge sondern auch für ganze Programmabläufe in Kombination mit Exceptions hervorragend geeignet. Nutze ich auch immer sehr gerne.Veröffentlicht: 14-01-2010 um 01:07 von PHP-Desaster
Trackbacks 0

















