AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Automatisches Verlassen einer Funktion bei Result := False;

Automatisches Verlassen einer Funktion bei Result := False;

Ein Tutorial von d3g · begonnen am 21. Jun 2002 · letzter Beitrag vom 23. Sep 2002
Antwort Antwort
Benutzerbild von d3g
d3g
Registriert seit: 21. Jun 2002
Automatisches Verlassen einer Funktion bei Result := False;

Wer viel mit Algorithmen arbeitet, kennt das Problem: Jedesmal, wenn man in einer Funktion Result auf False setzt, will man eigentlich, dass die Funktion auch gleich mit Exit beendet wird - dazu sind zwei Zeilen nötig. Wenn man das oft macht, kann da einen Code auch verunstalten und unübersichtlich machen.

Die Idee bei diesem Tipp: statt Result auf False zu setzen, löst man künstlich eine Exception aus, die mit try..except abgefangen wird. Beim Abfangen wird Result auf False gesetzt und die Funktion verlassen. Das kann viele Zeilen Code sparen.

Dazu muss aber gesagt werden, dass Exceptions eine recht zeitspielige (und damit auich kostspielige ) Angelegenheit sind, man sollte das also nicht unbedingt im Suchalgorithmus oder in der Datenbankquery anweden.

So sieht das ganze in der Praxis dann aus:

Zuerst deklariert man eine eigene Exception, die dann ausgelöst werden soll:

Code:
type
  EResultFalse = class(Exception);
Jetzt kann man das ganze im Code anwenden:

Code:
function Test(h: THandle): Boolean;
begin
  try
    if (h = INVALID_HANDLE_VALUE) then
      raise EResultFalse.Create(''); // Exception auslösen
  except
    on EResultFalse do begin
      Result := False;
      Exit;
    end;
  end;
end;
Bei Create ist ein Parameter nötig, der die Message ausgeben würde, die erscheint, wenn die Exception nicht abgefangen würde. Man sollte übrigens unter Tools|Debugger Options|Language Exceptions das Anhalten bei Delphi-Exceptions ausschalten, ansonsten bekommt man in der IDE jedes mal, wenn Result auf False gestellt wird, eine Exception gegen den Kopf geschleudert...

Viel Spaß,
d3g
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
 
jbg

 
Delphi 10.1 Berlin Professional
 
#2
  Alt 21. Jun 2002, 17:08
Ich will dich ja nicht kritisieren, aber ich mache das setzen von Result:=False+Exit; so:
Code:
function Test(h: THandle): Boolean;
begin
  Result := False;
  if (h = INVALID_HANDLE_VALUE) then
    Exit;
  // ...
  Result := True;
end;
Und ich findes es sehr Hilfreich, wenn Delphi die Exception für mich abfängt, da ich somit genau weiß, in welcher Funktion/Bereich die Exception ausgelöst wurde und somit schneller den Fehler finde, als wenn ich erst das ganze Programm debuggen muss.
Und Exceptions sind nicht dazu da einen Algorithmus zu unterstützen, sondern um Fehler in ihm abzufangen. Sonst könnte man gleich wieder zum GOTO zurückkehren.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g
 
#3
  Alt 21. Jun 2002, 17:18
Hi jbg,

du hast ganz recht, allerdings ist es manchmal sinnvoller, Result am Funktionsanfang auf True und nicht auf False zu stellen. Das umzuschreiben würde einen Code teilweise unverständlich und umständlich machen, deshalb mache ich es so.

Was das goto angeht: Schön ist es nicht, aber manchmal doch recht sinnvoll. Der try..except..end-Block ist, das musst du zugeben, auch sehr viel eleganter also goto:
Code:
function Test(h: THandle): Boolean;
begin
  try
    if (h = INVALID_HANDLE_VALUE) then
      raise EResultFalse.Create(''); // Exception auslösen
  except
    on EResultFalse do begin
      Result := False;
      Exit;
    end;
  end;
end;
statt
Code:
function Test(h: THandle): Boolean;
label
  resultfalse, toend;
begin
  Result := False;
  if (h = INVALID_HANDLE_VALUE) then
    goto resultfalse;
  // ...
  goto toend;
  resultfalse:
  Result := True;
  toend:
  // ...
end;
Aber da die Kritik an dieser Methode immer größer wird: Ich werde mich nicht daran festbeißen, ich bestehe absolut nicht darauf, ihn durchzubringen.

MfG,
d3g
  Mit Zitat antworten Zitat
Christian Seehase

 
Delphi 2006 Professional
 
#4
  Alt 21. Jun 2002, 17:19
Moin Zusammen,

in diesem speziellen Falle ginge es sogar so sehr gut:

Code:
function Test(h: THandle): Boolean;
begin
  Result := h <> INVALID_HANDLE_VALUE;
end;
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g
 
#5
  Alt 21. Jun 2002, 17:49
Hallo Christian,

ja, in diesem Fall, aber es geht hier doch eher um kompliziertere Funktionen

MfG,
d3g
  Mit Zitat antworten Zitat
Christian Seehase

 
Delphi 2006 Professional
 
#6
  Alt 21. Jun 2002, 18:12
Moin d3g,

ist schon klar
Ich für meinen Teil bevorzuge allerdings auch jbg's Vorgehensweise:
Erst einmal Result initialisieren, und dann ggf. einfach mit Exit raus.
Das auch wenn es sich nicht um boolsche Results handelt.
In diesem Falle wird dann einfach nach jedem Exit Result mit dem nächstwahrscheinlichen Wert gefüllt.
Dadurch erspare ich mir dann auch tiefere Verschachtelungen.

Ist natürlich auch Geschmackssache.
  Mit Zitat antworten Zitat
Udontknow
 
#7
  Alt 6. Aug 2002, 13:35
Hallo!

Weiteres Argument gegen das Auslösen einer Exception:

Try-Blöcke sollen langsam sein, so habe ich mal irgendwo aufgeschnappt. Man sollte ihren Einsatz also auf kritische Stellen wie Speicherfreigabe etc. reduzieren.

Cu,
Udontknow
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g
 
#8
  Alt 6. Aug 2002, 15:01
Zitat:
Dazu muss aber gesagt werden, dass Exceptions eine recht zeitspielige (und damit auich kostspielige ) Angelegenheit sind, man sollte das also nicht unbedingt im Suchalgorithmus oder in der Datenbankquery anweden.
MfG,
d3g
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#9
  Alt 23. Sep 2002, 13:35
Hallo,

ich finde das die Exception den Code nicht nur langsamer, sondern auch unübersichtlicher macht. Wenn Du nur eine Zeile willst, warum schreibst Du dann nicht:
Code:
...
  Result := False; Exit; // Abbruch
...
Aber das ist nur meine bescheidene Meinung und Geschmackssache.

Ich persönlich bevorzuge jbg's Vorschlag.
(Mache ich schon ewig so und hatte noch nie Probleme damit.)

Aber wegen so einer Kleinigkeit sollte man sich nicht streiten.
Es gibt ja schließlich auch Schreibfaule die statt False einfach 1=2 schreiben, weils kürzer ist (result:=1=2;Exit

mfg
MaBuSE
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g
 
#10
  Alt 23. Sep 2002, 13:59
Hi MaBuSE,

jbg's lösung ist nicht universell, sondern nur bei sich wiederholenden if-Abrfragen zu gebaruachen. Und ob nun eine Zeile oder zwei ist mir auch egal. Es geht nur um diese begin..end-Konstrukte bei Schleifen und if-Abrfragen, die den Quellcode aufblähen.

MfG,
d3g

PS. Ich frage mich, warum der Thread eigentlich nach "Tutorials" verschoben wurde...
  Mit Zitat antworten Zitat
Themen-Optionen Tutorial durchsuchen
Tutorial durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf