Beispiel für Closure
Juli 27, 2009 at 10:58 vormittags 3 Kommentare
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.
3 Kommentare Füge Deinen hinzu
Kommentar verfassen
Diesen Artikel zurückverfolgen | Abonniere Kommentare via RSS Feed
1.
Markus Andrezak | August 4, 2009 um 7:53 nachmittags
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.
stefanroock | August 17, 2009 um 11:49 vormittags
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.
Bernd Schiffer | September 13, 2009 um 6:13 nachmittags
Der Ansatz ist inzwischen in einem eigenen Grails-Plugin gelandet: http://grails.org/Perf4j+Plugin Könnte Dir gefallen