Lesbarer Code ist dann lesbar, wenn ihn jemand anderes mit halbwegs gleichem Kenntnisstand versteht.
So?
Delphi-Quellcode:
Function ExistsObjectIn3D (aKey : TSomeType) : Boolean;
Var
x,y,z : Integer;
Begin
For x := 0 to MaxX do
For y := 0 to MaxY do
For z := 0 to MaxZ do
If Space3D[x,y,z] = aKey Then Begin
Result := True;
Exit;
End;
End;
Oder so?
Delphi-Quellcode:
Function ExistsObjectIn3D (aKey : TSomeType) : Boolean;
Var
x,y,z : Integer;
Begin
Result := False;
x := 0;
While (x <= MaxX) and not Result do
Begin
y := 0;
While (y <= MaxY) and not Result do
Begin
z := 0;
While (z <= MaxZ) and not Result do
If Space3D[x,y,z] = aKey Then
Result := True;
End
End
End;
Ich bevorzuge die erste Variante. Sie ist nahezu selbstdokumentierend.
Für 'Break' findet sich ein ähnliches Beispiel, wobei ich anstatt:
Delphi-Quellcode:
j := -1;
For i:=0 to Foobar Do
If ValueExists(i) Then Begin
j := i;
break;
End;
If j>=0 Then ...
...
Lieber eine lokale Funktion verwende:
Delphi-Quellcode:
...
Function _IndexOfValue : Boolean;
Begin
For Result := 0 To Foobar Do
If ValueExists (Result) Then Exit;
Result := -1;
End;
Begin
...
If _IndexOfValue >= 0 Then
...
End;
Bei mir steht *immer* die Lesbarkeit (neben Wartbarkeit und Erweiterbarkeit) im Vordergrund. Das sind für mich die einzig geltenden Regeln. Wenn ein
exit einen Code lesbarer macht, nur her damit. Selbst ein
goto darf dann verwendet werden. Mir muss der Programmierer nur hinreichend erklären, wieso dieses Konstrukt hinsichtlich der geltenden Regeln (s.o.) die beste Wahl ist.
Und um den Bogen zur Ausgangsfrage zu spannen: Welches Schleifenkonstrukt nun verwendet wird, hängt wiederum von der Aussage ab, die getroffen werden soll. Denn Code hat eine Aussage: Er erklärt, wie ein Problem gelöst wird. Hier drei Lösungsansätze für das Problem: "Richtiges Verhalten zur Nahrungsaufnahme":
(1)
While: "Solange Du Hunger hast, iss ein Brot"
(2)
For / ForEach: "Für alle Brote: Iss sie auf"
(3)
Repeat: "Iss ein Brot, bis du satt bist (keinen Hunger mehr has)"
(1) impliziert, das man keinen Hunger haben könnte,
(2) ignoriert ihn und
(3) verhindert eine Hungersnot.
Welches Konstrukt gewählt werden sollte, hängt also einzig und allein von der Aufgabenstellung ab (Gesunde Ernährung, Mästen, Abwenden von Hungersnöten).
PS: Um (2) zur gleichen Aussage wie (1) zu bewegen, benötigt man das
"Break":
(2a)
For / ForEach: "Für alle Brote: Iss sie auf, aber wenn Du währenddessen keinen Hunger mehr hast, hör auf".