Groovy Closures – Eine Einführung

image

Zu Beginn dieses Posts der Verweis auf die Formale Definition von Groovy-Closures auf der offiziellen Groovy-Homepage.  Closures bieten eine elegante Möglichkeit ‘higher-ordered-functions’ zu implementieren. Dabei handelt es sich um Methoden, die entweder andere Methoden als Parameter übergeben bekommen, oder aber als Return-Wert zurückgeben. Groovy implementiert Closures auf eine sehr elegante Weise, nämlich als Verwendung von Funktions-Pointern in objektorientiertem Stiel. Angenommen man möchte die Summe aller geraden Zahlen von 2 bis n berechnen, wobei n der übergebene Parameter einer Methode sum ist, dann würde man dies eventuell auf herkömmliche Art und Weise wie folgt lösen:

image

Zusätzlich möchte man vielleicht auch noch das Produkt dieser Zahlen berechnen. Man könnte also eine weitere Methode product implementieren, die prinzipiell genau wie die Methode sum aufgebaut ist, jedoch statt dem +-Operator den *-Operator verwendet. Der Code dafür könnte z.B.: so aussehen:

image

Nun kommen Closures ins Spiel. In diesem konkreten Beispiel kapsel ich die Berechnung der geraden Zahlen, also die for-Schleife, in eine Methode pickEven und implementiere die mathematischen Operationen in Groovy-Closures. D.h. ich trenne das, was gleich ist, von dem was variiert. Die pickEven Methode besitzt zwei Parameter: n und eine weitere Variable die im weiteren eine Referenz auf die zukünftig übergebenen Closures hält:

image

Die Bezeichnung der Variable für die Referenzierung der Closures kann beliebig gewählt werden. Wie man leicht erkennen kann, kommt in diesem Beispiel das DRY-Principle zur Anwendung. Man vermeidet dadurch auf elegante Weise seinen Code zu duplizieren. Man kann nun die Methode pickEvan Methode auf unterschiedliche, jedoch gleichwertige Art und Weise aufrufen:

image 

Man kann beliebig viele Closures als Parameter an eine Methode übergeben. Wenn jedoch nur der letzte Parameter eine Closure-Referenz darstellt, dann können die Runden Klammern entweder komplett entfallen oder nur die herkömmlichen Parameter müssen in die Klammerung engschlossen werden. In der letzten Abbildung werden allerdings nur die berechneten ganzen Zahlen auf der Console ausgegeben. Möchte man noch auch noch die Summe oder das Produkt dieser Zahlen berechnen kann man die Closures wie folgt abändern:

image

Wenn man nur eine Variable an Closures übergibt, so wie die Laufvariable i der for-Schleife in der pickEvan Methode, dann kann man innerhalb der Closures mittels einer speziellen Variable die mit it bezeichnet wird, die übergebene Variable referenzieren. Man kann auch eine alternative Bezeichnung für die in den Closures referenzierte Variable setzen.

image

Sofern der Leser überhaupt noch nicht mit Closures in Berührung gekommen ist, hoffe ich dass dieser Post eine kurze Einführung in die Thematik geben konnte. In künftigen Beiträgen möchte ich näher auf den Verwendungszweck von Closures und deren Bedeutung in Groovy eingehen. Mit Hilfe von Closures kann man auch sehr elegant einige nützliche Patterns wie z.B.: das Strategy-Pattern oder das Execute-Around-Method-Pattern umsetzen. Auch was es mit Dynamic Closures oder Closures mit Curry-Geschmack auf sich hat, werde ich in naher Zukunft erläutern.

Über sageniuz

https://about.me/ClausPolanka
Dieser Beitrag wurde unter Programming veröffentlicht. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s