de.comp.lang.php.* FAQ

27.1. Halte Code links. Verwende Wächter statt Schachtel-if

Keywords: Schleife | Funktion | If

Antwort von Kristian Köhntopp

In der strukturierten Programmierung erzeugt man Schleifen ohne Schleifenkurzschlüsse mit continue oder break und Funktionen mit genau einem Funktionsausgang durch return. Dadurch entsteht häufig Code mit sehr vielen geschachtelten Abfragen.

Meistens versucht man vor der eigentlichen Nutzlast einer Schleife oder einer Funktion eine Reihe von Vorbedingungen zu testen, die für den erfolgreichen Einsatz der Nutzlast sichergestellt sein müssen. Der generierte Code sieht dann wie folgt aus:

if (vorbedingung) {
  if (vorbedingung2) {
    if (vorbedingung3) {
      doit(); // Nutzlast
    } else {
      handle_error3();
  } else {
    handle_error2();
  }
} else {
  handle_error();
}

Dies ist sehr schwer zu lesen und zu verstehen, weil der eigentliche Zweck der Funktion tief geschachtelt und sehr unübersichtlich versteckt ist. Geübte Programmierer verwenden stattdessen absichtlich die in der strukturierten Programmierung verpönten Schleifenkurzschlüsse und frühzeitigen Funktionsausstiege in einer bestimmten Form, um besser lesbaren Code zu schreiben:

if (!vorbedingung)
  handle_error();

if (!vorbedingung2)
  handle_error2();

if (!vorbedingung3)
  handle_error3();

doit; // Nutzlast

Dieser Code skaliert sich besser: Egal wieviele Vorbedingungen zu erfüllen sind - die Einrücktiefe bleibt konstant. Außerdem steht der normale Fall jetzt in Falllinie und der Fehlercode ist als Ausnahme eingerückt und zur Seite gedrängt.

Ein praktisches Beispiel: Der folgende Code zum Durchlesen eines Verzeichnisses

$d = dir("d:/logfiles");
while($entry=$d->read()) {
  if (($entry != ".") && ($entry != "..")) {
    doit();
  }
}
$d->close();

wird durch die Umstellung zu

$d = dir("d:/logfiles");
while ($entry = $d->read()) {

  if ($entry == "." or $entry == "..")
        continue;

  doit();
}
$d->close();

Valid HTML 4.01! Valid CSS!

27.1. Halte Code links. Verwende Wächter statt Schachtel-if
http://www.php-faq.de/q/q-stil-waechter.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team