Performance? Das sagt CCD: Vorsicht vor Optimierungen!
Wie von Stefan schon erwähnt: erst optimieren, wenn nachweislich Suboptimalität herrscht, also zu schlechte Performance.
Das Argument deines Kollegen ist ein Reflex aus einer Zeit... ja, ich weiß gar nicht, wie alt dein Kollege dafür sein müsste, dass ihn sowas geprägt hat. Außerdem halte ich es für ein Argument, das nicht auf der Höhe der Zeit des Compilerbaus ist. Dein Kollege müsste nämlich erstmal zeigen, dass es bei Maschinencode, der am Ende zur Laufzeit von der CLR JIT erzeugt wird, überhaupt einen (speicherplatzmäßigen wie performancerelevanten) Unterschied macht, wo die Deklaration stattfindet.
Bitte ihn doch einfach mal, diesen Nachweis zu bringen :-)
Womit wir wieder beim Messen sind. Suboptimalität muss gemessen werden. Geschieht das nicht, sind andere Werte wichtiger, zum Beispiel Lesbarkeit.
Und da stimme ich auch Stefan zu: die Lesbarkeit sinkt (der Wert der Evolvierbarkeit ist damit kompromittiert). Der Scope der Variablen ist nicht klar. Wenn sie nur für den Code innerhalb der Schleife relevant sind, sollte genau das ausgedrückt werden. Das steckt im Principle of Least Astonishment drin.
Bei C# wären natürlich auch nicht die Sprachfeatures ausgereizt. Denn da könnte man ohne Probleme so formulieren:
(0..20).each{
var test1 = "Hallo Welt " + it
var test2 = "Hallo Welt " + (it * 2)
}
(Mal davon abgesehen, dass der Code ja gar nix tut ;-)
Am Dienstag, 11. Dezember 2012 15:43:42 UTC+1 schrieb Jan Schumacher:
Hallo!
Wollte mich mal kurz vorstellen: Ich bin Jan Schumacher, arbeite für ein
Unternehmen in dem wir seit kurzem die Regeln des CCD anwenden und
damit experimentieren. Ich programmiere seit ca. 2 Jahren mit Groovy und
Grails, davor, so gut wie ausschließlig, mit Java.
Es gab heute während einer Code Review eine Diskussion mit einem Mitentwickler bei
der es darum ging ob es schönerer oder schlechterer Code ist Variablen
mit Objekten innerhalb einer Schleife oder ausserhalb einer Schleife zu deklarieren.
In unserem Beispiel werden die Objekte allerdings nur für einen Schleifendurchgang
und beim nächsten wieder überschrieben.
String test1
String test2
(0..20).each{
test1 = "Hallo Welt " + it
test1 = "Hallo Welt " + (it * 2)
}
Die Argumente waren, wie vorher zu erwarten, die Performance sei
dadurch besser, der Speicher sei nicht unnötig in Verwendung und es sei besser zu