Page 1 of 2 1 2 LastLast
Results 1 to 15 of 19

Thread: gebruik van exit in een procedure

  1. #1
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747

    gebruik van exit in een procedure

    Ik zie bij mijn nieuwe werkgever heel vaak dit stukje (voorbeeld) code:
    Delphi Code:
    1. procedure foo;
    2. begin
    3.   if gebruiker = '' then
    4.      exit
    5.  
    6.   if waarde = 0 then
    7.      exit
    8.  
    9.   RoepEenfunctieOp()
    10.   showmessage('hallo')
    11. end;
    Dit zal de leesbaarheid en de verwerking van de procedure beter maken, omdat dan alleen code wordt uitgevoerd wat na de if constructie komt en geen exit wordt aangeroepen.

    Ik ben van mening dat de if...then veel beter op deze manier wordt gebruikt:
    Delphi Code:
    1. procedure foo;
    2. begin
    3.   if gebruiker = <> then
    4.   begin
    5.     if waarde <> 0 then
    6.     begin
    7.        RoepEenfunctieOp()
    8.        showmessage('hallo')
    9.     end;
    10.   end;
    11. end;
    Wat is jullie voorkeur?
    Delphi is great. Lazarus is more powerfull

  2. #2
    Aan het begin snel noodzakelijk condities checken en exit als die niet geregeld zijn.
    Dus zoals in je eerste voorbeeld (hoewel je daar ook de condities kunt combineren).

    Bart

  3. #3
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ik ben een voorstander van duidelijk leesbare code en ben ook geen echte liefhebber van overmatig Exit-gebruik (net zomin als Break, Continue en consorten).
    In sommige situaties is het echter duidelijker en leest het "Rustiger" om wel exit te gebruiken, bijvoorbeeld in het voorbeeld van Bart aangeeft: leesbaarheid prevaleert boven voorkeur.

    Je hebt soms van de situaties waarin het aantal begin...end-blokken de code zover naar rechts doen opschuiven dat een eenvoudige en duidelijke Exit helemaal bovenaan alles veel schoner kan maken.

    Wist je trouwens dat je Exit op dezelfde manier kan gebruiken als return in C?
    Delphi Code:
    1. function DoeIets(X: Integer): Integer;
    2. begin
    3.   if X = 1 then
    4.     Exit(-1);
    5.   Result := X * 8;
    6. end;

    In jouw gegeven voorbeeld (ik weet dat het een voorbeeld is) zou ikzelf geen Exit gebruikt hebben, maar eerder iets als:
    Delphi Code:
    1. procedure foo;
    2. begin
    3.   if (gebruiker<> '') and
    4.      (waarde <> 0) then
    5.   begin
    6.     RoepEenfunctieOp();
    7.     showmessage('hallo');
    8.   end;
    9. end;
    Maar aan de andere kant: als een werkgever bepaalde coding guidelines heeft, dan gaat dat natuurlijk altijd voor.
    Last edited by VideoRipper; 24-Feb-22 at 17:40.
    TMemoryLeak.Create(Nil);

  4. #4
    Registered User
    Join Date
    Nov 2004
    Location
    Belgium
    Posts
    15
    John,

    Ik gebruik de Exit functie zelf ook heel vaak.
    Het gaat dan wel om zeer complexe technische programma's met 10-tallen procedures.
    Vaak in het begin van een procedure als kan gecheckt worden dat de rest van de code niet meer moet uitgevoerd worden.
    Ook in exception code van een "try exception end" blok omdat die exceptie meestal als gevolg heeft dat er iets
    serieus fout is en verdere verwerking zinloos is.

    Als je die Exit niet wil gebruiken, kan je alleen een boolean variabele definiëren en de waarde daarvan zette als je bepaalde
    code niet wil uitvoeren. Maar dat is mijn inziens veel complexer en veel foutgevoeliger omdat je dan overal moet gaan testen
    op de waarde van die boolean variabelen.

    De Exit functie is door Borland destijds juist gemaakt om dit soort van functionaliteiten op makkelijke manier te implementeren.
    Wat daarbij ook belangrijk is, is dat je een Exit instructie best altijd in een "try finally end" blok zet omdat de Exit functie de code in
    de "finally" blok nog wel zal uitvoeren.
    Als je bijvoorbeeld de cursor aanpast naar een zandloper bij het begin van de uitvoering van een procedure en je werkt met
    een Exit instructie in de procedure, dan moet je in de "finally" blok de cursor terug de normale waarde geven, anders blijft die cursor
    gewoon staan op de zandloper.

    Maar je hebt wel gelijk dat die Exit in feite een GOTO instructie is wat in sommige programmeertalen bestaat.
    mvg,
    Patrick Vervloet

  5. #5
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Dat de exit() een daadwerkelijk goto is, is mij geheel bekend. Als het complex wordt, moet je het stukje code vereenvoudigen naar een functie. Dan blijft het steeds leesbaar. Maar wat jullie zeggen is wel logisch; het blijft een gevoel. Of het systematisch gebruikt wordt binnen het bedrijf ben ik nog niet echt achter. Mijn ene collega zweert erop. Mijn andere collega weet ik niet zeker.

    Mijn gevoel zegt: een procedure moet altijd eindigen aan het einde.
    try..finally gebruik heel vaak. Zeker bij het aanmaken van lokale objecten.
    Een break gebruik ik alleen in een for..next loop als de waarde in een reeks reeds is gevonden. Dan is het nutteloos om de reeks af te maken (tenzij je meer waarden in een reeks moet zoeken.

    @videoripper
    Dat van die exit was mij niet bekend, maar wel een zinvolle.
    Delphi is great. Lazarus is more powerfull

  6. #6
    J.W. de Bokx
    Join Date
    Jun 2007
    Location
    Pijnacker
    Posts
    82
    Quote Originally Posted by jkuiper View Post
    Een break gebruik ik alleen in een for..next loop als de waarde in een reeks reeds is gevonden. Dan is het nutteloos om de reeks af te maken (tenzij je meer waarden in een reeks moet zoeken.
    In die gevallen gebruik ik liever een while do (of repeat until).
    Dan loop je niet het risico in lastigere code dat iemand iets in de loop toevoegt dat nog wel gedaan moet worden en daar niet komt door de exit.

  7. #7
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Kan, maar voor for ... in ... een beetje lastig als je zoekt naar objecten
    Delphi is great. Lazarus is more powerfull

  8. #8
    Quote Originally Posted by jkuiper View Post
    Wat is jullie voorkeur?
    Ik gebruik bij voorkeur wel die exits aan het begin, bij het controleren van input-variabelen, maar niet of minder verderop in de code, waar de echte kernlogica van de functie staat.
    Al moet ik zeggen dat ik het ook daar steeds meer gebruik, zeker sinds de introductie van de exit(resultwaarde) in functies.
    1+1=b

  9. #9
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046
    Ik moet zeggen, en hier ben ik eigenlijk niet zo heel fier over, maar in projecten waar je echt het onderste uit de kan wil halen, zet ik het in vergelijkbare gevallen gewoon in commentaar:
    Delphi Code:
    1. //assert waarde<>0
    2. //assert Length(gebruiker)>1
    Dit geldt als een soort 'manifest' over wie en hoe deze functie mag aanroepen. Dit is meestal in projecten waar ik alleen aan werk, of met een klein hecht team. In grotere projecten is dat onmogelijk af te dwingen, hoewel ik wel droom van een taal en omgeving waar je het wel zou kunnen omschrijven in een echt functie-manifest en dat ook door de compiler wordt afgedwongen. Met Delphi hebben we een heel sterke en snelle compiler, maar nieuwe ontwikkelingen in de programmeerwereld 'wapenen' compilers met tools om meer te gaan afdwingen zodat je zekerheden over geheugengebruik en verwachtingen over waardes betrouwbaar worden zonder allerhande overblijfsels in de uiteindelijke binary code die van je uitvoertijd afsnoepen.

  10. #10
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Quote Originally Posted by GolezTrol View Post
    Ik gebruik bij voorkeur wel die exits aan het begin, bij het controleren van input-variabelen, maar niet of minder verderop in de code, waar de echte kernlogica van de functie staat.
    Al moet ik zeggen dat ik het ook daar steeds meer gebruik, zeker sinds de introductie van de exit(resultwaarde) in functies.
    Zelfde voor mij, al was ik al een beetje gewend aan het concept in Modula2 (Return) toen het aan FPC toegevoegd werd.

    P.s. FPC heeft exit(waarde) al sinds de betas van 1.0 (1998 of zo), Delphi sinds D2009 geloof ik.

  11. #11
    Senior Member Thaddy's Avatar
    Join Date
    Dec 2004
    Location
    Amsterdam
    Posts
    2,211
    In fpc can dit ook met strings. Kan dat in Delphi ook?
    Code:
    {$mode delphi}
    procedure RoepEenfunctieOp();
    begin
      writeln('Aangeroepen');
    end;
    
    function foo(gebruiker:string='';waarde:integer=0):string;
    begin
      Result :='';
      if gebruiker = '' then
         exit('Gebruiker niet ingevuld'); 
      if waarde = 0 then 
         exit('Geen waarde bekend'); 
      RoepEenfunctieOp();
    end;
    
    begin
      writeln(foo);
      writeln(foo('Bob'));
      writeln(foo('Bob',10));
    end.
    Last edited by Thaddy; 01-Mar-22 at 12:25.
    Werken aan Ansi support voor Windows is verspilde tijd, behalve voor historici.

  12. #12
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Quote Originally Posted by Thaddy View Post
    In fpc can dit ook met strings. Kan dat in Delphi ook?
    Uiteraard.
    TMemoryLeak.Create(Nil);

  13. #13
    Mijn leraar programmeren zei altijd dat het gebruik van Goto, Exit en dergelijken resulteert in spaghetti code en altijd is te vermijden. Ik gebruik ze dus nooit. Nu programmeer ik alleen nog hobbymatig en zijn mijn programma's eigenlijk nooit heel complex.

    Omdat het al even geleden is dat ik op school zat heb ideeën hierover op het internet opgezocht. En daar word ook geadviseerd om dit soort instructies te vermijden omdat het moeilijk te onderhouden codes oplevert.

  14. #14
    Senior Member Thaddy's Avatar
    Join Date
    Dec 2004
    Location
    Amsterdam
    Posts
    2,211
    Quote Originally Posted by ivk View Post
    Mijn leraar programmeren zei altijd dat het gebruik van Goto, Exit en dergelijken resulteert in spaghetti code en altijd is te vermijden. Ik gebruik ze dus nooit. Nu programmeer ik alleen nog hobbymatig en zijn mijn programma's eigenlijk nooit heel complex.

    Omdat het al even geleden is dat ik op school zat heb ideeën hierover op het internet opgezocht. En daar word ook geadviseerd om dit soort instructies te vermijden omdat het moeilijk te onderhouden codes oplevert.
    Ik zie de relatie met deze draad en goto even niet? Wat je schrijft is waar, maar niet in de context van deze draad.
    Werken aan Ansi support voor Windows is verspilde tijd, behalve voor historici.

  15. #15
    Quote Originally Posted by ivk View Post
    Mijn leraar programmeren zei altijd dat het gebruik van Goto, Exit en dergelijken resulteert in spaghetti code en altijd is te vermijden.
    In principe is dat voor IF ook zo. Dat kan ook resulteren in spaghetti. Het is maar hoe je het gebruikt.

    Eigenlijk is IF (in assembler) ook een soort Goto maar wordt het visueel in de code wat beter weergegeven (door indentatie e.d.).

    Dus exit(result) kan zeker zijn nut hebben (mits goed gebruikt).
    Goto is meestal met wat betere taal-constructies te omzeilen. Dat ligt dan meestal niet aan de Goto zelf maar meer aan de manier waarop je het gebruikt en je routine samen hebt gesteld.

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •