Groovy Closures – Curried Closures

Bisherige Groovy Closure Beiträge:

In diesem Artikel möchte ich der Closure-Programmierung ein Wenig Würze verleihen, nämlich durch Anwendung von Curried Closures. Bei Verwendung von Curried Closures kann man bestimmte Parameter vorbinden. Mittels dieser Technik kann wieder einmal Redundanz und Code-Duplikation vermieden werden. Im folgenden Beispiel würde man zweimal die Closure mit unterschiedlichen Strings aufrufen, das Datum ändert sich dabei jedoch nicht.

image

Mit Hilfe der Curry-Funktion kann diese Duplikation von Code verhindert werden, indem man dem date-Parameter Würze verleiht. Man ruft einfach curry() mit dem gewünschten Parameter auf und referenziert dann diese Curried Closure. In diesem Beispiel wird die gewürzte Closure mittels der Variable postFortune referenziert. Dabei wird der Wert von date vorgebunden.

image

image

Man kann dann die Curried Closure mit dem zweiten Parameter (fortune), der für die ursprüngliche Closure gedacht war, aufrufen. Die gewürzte Closure übernimmt die Verantwortung und sendet den fortune und den vorgebunden Parameter an die ursprüngliche Closure. In der folgenden Abbildung kann man den zugehörigen Output sehen.

image

Mann kann auch mehrere Parameter mit Curry versehen, allerdings müssen diese am Beginn aufgelistet werden. Hat man also zum Beispiel n Parameter, kann man die ersten k Parameter, wobei 0 <= k <= n, würzen. Mittels Currying kann man Funktionen die mehrere Parameter besitzen, durch Funktionen, die weniger (normalerweise einen) Parameter besitzen, ausdrücken. In Groovy verwendet man also das Würzen von Closures um den “Noise” in Code zu reduzieren.

Dynamic Closures

In Groovy kann man auch feststellen, ob eine Closure an eine Methode übergeben wurde oder nicht. Falls man keine Closure übergeben bekommt, kann man eventuell eine Default-Implementierung bereitstellen. D.h. man stellt eine generelle Implementierung zur Verfügung sofern der Caller keine Speziellere übergeben hat. In der folgenden Abbildung sieht man ein Beispiel wobei überprüft wird, ob eine Closure an die Methode übergeben wurde oder nicht.

image

Und hier der dazugehörige Output:

image

Man kann auch die Anzahl und die Typen der Parameter einer Closure dynamisch bestimmen, was zu einer erhöhten Flexibilität beiträgt. Angenommen man verwendet eine Closure zur Berechnung der Steuer eines Verkaufs. Der Betrag der Steuer hängt dabei vom Verkaufsbetrag und dem Prozentsatz der Steuer ab. Dabei kann, muss jedoch nicht zwingend der Prozentsatz an die Closure übergeben werden. Die folgende Abbildung zeigt das gerade beschriebene Beispiel.

image

Mittels maximumNumberOfParameters Property (oder getMaximumNumberOfParameters() Methode) kann die akzeptierte Anzahl von Parametern der Closure bestimmt werden. Den Typ der Parameter kann man mittels der parameterTypes Property  (oder getParameterTypes() Methode) ermitteln. In der folgenden Abbildung noch der Output des letzten Beispiels.

image

Selbst wenn eine Closure keine Parameter verwendet, wie z.B. in {} oder { it } existiert stets der Default-Parameter it. Wenn der Caller keine Argumente an die Closure übergibt, dann ist der Parameter it gleich null. Wenn man verhindern möchte, dass keine Parameter an die Closure übergeben werden, verwendet man folgende Signatur: {-> }. Da keine Parameter vor –> angeführt werden, legt man damit fest, dass 0 Parameter an die Closure übergeben werden können.

image

Und hier wieder der zugehörige Output:

image

Zusammenfassend kann man feststellen, dass durch die Verwendung der Eigenschaften maximumNumberOfParameters und parameterTypes, das dynamische Analysieren einer Closure und die Implementierung von Logik flexibler wird. Wie es innerhalb einer Closure aussieht, werde ich im nächsten Blogeintrag zu Closure Delegation näher beschreiben.

Ü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