Stefan Roock

All About Agile and Lean

Beispiel für Closure


Gerade habe ich einen Anwendungsfall für Closures. Ich habe sequenziellen Code a la:

tueA();
tueB();
tueC();

Ich möchte gerne mitloggen, wie lange die einzelnen Schritte dauern (um das Beispiel zu vereinfachen, logge ich durch Ausgabe auf die Konsole):

long startTime = System.currentTimeMillis();
tueA();
System.out.println("duration in sec: " +  ((System.currentTimeMillis() - startTime) / 1000));

startTime = System.currentTimeMillis();
tueB();
System.out.println("duration in sec: " +  ((System.currentTimeMillis() - startTime) / 1000));

startTime = System.currentTimeMillis();
tueC();
System.out.println("duration in sec: " +  ((System.currentTimeMillis() - startTime) / 1000));

Das funktioniert, nur den eigentlichen Code kann man kaum wiederfinden. Wenn ich Closures (wie z.B. in Groovy) zur Verfügung habe, ist es ganz einfach:

def timeLogged (Closure c) {
    long start = - System.currentTimeMillis()
    c.call()
    println "duration in sec: " + (System.currentTimeMillis() + start) / 1000;
}

timeLogged { tueA() }
timeLogged { tueB() }
timeLogged { tueC() }

Das ist kürzer, redundanzfreier und meiner Meinung nach deutlich besser lesbar.

P.S.: Redundanzfrei kann es ohne Closures in Java natürlich auch hinkriegen, mit anonymen Inner Classes. Dummerweise wird der Code dann noch länger und noch schwerer lesbar.

Published by

3 Antworten zu „Beispiel für Closure”.

  1. Wenn Du in der Mathematik bleibst könntest Du ja eine Funktion „Ableitung“ definieren. Die nimmt als Argument eine Funktion und liefert eine Funktion. Schöner geht’s doch nicht 😉

  2. Bernd Schiffer hat es noch redundanzfreier hingekriegt: http://berndschiffer.blogspot.com/2009/08/beispiel-fur-refactoring-von-beispiel.html

    An seinem Post kann man nicht nur sehen, wie kleinteilig man Redundanzfreiheit fordern kann (und sollte). Man kann auch noch einiges über Groovy-Closures lernen. Die verwendete Technik war mir auch nicht bekannt.

  3. Der Ansatz ist inzwischen in einem eigenen Grails-Plugin gelandet: http://grails.org/Perf4j+Plugin Könnte Dir gefallen 🙂

Hinterlasse einen Kommentar