dclp FAQ

FAQ der Newsgroups de.comp.lang.php.*

 
  • Increase font size
  • Default font size
  • Decrease font size

Guter Code

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

E-MailDruckenPDFLesezeichen anlegen: Du musst dich einloggen um ein Lesezeichen für diesen Beitrag anzulegen. Es wird deiner persönlichen Lesezeichenliste hinzugefügt.

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();
Halte Code links. Verwende Wächter statt Schachtel-if
http://www.php-faq.de/q-stil-waechter.html
 

Login