Da groovt das Web: Agile Software-Entwicklung

Schnelle Einarbeitung für schnelle Ergebnisse

Die Einarbeitung des Consol-Teams „Grails“ stellte dank des guten Grails-Tutorials (http://www.infoq.com/minibooks/grails, PDF, kostenlos) (auch für Juniors) kein Problem dar. Als später weitere Entwickler zu dem Projekt stießen, konnten diese sich ebenfalls rasch produktiv einbringen.

Durch das so genannte Scaffolding war es den Entwicklern möglich, die ersten prototypischen Seiten der Web-Anwendung automatisch generieren zu lassen. Dies waren beispielsweise Seiten zum Anlegen, Bearbeiten und Auflisten von Nutzern der Anwendung. Auch wenn viele dieser automatisch generierten Seiten im weiteren Projektverlauf wieder stark modifiziert wurden, so waren sie doch ein guter Ausgangspunkt, um die Webdesigner möglichst früh einzubinden. Die Programmierer stellten ihnen eine Installation im Entwicklungsmodus zur Verfügung, sodass sie ihre Änderungen an den Webseiten sofort im Browser überprüfen konnten.

Einheitliche Zeiterfassung mit Grails

Keine moderne Web-Anwendung kommt heutzutage ohne interaktive, auf AJAX basierende Elemente aus. Hierfür bietet Grails von Haus aus eine solide Unterstützung. Wem das nicht reicht, der kann auf zusätzliche Plug-ins zurückgreifen. So konnten die IT-Mitarbeiter von Consol die Einbindung besonderer Oberflächen-Elemente wie Baumansicht der Projektstruktur, Datumauswahl oder Suchfelder mit Autovervollständigung relativ einfach verwirklichen. Dazu verwendeten sie ein Plug-in, das auf YUI (Yahoo User Interface Library) aufsetzt. Die Consol-Programmierer verwendeten weitere Plug-ins für Authentifizierung und Autorisierung (Acegi), für Webtests (Canoo) und für die Generierung von Reports (JasperReports). (Alle offiziellen Plug-ins finden sich unter http://grails.org/plugin/list).

Leider zeigten die Plug-ins im Detail aber auch öfter Defizite, sodass die Entwickler sie an ihre Anforderungen anpassen mussten. Im Extremfall entfernten sie ein Plug-in sogar wieder komplett und ersetzten es durch eine eigene Lösung.

Erste Tests mit realen Daten zeigten eine erschreckend schlechte Performance. Es stellte sich heraus, dass Hibernate in ineffizienter Weise auf die Datenbank zugriff. Durch entsprechendes Tuning ließ sich dieses Problem jedoch beheben. Dass Grails auf bekannten Technologien aufsetzt, war hier für Consol von enormem Vorteil, denn somit war entsprechendes Know-how vorhanden. Trotz dieser Hindernisse war das Projekt erfolgreich und die Entwickler bewerteten die Entscheidung für Grails durchweg positiv.

Fazit

Zu empfehlen ist Grails jedem, der eine Web-Anwendung entwickeln will und bereits über Grundwissen der Sprache Java und Web-Technologien im Java-Umfeld verfügt. Durch kurze Einarbeitungszeiten und hohe Produktivität können Entwickler rasch auf Kundenwünsche und geänderte Anforderungen reagieren. Agile Software-Entwicklung unter enger Einbeziehung des Kunden wird damit noch besser möglich.

Die größte Produktivität ist bei Projekten zu erreichen, die „auf der grünen Wiese“ beginnen. In diesen Fällen erzeugt Grails automatisch ein passendes Datenbankmodell. Ist aber ein Datenbankmodell vorgegeben, ist mit höherem Anpassungsaufwand zu rechnen. Dieser Nachteil ist allerdings nicht Grails-spezifisch, sondern kommt stets dann zum Tragen, wenn ein Persistenz-Framework wie Hibernate, JPA oder TopLink zum Einsatz kommt.

Zudem ist man gut beraten, ein solides Verständnis der zugrunde liegenden Technologien Spring und Hibernate mitzubringen. Dies birgt enorme Vorteile für den Fall, irgendwelche „Spezialitäten“ entwickeln zu müssen, die mit Grails-Mitteln allein nicht verwirklicht werden können. Oder, falls es bei Entwicklung oder Betrieb zu Problemen kommt, die ein Eingreifen in die technologische Basis erfordern.

Ferner ist gegenüber den an und für sich sehr praktischen Plug-ins ein gewisses Maß an Skepsis angebracht. Die Entwickler von Consol haben die Erfahrung gemacht, dass die Qualität und Brauchbarkeit der Plug-ins enorm schwankt. Meist gibt es für ein Problemfeld gleich mehrere verschiedene Plug-ins. Eine vorherige Evaluierung der Alternativen ist also empfehlenswert.

Alles in allem ist Grails aber ein rundum gelungenes Framework für die Entwicklung von Web-Anwendungen, bei dem die Entwickler im Vergleich zu anderen Frameworks von viel lästiger und unproduktiver Arbeit entbunden sind und sich damit stärker auf die Geschäftslogik konzentrieren können. Eine entsprechend höhere Produktivität ist die Folge. Außerdem macht die Entwicklung mit Grails einfach Spaß.

Einfach erklärt!
Convention over Configuration

Ein Paradigma, in dem der Zusammenhang zwischen Komponenten einer Anwendung statt über Konfigurationsdateien mittels Einhaltung von Namenskonventionen hergestellt wird. Dies ist eine Reaktion auf moderne Frameworks (bspw. Spring oder Hibernate), in denen es zu einem inflationärem Einsatz von Konfigurationsdateien kam, was die Entwicklung von Anwendungen kompliziert und fehleranfällig machte.

JEE

Java Platform, Enterprise Edition. Eine Software-Architektur, die eine Vielzahl von Komponenten und Diensten definiert, auf deren Basis sich verteilte, skalierbare Anwendungen realisieren lassen. Im Zusammenhang mit Grails sind jene Teile relevant, die für Web-Anwendungen benötigt werden – allen voran der sogenannte Web-Container (stellt die Infrastruktur für die Ausführung von Servlets und Java Server Pages zur Verfügung). Das Ergebnis der Entwicklung mit Grails ist ein sogenanntes Web-Archiv (WAR), das sich in jedem JEE-konformen Web-Container installieren und ausführen lässt.

Spring

Ein Java-Framework, das eine Reihe von Komponenten und Diensten zur Verfügung stellt, die der Wartbarkeit, Skalierbarkeit, Testbarkeit und Übersichtlichkeit von Applikationen zugute kommen. Grails verwendet wichtige Teile von Spring wie den IoC-Container, Spring-MVC, Connection Handling, Transaction Management.

Sitemesh

Ein Framework, das es ermöglicht, von einer Webanwendung erzeugten HTML-Code umzubauen und anzureichern, um somit beispielsweise ein einheitliches Layout aller Webseiten zu gewährleisten. In Grails wird Sitemesh genau dazu verwendet. Der durch Groovy Server Pages beschriebene HTML-Code wird mittels Sitemesh in seine Hauptbestandteile zerlegt, und diese werden dann in ein einheitliches Layout eingebettet. So ist es etwa möglich, auf allen Seiten im oberen Bereich ein Menü einzusetzen. Dies muss nur an einer Stelle – nämlich der zentralen Layout-Datei – definiert werden.

Persistenz-Framework

Ein Framework, das es erlaubt, Daten in eine Datenbank zu schreiben und wieder zu lesen. Im engeren Sinne werden hierunter Object-Relation-Mapper verstanden, die komplette Java-Objekte (oder ganze Objekt-Strukturen) auf die Tabellen einer Datenbank abbilden. Hierzu zählen u.a. Hibernate, Oracle TopLink, JPA. Grails verwendet Hibernate, um die Objekte der Domäne der Web-Anwendung in einer Datenbank zu speichern und diese auch wieder daraus zu lesen.

Scaffolding

Ein Komfort-Feature von Grails, mit dem sich zu einer existierenden Domänen-Klasse automatisch prototypische Web-Seiten für Erzeugen (create), Bearbeiten (edit), Auflisten (list) und Löschen (delete) generieren lassen. Diese sind funktionsfähig, müssen aber in der Regel noch hinsichtlich Web-Design und Benutzerkomfort bearbeitet werden.

Listen- und Map-Literale

Ein Feature von Groovy, mit dem Listen und Maps direkt im Code spezifiziert werden können (statt sie wie in Java mittels vieler Statements zusammen zu bauen). Beispiel für eine Liste:

def list = ( ‚alpha‘, ‚beta‘, ‚gamma‘, ‚delta‘)

Beispiel für eine Map:

def map = ( ‚alpha‘: 1, ‚beta‘: 2, ‚gamma‘: 3, ‚delta‘: 4 )

dynamische Typisierung

Im Gegensatz zu Java muss der Typ eines Objekts in Groovy nicht bereits zur Compile-Zeit feststehen. Es ist vielmehr möglich, ein Objekt mittels def object ohne genaue Typ-Information anzulegen. Erst wenn dieses Objekt zur Laufzeit verwendet wird (also bspw. eine Methode aufgerufen oder auf eine Property zugegriffen wird), überprüft die Groovy Laufzeit-Umgebung anhand des aktuellen Typs, ob der gewünschte Zugriff überhaupt möglich ist und welche konkrete Klasse dazu verwendet werden muss. Es kann aber genauso gut sein, dass für diesen Zugriff ein in der Metaklasse definierter Handler einspringt. So ist es in Grails möglich, auf einen Eintrag in einer Map wie auf eine Property zuzugreifen (map.alpha statt mit map[‚alpha‘]).

Closure

Ein Feature in Groovy. Ein Code-Block ähnlich einer Methode. Im Gegensatz zu einer Methode ist ein Closure nicht Bestandteil einer Klasse, sondern selbst ein Objekt. Dieses kann (wie jedes andere Object auch) an Variablen zugewiesen werden, als Methoden-Parameter verwendet werden oder als Rückgabewert einer Methode zurück gegeben werden. Zusätzlich hat man innerhalb eines Closure Zugriff auf den Kontext, innerhalb dem das Closure instantiiert wurde.

Damit lässt sich in vielen Fällen eleganter Code formulieren. Insbesondere Iterationen können häufig durch den Gebrauch von Closures durch Einzeiler ersetzt werden. Beispiel: Eine Liste mit Strings in eine neue Liste überführen, in der die Original-Strings in Großbuchstaben umgewandelt wurden.

def upperCaseList = list.collect { toUpperCase(it) }

Das Konstrukt in geschweiften Klammern ist das Closure-Literal. it ist eine vordefinierte Variable, die das gerade aktuelle Listenelement der Iteration repräsentiert.

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.