Hi,
Die While-Schleifenlösung ist zwar vom Sprachkonzept her die sauberste, aber in der Realität grauenvoll.
Delphi-Quellcode:
i:=0;
While (i<m) and Not AbortedByInnerCode Do Begin
j := 0;
While (j<n) and Not AbortedByInnerCode Do Begin
k := 0;
While (k < r) and Not AbortedByInnerCode Do Begin
l := 0;
While (l < p) and Not AbortedByInnerCode Do Begin
If DoSomeThing = DoesNotWork Then
AbortedByInnerCode := True;
l := l + 1;
End;
k := k + 1;
End;
j := j + 1;
End;
i := i + 1;
End;
Äh.. sauber?
Hier die Goto-Version: Ich finde das besser, weil es lesbarer und *kein* Spaghetticode ist. Denn nicht jedes Goto macht aus Code gleich eine Frickelschusterei. Goto ist ein legitimer Befehl, der -richtig (und damit sparsam!) dosiert- den Code übersichtlicher macht.
Delphi-Quellcode:
For i:=0 t o m-1 do
For j:=0 to n-1 do
For k:=0 to r-1 do
For l:=0 to p-1 do
If DoSomeThing = DoesnotWork Then
Goto ExitLoop;
ExitLoop:
Mal ehrlich: Was ist übersichtlicher?
Ich würde allerdings eine lokale Prozedur verwenden:
Delphi-Quellcode:
Procedure OuterProc;
Var
m,n,o,p : Integer;
Procedure InnerLoop;
Var
i,j,k,l : Integer;
Begin
For i:=0 t o n-1 do
For j:=0 to m-1 do
For k:=0 to o-1 do
For l:=0 to p-1 do
If DoSomeThing = DoesnotWork Then
Exit;
End;
Begin
...
InnerLoop;
...
End;
Damit sind die Goto-Ablehner zufriedengestellt. Ach so, die lokale Prozedur bekommt natürlich einen aussagekräftigen Namen. Denn eigentlich ist es ein 'ausführbarer Kommentar'.
Unabhängig davon, ob 4 verschachtelte Schleifen nicht vielleicht ein falsches Konzept/Algorithmus implizieren, ist die Beendigung aus dem inneren von Schleifen eine generelle Frage, die ich, einmal beantwortet, konsistent und konsequent durch den Code ziehen würde. Also
Entweder IMMER
- mit While-Schleifen arbeiten und einen Flag mitschleppen, ODER
- mit Goto arbeiten, ODER
- mit lokalen Prozeduren und Exit.
Ach, eins noch: Eine andere (sinnvolle) Verwendung für das GOTO fällt mir übrigens nicht ein, Euch etwa?