Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#58

Re: for-Schleife gegen über while-Schleife

  Alt 22. Mär 2009, 10:14
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 eingoto 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".
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat