Juchu, lasst uns noch eine Diskussion um Goto und Goto-ähnliche Konstrukte führen! Das hatten wir schon lange nicht mehr.
Meine Meinung:
Im Gegensatz zu Continue, Break und einem Goto, ist Exit ein relativ harmloses Konstrukt und hat definitiv seine Anwendung. Insbesondere verwende ich es gern, um am Anfang einer Methode die Eingangs-Voraussetzungen (Parameter, Zustand des Objekts) zu prüfen und die Methode dann zu verlassen, wenn es nichts zu tun gibt.
Delphi-Quellcode:
procedure bla(const _s: string);
begin
if _s = '' then begin
// ein leerer String braucht nicht verarbetet zu werden.
Exit; //==>
end;
// irgendwas längeres mit _s machen
end;
oder
Delphi-Quellcode:
procedure TSomeObject.SetVisibiel(_Value: boolean);
begin
if _Value = FVisible then begin
// keine Änderung -> raus
Exit; //==>
end;
FVisible := _Value;
// jetzt noch alles mögliche andere machen
end;
Dieses "Early Return" wird durchaus häufig verwendet, ist aber nicht ganz umstritten.
Dann gibt es noch eine andere praktische Verwendung von Exit: Das frühzeitige Verlassen von Schleifen:
Delphi-Quellcode:
function FindMatchingString(_sl: TStringList; const _s: string; out _Idx: Integer): boolean;
var
i: Integer;
begin
for i := 0 to _sl.Count -1 do begin
if StartsText(_s, _sl[i]) then begin
_Idx := i;
Result := True;
Exit; //==>
end;
end;
Result := False;
end;
Natürlich könnte man da auch Break verwenden, aber die Erfahrung hat mich gelehrt, dass ein Break gerne mal nicht die Schleife beendet, von der man denkt, dass sie beendet wird. Nachdem ich zum x-ten Mal irgendo eine geschachtelte Schleife eingebaut hatte und Break dann plötzlich nur noch diese innere Schleife verlasen hat, habe ich mir komplett abgweöhnt, es zu verwenden. Dito Continue.
Ach ja, und dann gibt es da immernoch das einzige Goto in unserer Codebase, das ich vor 13 Jahren eingebaut habe und jetzt schon aus Trotz drin lassen werde.