Beispiel für Closure

July 27, 2009 at 10:58 am 3 comments


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.

Entry filed under: #. Tags: .

Verantwortung in der Praxis Reflektionen über Prolog

3 Comments Add your own

  • 1. Markus Andrezak  |  August 4, 2009 at 7:53 pm

    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 at 11:49 am

    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 at 6:13 pm

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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Trackback this post  |  Subscribe to the comments via RSS Feed



%d bloggers like this: