![]() |
Break/Exit verwenden?
Moin,
angenommen ich habe eine solche Funktion:
Delphi-Quellcode:
Ok, es ist eine doofe Funktion hier, aber das tut ja nichts zur Sache *g*.
function bla: char;
const C = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var I: Integer; begin Result := #0; for I := 1 to Length(C) do begin if C[I] = 'B' then Result := 'B'; end; end; Die Frage: Ist es nun sinnvoll die Funktion nachdem Ergebnis noch weiterlaufen zu lassen nur um ein Break/Exit zu umgehen? Klar macht das hier Performancemäßig keinen Unterschied, aber in meiner anderen Funktion schon. Also wie siehts aus, nach Ergebnis abbrechen(Exit, Break) oder ohne Sinn weiterlaufen lassen? (While-Schleife kommt hier nicht in Frage, auch wenn es in _diesem_ Beispiel möglich wäre) MfG |
Re: Break/Exit verwenden?
Hi,
also ich würde break; verwenden, da man es sich dann einfach angewöhnt und in anderen Funktionen nicht erst überlegen muss ob man es verwendet oder nicht. Der Performancevorteil mag hier nicht sehr groß sein, aber es bringt schon etwas denke ich ;) cu |
Re: Break/Exit verwenden?
Moin,
oft kann man ein break auch umgehen, wenn man aus einer for eine while scheife macht...
Delphi-Quellcode:
Damit bricht man die Schleife auch vorzeitig ab.
function bla: char;
const C = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var I: Integer; begin Result := #0; I := 1; while I <= Length(C) do begin if C[I] = 'B' then begin Result := 'B'; I := Length(C); end; inc(I); end; end; Ich persönlich finde das immernoch besser als ein break, aber da denkt sicherlich jeder anders drüber :-D |
Re: Break/Exit verwenden?
Also ich bevorzuge Break. Man sollte auch darauf achten Exit nicht unnoetig zu verwenden.
In diesem Fall sind ja Break und Exit aequivalent aber das Problem beginnt, wenn man die Funktion erweitert. |
Re: Break/Exit verwenden?
Delphi-Quellcode:
Eine Funktion soll ein Ergebnis liefern, deshalb muss sie terminieren. Das Ergebnis unter bestimmten Vorgaben auf die wirtschaftlichste Weise zu berechnen - das ist Programmieren. Es ist nie eine Frage des Laufzeitverhaltens, ob man eine Iteration abbricht, nachdem das Ergebnis feststeht - es ist stets eine Frage der Logik.
function bla: char;
const C = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var I: Integer; begin // Prolog Result := #0; // Iteration for I := 1 to Length(C) do if C[I] = 'B' then begin Result := 'B'; Exit; end; // Epilog end; In deinem Code-Beispiel wird das Ergebnis durch Iteration bestimmt. Sobald der Epilog keinen Code aufweist haben Break und Exit den gleichen Effekt. Wie der Compiler das im Einzelfall umsetzt darf dich an dieser Stelle nicht interessieren. Wegen des fehlenden Epilogs ist Exit hier die korrekte Terminierung. Break und Exit sind makellose Sprachmittel, warum glaubst du sie vermeiden zu müssen? Grüße vom marabu |
Re: Break/Exit verwenden?
@secure, Robert: Dann werd ichs mit Break; machen ;)
@Narayana: Zitat:
@marabu: Zitat:
Und nen schlechten Stil will ich mir ja nicht aneignen(wenn das hier der Fall wäre). Danke auch allen ansonsten :) |
Re: Break/Exit verwenden?
Zitat:
Z.B. ist das hier:
Delphi-Quellcode:
IMHO oft üersichtlicher als einen ohnehin schon relativ tiefen If-Baum noch eine Ebene tiefer zu schieben.
function TTest.MachWasWennTestGroesserNull(test : integer);
begin if test = 0 then begin exit; end; ....viele geschachtelte If's end; |
Re: Break/Exit verwenden?
Zitat:
|
Re: Break/Exit verwenden?
Weil meine Funktion schnellstmöglich sein muss und anders als bei C++ wird bei der For-Schleife die Bedingung nur 1mal geprüft, bei While-Schleifen hingegen wird die Bedingung immer geprüft.
Ausserdem finde ich For-Schleifen elaganter das ich da nicht selbst Inc(I) machn muss =) Btw: in deinem Beispiel wäre das Exit aber unnötig, da man das gleiche ja mit:
Delphi-Quellcode:
hinkriegen würde.
function TTest.MachWasWennTestGroesserNull(test : integer);
begin if test <> 0 then begin ....viele geschachtelte If's end; end; |
Re: Break/Exit verwenden?
Das in meinem Beispiel das exit nich notwendig ist ist mir schon klar. Ich verwende es nur gelegentlich so, wenn die vielen geschachtelten if's (oder was auch immer) schon ziemlich tief gehen und optisch gerade noch erträglich sind.
|
Re: Break/Exit verwenden?
Zitat:
|
Re: Break/Exit verwenden?
Zitat:
Die Mehrzahl der Teilnehmer an diesem Forum - meine Einschätzung aufgrund der Beiträge der letzten 3 Wochen - sind keine Programmierer, sondern eher daran interessiert sich dahin zu entwickeln. Das Lerntempo hängt allerdings nicht allein vom Lernwillen ab, sondern auch von der Fähigkeit, die hier geposteten Beiträge hinterfragen zu können. Das eigentliche Lernen findet idealerweise außerhalb des Forums statt, da ein Forum ein zu wenig formales und zielgerichtetes Medium darstellt. Zurück zu Break und Exit. Die beiden Anweisungen haben eine glasklare Semantik. Bevor ich in einem Code Review die Verwendung von Break oder Exit moniere, stelle ich in der Regel fest, dass der Programmierer eigentlich ein Codierer war, der gar keinen sauberen Entwurf zustande gebracht hat und einfach drauf los gehackt hat. Das ist die Zeitbombe, die in fast jedem Programm tickt. In einem sauberen Entwurf fallen die beiden Anweisungen zur Terminierung gewiss nicht unangenehm auf. Nachdenkliche Grüße vom marabu |
Re: Break/Exit verwenden?
Ob ich break oder exit nehme, kommt immer drauf an. Meistens sucht man ja was in einer Schleife. Da ich es vorziehe, immer nur eine Aufgabe in einer Routine laufen zu lassen, käme die Suche in eine eigene Funktion:
Delphi-Quellcode:
Vorteil, ich kann auch elegant temorär Speicher alloziieren und über Try..Finally freigeben
Function Suche (Was : TDing) : TResult;
Begin For Result := 0 To Anzahl do If Dinge[Result] = Was then exit; Result := -1 End;
Delphi-Quellcode:
break dagegen beendet die Schleife einfach. Das macht eigentlich nur Sinn, wenn ich gegen meine Doktrin, 'pro Aufgabe eine Funktion' verstosse, was natürlich vorkommt, weil z.B. zwei kurze Schleifen hintereinander, deren Sinn sonnenklar, natürlich nicht in zwei lokale Pupselprozeduren geschmissen werden. Irgendwann is ja auch man gut mit Refactoring.
Function Suche (Was : TDing) : TResult;
Begin S := TStringlist.Create; Try For Result := 0 To Anzahl do If Dinge[Result] = Was then exit; Result := -1 Finally S.Free // Wird auch bei exit aufgerufen End; End; |
Re: Break/Exit verwenden?
Ich finde break und exit auch in den meisten Fällen absolut sinnvoll.
Ein Exit ähnelt dem return aus anderen Sprachen und es passiert ja auch genau das, die Funktion wird verlassen und der Wert zurückgegeben. ;) Mit break kann ich eine Schleife beenden ohne mich ich Abruchsbedingungen in der while clause zu verhaspeln. Solange etwas meinen Code intuitiver und lesbarer macht wäre ich doch schön doof würde ich es nicht nehmen. ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz