Artikel

 
November 2009 | Artikel

Metawidget: King of the Hill

(Link zum Artikel: http://www.it-republik.de/jaxenter/artikel/2681)

Formularentwicklung leicht gemacht?

Text: Wolfgang Gruber
Formulare – allein bei dem Wort sträuben sich bei vielen die Nackenhaare. Kein Wunder, hören sich Formulare doch nach langweiliger, monotoner Arbeit an. Das gilt sowohl für behördliche Formulare als auch für jene in Applikationen. Dieser Artikel stellt mit Metawidget ein Projekt vor, das angetreten ist, die Entwicklung von Formularen zu vereinfachen und zu beschleunigen.
Teil 1   Teil 2   Teil 3   Teil 4   

Morgens um halb zehn irgendwo in einem Büro. In einem Meeting wird das neue Projekt besprochen, die Anforderungsanalyse liegt auf dem Tisch. Natürlich geht es bei einem Teil wieder einmal um die Verwaltung der von der Applikation zu verarbeitenden Daten. Nach dem vorherrschenden objektorientierten Paradigma werden diese Daten in Domänenobjekten gekapselt. Da die Verwaltung dieser Objekte immer die gleiche Funktionalität abbildet, nämlich das Anlegen neuer Objekte, das Anzeigen, das Verändern und schließlich das Löschen bestehender Objekte, werden diese Anwendungsfälle zumeist einfach als CRUD-Funktionalität bezeichnet. Bei CRUD handelt es sich um ein Akronym, das sich aus den Anfangsbuchstaben von CREATE, READ, UPDATE und DELETE zusammensetzt, wobei es sich mit Ausnahme von READ um die zu den jeweiligen Aktionen gehörenden SQL-Befehle handelt. Zuweilen werden auch das Suchen nach Objekten sowie das Auflisten der Objekte zur CRUD-Funktionalität hinzugezählt.

Die Umsetzung der CRUD-Funktionalität erfolgt zumeist nach einem standardisierten Schema, sodass sich die User-Interface-Masken in der Applikation nicht besonders stark voneinander unterscheiden. Daher ist die Umsetzung dieser Funktionalität meistens keine besonders anspruchsvolle Aufgabe, sondern höchst repetativ und eintönig. Dieses Problem muss doch irgendwie einfacher zu lösen sein, hat sich vermutlich schon jeder Entwickler einmal gedacht, während er in seiner IDE Eingabefelder auf die Formulare gezogen hat, um sie anschließend mit den Domänenobjekten zu verknüpfen. Sollte uns nicht gerade der Computer solche stumpfsinnigen Aufgaben abnehmen und automatisieren? Das hat sich auch Richard Kennard gedacht, als er das Metawidget-Projekt gründete.

Der typische Datenfluss in einer mehrschichtigen Applikation beginnt am User Interface. Der User kann hier die Daten in einem Formular eingeben oder ändern. Wenn er speichert, werden die Daten aus den Eingabefeldern ausgelesen und in einem Domänenobjekt aufbewahrt. Dieses Objekt kann nun in die Tabelle einer relationalen Datenbank persistiert werden. An zwei Stellen kommt es zu einem Übersetzungsvorgang: einerseits zwischen den Eingabefeldern und dem Domänenobjekt und andererseits zwischen dem Domänenobjekt und der Tabelle der relationalen Datenbank. Für Letzteres hat sich dabei der Begriff „(Object-relational) Impedance Mismatch“ eingebürgert, da die relationale Welt der Datenbanken und die objektorientierte Welt der Programmiersprachen ein anderes Datenmodell aufweisen. Die Lösung für dieses Problem sind objektrelationale Mapper (ORM). Während sich in den letzten Jahren in diesem Bereich sehr viel getan hat und mit Hibernate und der Java Persistence API (JPA) eine allgemein anerkannte Lösung existiert, hat es auf der Seite der User Interfaces nicht viele Entwicklungen gegeben. Noch immer gilt es hier für die Entwickler, die Formulare zu designen, die verschiedenen Elemente zu platzieren und sie richtig mit den Domänenobjekten zu verdrahten.

Genau an dieser Stelle setzt Metawidget an, das dem Entwickler das Erstellen von Formularen abnimmt, indem sie dynamisch aus den Domänenobjekten generiert werden. Dabei geht es gar nicht darum, alle möglichen Anwendungsfälle komplett abzudecken, sondern nur jene Fälle, in denen standardisierte Formulare zum Einsatz kommen. In Anlehnung an OR-Mapper bezeichnet sich Metawidget daher als Object/User Interface Mapper (OIM). Metawidget versucht sich dabei in bestehende Technologien einzufügen. Es bildet eine Brücke zwischen Frontend- und Backend-Technologien. Bei den Frontend-Technologien handelt es sich um verschiedene User-Interface-Technologien, angefangen bei Swing über Java Server Faces bis hin zu Android. Backend-Technologien hingegen sind Technologien, aus denen Metawidget Informationen für die Erstellung der Formulare zieht, wie etwa XML-Dateien oder Annotationen. Tabelle 1 gibt einen Überblick über die Technologien, die Metawidget versteht. Die Formulare, die es erzeugt, werden dabei erst zur Laufzeit generiert, sodass jede Änderung im Backend beim Neustart der Applikation sofort übernommen wird, ohne dass das Frontend adaptiert werden müsste.

Tabelle 1: Unterstützte Frontend- und Backend-Technologien von Metawidget
Frontend Backend
Swing Java Beans
Java Server Faces (JSF) Metawidget-Annotationen
Spring Web MVC Hibernate
Google Web Toolkit (GWT) Hibernate Validator
Android Java Persistence API (JPA)
Struts JBoss jBPM
Java Server Pages (JSP) Swing Application Framework
  Javassist
  Commons JEXL
  Commons Validator
 
 

Teil 1   Teil 2   Teil 3   Teil 4   

Anzeige

Kommentare

Gravatar RPR 25.11.2009
um 20:24 Uhr
Für einfache Prototypen ist so was ja ganz nett; aber:1. Für ausgefeilte Endkunden-GUIs die komplexe Business-Logik darstellen sollen ist so was nicht geeignet.2. Schon die GUI des einfachen Beispiels sieht - pardon - besch... aus; die Labels gehören z.B. rechtsbündig.3. Der Code des Beispiels wäre mit Swing allein auch nicht länger gewesen; höchstens die Validierung (die auch nur in einfachsten Fällen so geht - wie siehs z.B. mit dynamischen Lookups aus?) bringt ein paar Zeilen Code; verstopft aber die Übersichtlichkeit; pro Property 10 Annotations? Nein danke.4. Durch die ganzen Interzeptoren XML-Einlesearbeit etc. wird das Programm sicher nicht schneller (starten).Woher kommen wohl seit 10 Jahren die "Gerüchte" dass Java-GUIs hässlich und langsam sind? Nicht zuletzt von solchen "Vereinfachungen".Nein Leute lasst euch sagen: Wenn ein Programm erfolgreich werden soll dann braucht es eine ausgefeilte Benutzerführung dass die Leute sagen: Geil das macht das genau so wie ich mir das vorstelle. Ansonsten werden die Benutzer das Programm von Anfang an hassen. Ergo: Für die nächste Franken-GUI durchaus eine Überlegung wert ;-) #zitieren
Gravatar RPR 25.11.2009
um 20:26 Uhr
Jetzt geht der vermaledeite Zeilenumbruch hier schon wieder nicht welche Stümper programmieren das hier eigentlich? #zitieren
Gravatar Wolfgang Gruber 26.11.2009
um 15:37 Uhr
ad 1. nein, dazu ist es auch gar nicht gedacht. Es soll die Entwicklung von Standard-Formularen vereinfachen, die meist einen großen Teil von Applikationen einnehmen. Komplexe GUIs erfordern natürlich weiterhin "Handarbeit".
ad 2. Stimmt, es ist aber nur ein kurzes Beispiel. Auf http://metawidget.sourceforge.net/screenshots.html gibt es einige schönere GUIs.
ad 3. Bei kurzen Beispielen machen sich die Einsparungen an Source Code natürlich nicht bemerkbar. Zum Vergleich: Wenn man den Code für ein einfaches JDBC-Select-Statement mit dem Code vergleicht, den JPA für die gleiche Funktionalität benötigt, dann schneidet JPA auch nicht gerade gut ab. Es geht aber auch darum repetativen Code zu eliminieren, so dass man sich als Entwickler mehr auf den Kern konzentrieren kann. Im Fall von Metawidget eben die Anordnung der Widgets, sowie deren Aussehen. Ob man alle Metadaten als Annotationen direkt in der Entität angibt oder in XML-Dateien auslagert (wie das auch von Metawidget angeboten wird), bleibt jedem Entwickler selbst überlassen. Momentan ist es eben einfach der Trend alles in Annotationen zu packen. Ob das der ideale Weg ist, ist natürlich eine andere Frage :-)
ad 4. das Problem ist, dass solche Gerüchte einmal aufkommen und dann nicht mehr hinterfragt werden. Inzwischen sind 10 Jahre vergangen, in denen sich sowohl Java, als auch die darunterliegende Hardware weiterentwickelt haben. Ansonsten kommen langsame Java-GUIs sehr oft von suboptimaler Programmierung, z.B. dass zu viel Arbeit im Event Dispatch Thread erfolgt, die GUI dadurch "einfriert" und nicht mehr auf den Benutzer reagiert.
Metawidget bildet einen Wrapper um vorhandene Technologien und ist mit knapp 300 KB nicht besonders groß. Von daher ist die Performance-Einbuße beim Start zwar sicherlich vorhanden, aber nicht wesentlich (die Initialisierung von z.B. JPA nimmt da sicherlich mehr Zeit in Anspruch).
Wie im Artikel beschrieben, handelt es sich nicht um eine All-inclusive-Lösung, sondern einfach um ein Tool, dass die Arbeit mit Formularen erleichtern soll.
#zitieren
Gravatar Jan Lessner 26.11.2009
um 22:48 Uhr
Ich kann nur bestätigen, dass solche Ansätze funktionieren. Wie ich seinerzeit in dem zitierten Artikel über Naked Objects geschrieben hatte, ließt an dem Framework nicht das Konzept sondern nur die konkrete Umsetzung zu wünschen übrig. Inzwischen haben wir bei arvato services ein eigenes Framework nach Naked-Objects-Pattern entwickelt, das tadellos im produktiven Einsatz funktoniert, enorm Zeit spart und trotzdem flexibel und offen ist, so dass selbst die kritischen Entwickler das Ding richtig "cool" finden. Entscheidender Trick dabei: die zur Laufzeit erzeugten Maskenlayouts (basierend auf JGoodies FormLayout) werden - sofern man es nicht explizit unterdrückt - in Dateien abgelegt und lassen sich anschließend mit einem sehr komfortablen GUI-Designtool nachbearbeiten. Dadurch sind auch hohe Ansprüche an die äußerliche Gestaltung erfüllbar und es können eine ganze Reihe von Annotatinen im Sourcecode vermieden werden, die reine Oberflächenthemen betreffen, z.B. Default-Buttons, Tab-Reihenfolge, Ausblenden von Feldern usw. Bei nachträglichen Ergänzungen der Domänenklassen werden Felder für neue Attribute in die bestehenden Layouts vom Framework zur Laufzeit hinein gemerged.
Mit dieser Technik erschlagen wir 80% aller GUIs. Wichtig ist natürlich die Offenheit der Umgebung für die restlichen 20%, wo tiefe Eingriffe notwendig sind. Mit ein bisschen Kenne lässt sich auf Basis der vielen verfügbaren Toolkits in der Java-Welt ein sehr schlankes Naked-Objects-Framework bauen. Wir setzen z.B. auf AjaxSwing, um unsere generisch erzeugten Swing-Oberflächen ins Web zu kriegen.
#zitieren
Gravatar RPR 28.11.2009
um 12:09 Uhr
Hallo Jan,
nun gut, wenn man die GUIs nachbearbeiten kann, ohne den Bezug zum Original zu verlieren (was ein wirklich beeindruckendes Feature ist - die meisten UML-Tools können das nicht mal) und nachträglch reinmergen kann und das gut funktioniert, ist es sicher ne Möglichkeit, sich hier Zeit zu sparen und konsistent zu bleiben. Das Ding ist nicht zufälligerweise open source oder kann man mal wo testen?

Ein Schmunzeln entlockte mir der Satz "Mit dieser Technik erschlagen wir 80% aller GUIs" - so wie viele Java-GUIs aussehen, muss man wirklich von "Erschlagen" sprechen ;-)
#zitieren
Gravatar Jan Lessner 30.11.2009
um 11:40 Uhr
Das stimmt schon - viele GUIs werden von Entwicklern gestaltet, und die haben in der Regel nicht Gestaltung studiert, und das sieht man dann auch ;-)
Ich find's aber OK, das Hauptaugenmerk auf die wirklich wichtigen Dinge zu lenken und an "Nebenkriegsschauplätzen" nicht von vornherein Aufwand für Usability zu spendieren. insbesondere ist es gut, wenn sich da im Nachgang ohne Codeänderung einiges drehen lässt, und das ist genau unsere Intention gewesen. Wir setzen übrigens als GUI-Designtool den JFormDesigner ein, der so komfortabel ist (und insbesondere losgelöst von einer fetten IDE), dass die Fachbereiche es sich nach einer Weile auch selber zutrauen, die Controls an die richtigen Stellen zu schubsen.

Das Toolkit ist leider noch nicht Open Source obwohl es das werden soll. Ich muss unseren Abteilungsleiter noch ein bisschen bearbeiten - das ist mir mit einem anderen Framework in der Vergangenheit auch schon gelungen, deswegen sollte das diesmal auch klappen ;-)
Im Moment schleifen wir noch ein paar Ecken rund. Wenn es Dich sehr interessiert, kann ich checken, ob Du's gegen ein NDA mal haben kannst.
#zitieren

Anzeige

zurück zum Seitenanfang