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.

Eintrag abgelegt unter #. Tags: .

Verantwortung in der Praxis Reflektionen über Prolog

3 Kommentare Füge Deinen hinzu

  • 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 :-)

Kommentar verfassen

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

WordPress.com-Logo

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

Twitter-Bild

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

Facebook-Foto

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

Verbinde mit %s

Diesen Artikel zurückverfolgen  |  Abonniere Kommentare via RSS Feed



Follow

Bekomme jeden neuen Artikel in deinen Posteingang.

Join 158 other followers