Rolf B: Tage berechnen

Beitrag lesen

Hallo Meowsalot,

nimm's mir nicht übel, aber ich leide nun mal an Verbesserungsdrang.

Dein Code hat Geruch. Das meint: da kommen spezifische Muster vor, die auf verbesserungsfähige Programmstruktur hindeuten – code smells auf gut Englisch.

Bei dir riecht der Umstand, dass Du innerhalb der Schleife einen bestimmten Schleifendurchlauf abfragst. Sowas signalisiert: "teile mich". D.h. wenn du den ersten Durchlauf abfragst, dann führe den Code für den ersten Durchlauf VOR der Schleife aus, und beginne die Schleife eins später. Es geht analog, wenn Du den letzten Durchlauf abfragst. Du befreist den Schleifeninhalt damit von unnötiger Logik; das ist gut für das Verständnis und die Performance. Wenn diese Trennung dazu führt, dass Du viel Code kopieren musst, dann ist das ein weiterer smell: der Schleifenrumpf war dann zu groß und möchte gerne in eine oder mehrere Funktionen ausgelagert werden.

Einen immer gleichen Wert innerhalb einer Schleife zu erzeugen ist ebenfalls ungünstig, sowas möchte gerne vorher passieren und in einer Variablen auf Abruf warten. Ein date_add mit 0 Tagen ist wirkungslos, d.h. diesen add lassen wir einfach weg.

Die Verbesserung wäre also - Variante 1:

$date = new DateTime($von);
$oneDay = new DateInterval('P1D');  // oder date_interval_create_from_date_string('1 day');

schreibeZeile($date);

for($i=1; $i < $tage; $i++) { 
   $date->add($oneDay);
   schreibeZeile($date);
}

function schreibeZeile($datum) {
   echo $datum->format('d.m.Y');
}

oder - ohne Trennung in Vor- und Hauptlauf - einfach den add ans Ende der Schleife ziehen. Da addiert man einmal zu oft den Tag. Kann man für übersichtlichen Code verschmerzen.

$date = new DateTime($von);
$oneDay = new DateInterval('P1D');  // oder date_interval_create_from_date_string('1 day');

for($i=0; $i < $tage; $i++) { 
   schreibeZeile($date);
   $date->add($oneDay);
}

function schreibeZeile($datum) {
   echo $datum->format('d.m.Y');
}

Es ist nicht immer leicht, für solche Funktionen gute Namen zu finden. Hier hilft es oft, wenn man solche Codeblöcke zu Klassen zusammen fasst oder zumindest in namespaces aufteilt. Weiß nicht ob das Dein Ding ist, nur ein Vorschlag.

Rolf

--
sumpsi - posui - clusi