0

Groovy Tutorial – Teil 2

Posted by admin on Mar 30, 2008 in Tutorials

Willkommen zum zweiten Teil des Groovy-Tutorials!

Wie zuletzt angekündigt, widmen wir unsere Aufmerksamkeit den Closures widmen. Jedoch klären wir zuerst, was denn diese Closures sind? Der Begriff ist, wie 99% anderer auch, aus dem Englischen und hat im einfachsten Sinne etwas mit dem “Abschließen” von Code zu tun. Im Deutschen werden diese als Funktionsabschlüsse bezeichnet. Closures sind aber weder irgendein neuer Hype-Begriff, noch handelt es sich um eine komplexe Struktur. Per Definition handelt es sich bei Closures um Gebilde, die ihren Definitionskontext reproduzieren können, selbst wenn dieser von außen nicht mehr sichtbar, d.h. nicht existent ist. Praktisch orientierten Leuten kann man sicherlich einfacher damit helfen, indem man den Begriff der Anonymen Methoden und/oder der inneren Klassen in den Raum wirft. Genauso wie eine Anonyme Methode von außen nicht direkt ansprechbar ist (da ihr “Definitionskontext” unsichtbar ist, d.h. diese nicht über einen typischen Funktionskopf verfügen), so kann auch eine Closure in Groovy ohne einen Direktaufruf angewandt werden. Und nicht nur in Groovy, denn Closures sind schon seit der Programmiersprache LISP im Einsatz. Aber, schauen wir uns einfach ein Beispiel an, welches mit dem Auslesen von Dateien zu tun hat.

CLOSURES

Closures mit Groovy

Eine Klasse FileReader sorgt in ihrer statischen Main-Methode dafür, dass eine vorgegebene Datei mittels einer Closure ausgelesen wird. Die ganze Arbeit wird in diesem Abschnitt erledigt:

Closures mit Groovy - Code

Das Objekt file ermöglicht mittels der Methode eachLine das zeilenweise Auslesen der Datei. Um sich den typischen Boilerplate-Code zu sparen, werden keine typischen “ist-die-Datei-zu-Ende”-while-Schleifen implementiert. Stattdessen wird eachLine syntaktisch so behandelt, als ob man genau an dieser Stelle eine neue Methode definiert. Man beachte die {}-Klammern, die bei Methodenaufrufen eigentlich nichts zu suchen haben. Eine Closure wird in diesem Beispiel als eine Referenz übergeben, was wiederum bedeutet, dass Closures Objekte sind.

Zugegeben, all das klingt recht unsinnig und man braucht schon seine Zeit, um sich damit anzufreunden, aber eigentlich ist eine Closure bloß eine Ansammlung von Code, welche sich eben wie ein Objekt verhält und dementsprechend übergeben werden kann. Zugleich aber kann sie wie eine Methode agieren, Parameter entgegennehmen und Werte zurückgeben. Mehr ist nicht drin. Wohl zum Glück ;)

Im Falle der Anwendung von nur einem Parameter, bietet sich an, die interne Groovy-Variable it anzuwenden:

Closures mit Groovy - Code 2

Jedoch bleibt die Frage im Raum, wo der eigentliche Nutzen von Closures zu finden ist? Ruft man sich in Erinnerung den zahlreichen Code, den man “drumherum” schreiben muss, nur um eine Collection zu durchwandern, oder aber eine Datei zu bearbeiten, so ist der Vorteil von Closures auf der Hand. Aber nicht nur die schnellere Erledigung von wiederkehrenden und somit auch langweiligen Aufgaben kann elegant mit Closures erledigt werden. Etwas Anderes, das nicht sofort ins Auge springt, lässt sich sehr einfach mit Closures erledigen. Und das ist die Trennung der Steuerungslogik vom aktuell zu bearbeitenden Code. Gesetzt den Fall, dass die obige Klasse nicht einfach die Datei auslesen muss, sondern auch jedes Zeichen in jeder gefundenen Zeile einzeln ausgeben soll, was müsste im Code getan werden?

Genau, nur der Code innerhalb der geschweiften Klammern muss geändert werden und die Steuerung selbst kann erhalten bleiben. Da bei jedem eachLine-Aufruf die Closure auf’s Neue aufgerufen wird, ist es klar, dass dieser Code nichts mit dem übrigen zu tun hat und problemlos ausgetauscht werden kann.

Closures mit Groovy - Code 3

Hier lernen wir auch zugleich die Verarbeitung von Collections kennen. Und somit auch eine weitere Besonderheit von Groovy: alles kann zu einer Collection werden, denn alles ist ein Objekt und alle Objekte sind Collections von Daten und Methoden.

Warum ist das aber so?

Nun, es hat damit zu tun, dass in Groovy alle Objekte als Iterable gelten können und somit durchsuchbar sind. Da Groovy die Basisklasse Object von Java nicht nur übernommen, sondern diese auch um eine ganze Reihe von nützlichen Methoden erweitert hat, haben alle Subklassen von Groovy die Möglichkeit, unter anderem, auch spezielle Iteratoren zu implementieren, ohne auf die strukturierte Programmierung wie z.B. for-Schleifen zurückgreifen zu müssen. Stattdessen kann jedes denkbare Objekt “seine” Closures anwenden und innerhalb dieser Iteratoren laufen lassen.

Tags: , , , , , , , , ,

Copyright © 2010 Reality.SYS All rights reserved. Theme by Laptop Geek.