Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#164

AW: Was nervt euch so, wärend der Programmierung.

  Alt 7. Okt 2010, 21:31
Generell sollte man goto schon vermeiden, denn meistens lassen sich solche Konstrukte anders besser lösen. Ich habe letztens allerdings zum ersten mal seit Jahren mal wieder ein goto verwendet (ich bin nicht mal sicher, ob ich es unter Delphi überhaupt schon jemals benutzt habe - es sei denn man zählt exit und break dazu, die beiden Varianten nutze ich recht häufig):
Delphi-Quellcode:
label
  loopend;
begin
  Result := nil;
  for i := 0 to FWorld.Source.LevelCount-1 do
  begin
    Level := FWorld.Source[i];
    for x := 0 to Level.EdgeLength - 1 do
      for y := 0 to Level.EdgeLength - 1 do
        if Assigned(Level[x,y].Content) and (Level[x,y].Content.Typ=AType)
           and Level[x,y].CanRemoveBlock then
        begin
          Result := Level[x,y].Content;
          goto loopend;
        end;
  end;
  loopend:
  { Weiterer Code }
(loopend ist vllt nicht gerade der aussagekräftigste Name für ein label, zugegeben, aber mir fiel in dem Moment nix besseres ein)
Das war wirklich einer der wenigen Anwendungsfälle, wo ein goto imo die beste, übersichtlichste Lösung darstellte. Ohne hätte man hier in jeder Schleife Result prüfen und ggf. die Schleife mit break abbrechen müssen. Höchstens hätte man eine Unterfunktion erstellen und das goto durch exit ersetzen können. Aber letzlich wäre das auch nix anderes als ein verkapptes goto gewesen und hätte zusätzlich noch Overhead durch das ganze function-begin-end-Geplänkel erzeugt und den Code auseinandergerissen.