Autor |
Beitrag |
cerebrum
Hält's aus hier
Beiträge: 10
|
Verfasst: Do 27.03.03 16:15
Hi!
Wenn ich in Sprachen wie C++,Perl etc. den Befehl "return" innerhalb einer Funktion aufrufe, dann wird der Wert zurückgegeben und die Funktion wird verlassen. In Pascal wird allerdings bei einer Zuweisung an "Result" die Funktion nicht verlassen, daher muss ich immer den Befehl "exit" aufrufen. Jedoch habe ich gehört, das sei nicht sehr elegant. Kennt jemand eine bessere Lösung oder ist die Behauptung einfach falsch, dass das unelegant ist?
Danke!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 27.03.03 16:27
Ohne mir jetzt einen großen Kopf zu machen, behaupte ich jetzt einfach die Aussage ist falsch.  Ob jemand exit mag oder nicht, ist wohl Geschmackssache.
|
|
DaRkFiRe
      
Beiträge: 526
WinXP Home & Professional
C, C++, Delphi
|
Verfasst: Do 27.03.03 16:32
Ich stimme Luckie zu - wenn EXIT unelegant ist, dann müsste das return (was in Delphi nix weiter wäre als ein begin Result:=...; exit; end;) auch unelegant sein - und PHP und C/C++ zweifle ich nicht an. Die Sprachen sind unantastbar
Nein mal im Ernst - besser (und übersichtlicher!?) wäre es doch, mit IF THEN ELSE Strukturen zu arbeiten, oder?
_________________ Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Do 27.03.03 19:58
DaRkFiRe hat folgendes geschrieben: | Nein mal im Ernst - besser (und übersichtlicher!?) wäre es doch, mit IF THEN ELSE Strukturen zu arbeiten, oder? |
Nicht unbedingt. Wenn du eine Prüfung am Anfang eine Funktion machst, dann ist ein Exit besser angebracht, da man schon von vornherein sieht, dass bei dieser Bedingung keine weiteren Aktionen durchgeführt werden. Wenn nun ein begin ... end verwendet würde, müsste man erst das dazu passende end finden und dann noch alle weiteren Bedindungen überprüfen, ob diese auch zutreffen, wenn die Exit-Bedingung zutreffen würde.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function Test(Value: Integer): Integer; begin Result := 0; if Value = 1 then Exit; Result := Test( abs(Value) - 1 ); if Value = 2 then Result := -1; end; ----------- function Test(Value: Integer): Integer; begin Result := 0; if Value <> 1 then begin Result := Test( abs(Value) - 1 ); end; if Value = 2 then Result := -1; end; |
(Man stelle sich nun das 2. if 3 Seiten weiter unten vor.)
_________________ Ist Zeit wirklich Geld?
|
|
Linedance
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 03.04.03 15:27
@cerebrum
Es ist richtig, dass die Funktion nicht automatisch verlassen wird, wenn ihr ein Ergebnis zugewiesen wird. Daher ist es günstig, die Funktion so zu gestalten, dass diese Zuweisung möglichst weit hinten liegt. Man kann bei Bedarf Folgeanweisungen auch mit Hilfe einer Verzweigung, die die Änderung des Fünktionswertes prüft, umgehen
@Luckie Das ist wohl weniger eine Meinungs- als eine Stilfrage.
Exit und Halt wurden mal als Notausgänge geschaffen, wenn wirklich gar keine andere Möglichkeit des Verlassens einer Routine möglich war. Daher nennt man das Ganze auch Notausgangs-Programmierung. Wer verlässt schließlich schon dauernd die Wohnung durchs Fenster? *zw*
@andyb
Wenn Du Deinen Code in der Verzweigung etwas änderst, brauchst Du kein Exit und das Ganze bleibt trotzdem sehr übersichtlich.
Quelltext 1: 2: 3: 4: 5: 6:
| function Test(Value: Integer): Integer; begin Result := 0; if Value <> 1 then begin ........ end; |
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 03.04.03 15:57
Zitat: | @Luckie Das ist wohl weniger eine Meinungs- als eine Stilfrage. |
Und Stil ist eine Meinungsfrage!
Zitat: | Exit und Halt wurden mal als Notausgänge geschaffen, wenn wirklich gar keine andere Möglichkeit des Verlassens einer Routine möglich war. Daher nennt man das Ganze auch Notausgangs-Programmierung. |
Stimmt. Bis vor ein paar Monaten war ich auch ein sehr strenger Verfechter eines Programmierstils, der ohne das auskommt. Aber inzwischen habe ich erkannt, dass diese "Richtlinien" sehr unpraktisch und auch ein wenig veraltet sind. Man sollte Richtlinien nicht auf einzelne Befehle beziehen, sondern darauf, dass eine klare Programmstruktur erhalten bleibt, bei welcher der Programmfluss sofort erkennbar ist.
Genau das gleiche bei Label und Goto. Bis es in diesem Forum einen Thread dazu gab, habe ich diese beiden kategorisch abgelehnt, aber inzwischen bin ich der Meinung, dass ein fortgeschrittener Programmierer sie durchaus einsetzen sollte. Ich glaube MathiasSimmack hat bei mir dem Meinungswechsel verursacht. Oder war es Luckie?
Ein fortgeschrittener Programmierer deshalb, weil Anfänger erst einen klaren Programmierstil lernen sollten, damit sie mit Label und Goto nicht der Spaghetti-Programmierung verfallen.
Zurück zu Exit: man sollte wissen, wie es ohne geht, aber wenn eine klare Struktur gewahrt bleibt, spricht meiner Meinung nach nichts dagegen.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Do 03.04.03 17:33
Linedance hat folgendes geschrieben: | @andyb
Wenn Du Deinen Code in der Verzweigung etwas änderst, brauchst Du kein Exit und das Ganze bleibt trotzdem sehr übersichtlich. |
Ja bei dem Beispielcode schon. Ich wollte nur keinen seitenfüllenden Code posten, bei dem Exit das ganze einfacher und strukturierter (wie Peter Lustig schon schrieb) macht.
Du musst jetzt nicht denken, dass ich laufend auf Exit setze. Ich verwende es nur, wenn die Situation es erfordert (mehrere verschaltelte Schleifen) oder es einfach der Lesbarkeit dient.
_________________ Ist Zeit wirklich Geld?
|
|
Wolff68
      
Beiträge: 302
Erhaltene Danke: 1
WinXP home
D6 Prof
|
Verfasst: Do 03.04.03 23:21
Also Stil hin oder her.
Auch ich verwende in AndiB's Beispiel lieber ein Exit als das ganze tief zu verschachteln.
Gerade bei 'Abbruchbedingungen', wenn also die Funktion gar nicht ausgeführt werden soll, finde ich ein 'Abbruch' mit Exit sinnvoller, als die ganze Funktion in einer If-Schleife zu verpacken. (Oder verstecken?)
Selbst sowas: Quelltext 1: 2: 3: 4:
| For i := 0 to Length(Text)-1 do begin IF Text[i] = 'a' then break; end; Label.Caption := 'Pos='+IntToStr(i); |
finde ich irgendwie übersichtlicher und lesbarer als ein Quelltext 1: 2: 3:
| i := 0; while (i < Length(Text)) AND (Text(i) <> 'a') do Inc(i); Label.Caption := 'Pos='+IntToStr(i); |
Ich weis. Kann man drüber streiten. Aber wozu denn? Hat eben jeder seine Vorlieben. (Blödes Beispiel isses auch... ich weis)
_________________ "Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
|
|
Linedance
Hält's aus hier
Beiträge: 6
|
Verfasst: Fr 04.04.03 07:13
hört sich ja interessant an *gg*;ich mag mich jetzt nicht auf eine Grundsatzdiskussion einlassen - das bringt hier niemandem was. Aber denke daran, dass hier mancher Lernende nach Rat sucht und mit dieser Lösung dann schlecht abschneidet.
So nebenbei - was ist eine if-Schleife? War if nicht was anderes?
Gruß M.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 04.04.03 08:20
Peter Lustig hat folgendes geschrieben: | Genau das gleiche bei Label und Goto. Bis es in diesem Forum einen Thread dazu gab, habe ich diese beiden kategorisch abgelehnt, aber inzwischen bin ich der Meinung, dass ein fortgeschrittener Programmierer sie durchaus einsetzen sollte. Ich glaube MathiasSimmack hat bei mir dem Meinungswechsel verursacht. |
*räusper*
Wirklich? Aber das war ein spezieller Fall, Peter. Wir erinnern uns: auf Grund von 6 oder 7 möglichen Abbruchbedingungen hätte ich jedes Mal schreiben müssen:
Quelltext 1: 2: 3: 4: 5: 6:
| if(Bedingung) then begin // mach noch schnell das zu // schließe dieses Handle noch
exit; end; |
Da diese Arbeiten aber auch grundsätzlich beim erfolgreichen Durchführen der gesamten Prozedur ausgeführt werden, habe ich also mit goto die irrelevanten Anweisungen einfach übersprungen.
Zugegeben, das mag kein schöner Programmstil sein. Aber ich bin innerhalb der selben Prozedur geblieben, ich bin nur vorwärts (in Richtung Prozedurende) gesprungen, und ich habe dadurch sehr viel Code einsparen können. Also war das -in diesem Fall!- doch effizient.

|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 04.04.03 10:57
Zitat: | Wirklich? Aber das war ein spezieller Fall, Peter. |
Ich sage ja auch nicht, dass ich es jetzt dauern benutze. Ich sage nur, dass ich erkannt habe, dass diese kategorische Ablehnung Quatsch ist.
Zitat: | {...}, ich bin nur vorwärts (in Richtung Prozedurende) gesprungen,{...} |
Ja, das meine ich mit "klare Struktur" und "Programmablauf erkennbar".
Zitat: | Also war das -in diesem Fall!- doch effizient. |
Ich habe Dir doch auch gar nicht widersprochen. Nicht mehr zumindest.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
MaxiTB
      
Beiträge: 679
Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
|
Verfasst: Fr 04.04.03 11:08
Titel: Exit ...
Da ich ja von der C++ Schiene komme kann ich nur eines sagen:
Die Befehle return, break, continue (eqo exit, break, continue) sind dort keine 'Notausstiegsbefehle' sondern zur Steuerung des Programmablaufes gedacht.
Yo - klar, man kanns mit den Befehlen bunt treiben, aber sie zu verteufeln ? Ehrlich; meine Meinung ist, wer sowas tut, hat entweder irgendwann von jemanden ein Brett vor den Kopf genagelt bekommen oder kann nicht wirklich programmieren.
Es ist nämlich sogar mit goto eine strukturierte, objektorientierte Programmierung möglich (ich rede hier von Ergänzung, nicht ausschließlich  ), allerdings gehört die nötige Disziplin und Übersicht dazu ... Übersicht eben, um zu garantieren, daß man bei seinem eigenen Code auch noch die Verständlichkeit durch einen anderen wahrt (nicht zu vergessen: Ein guter Programmierer kennt sich nach ein paar Monaten ja selber nicht mehr  und seinen alten Code; so gesehen ist auch für einem selbst hilfreich).
Der ganze Wahn mit der Strukturierung ist ja damals von den Unis ausgegangen ... böse Zungen behaupteten, nachdem die Professoren den Überblick des Codes ihrer Schützlinge verloren haben.  Naja - was anfangs gut und praktisch gedacht wurde, wurde schnell zur Religion erkohren.
Zwei Beispiele - erster meiner Meinung besser als zweiter:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function DoItOut(aValue: string): string; begin
Result:=''; // Setzen des Endvalues auf einen bestimmten Wert - Sicherheit.
if aValue='' then exit; if LowerCase(aValue)='exit' then exit; if Length(aValue)>10 then goto TrimOnly;
aValue:=UpperCase(aValue);
TrimOnly: Result:=Trim(aValue);
end; |
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function DoItOut(aValue: string): string; begin Result:=''; // Setzen des Endvalues auf einen bestimmten Wert - Sicherheit.
if aValue<>'' then begin if LowerCase(aValue)='exit' then begin if Length(aValue)<11 then begin aValue:=UpperCase(aValue); end; Result:=Trim(aValue); end; end;
end; |
Ähm - naja - beides identisch wie man schnell bei dem übersichtlichen Beispiel sieht ... aber was ist im praktischen Fall, wo manchmal fast eine handvoll Initialisierungsbedingungen daherkommen ?
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 04.04.03 12:55
Zitat: | meine Meinung ist, wer sowas tut, hat entweder irgendwann von jemanden ein Brett vor den Kopf genagelt bekommen oder kann nicht wirklich programmieren. |
Nein, er hat ganz einfach nur eine andere Meinung als Du. Mit solchen Aussagen solltest Du Dich zurückhalten!
Zitat: | Es ist nämlich sogar mit goto eine strukturierte, objektorientierte Programmierung möglich (ich rede hier von Ergänzung, nicht ausschließlich ), allerdings gehört die nötige Disziplin und Übersicht dazu ... |
Ja, dem stimme ich zu.
Zitat: | Der ganze Wahn mit der Strukturierung ist ja damals von den Unis ausgegangen |
Strukturierung als Wahn finde ich gar nicht schlecht. Ich kann an Strukturierung nichts schlechtes finden. Aber auch mit gotos kann man strukturiert programmieren.
Zitat: | Ein guter Programmierer kennt sich nach ein paar Monaten ja selber nicht mehr und seinen alten Code; |
Nach dem Kriterium muss ich ja ein ganz vorzüglicher Programmierer sein.
Zu Deinem Beispiel: hier finde ich das mit dem goto überflüssig. So würde ich es machen. Finde ich übersichtlicher:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function DoItOut(aValue: string): string; begin
Result:=''; // Setzen des Endvalues auf einen bestimmten Wert - Sicherheit.
if aValue='' then exit; if LowerCase(aValue)='exit' then exit;
if Length(aValue)<=10 then aValue:=UpperCase(aValue);
Result:=Trim(aValue);
end; |
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Wolff68
      
Beiträge: 302
Erhaltene Danke: 1
WinXP home
D6 Prof
|
Verfasst: Fr 04.04.03 12:58
Linedance hat folgendes geschrieben: | Aber denke daran, dass hier mancher Lernende nach Rat sucht und mit dieser Lösung dann schlecht abschneidet. |
Warum sollte er mit der Lösung schlecht abschneiden? So weit ich weis funktioniert sie.
Linedance hat folgendes geschrieben: | So nebenbei - was ist eine if-Schleife? War if nicht was anderes? |
Stimmt. IF ist natürlich KEINE Schleife. IF-Block wäre wohl der bessere Ausdruck gewesen.
_________________ "Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
|
|
MaxiTB
      
Beiträge: 679
Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
|
Verfasst: Fr 04.04.03 13:03
Peter Lustig hat folgendes geschrieben: | Nein, er hat ganz einfach nur eine andere Meinung als Du. Mit solchen Aussagen solltest Du Dich zurückhalten! |
Sorry - war keine direkte Anspielung an eine Person sondern allgemein gemeint. Es gibt nämlich wirklich Fanatiker, die glauben, nur wenn man sich an alle noch so sinnlosen Designregeln STUR hält, dann ists der schönste Code.
Zitat: | Strukturierung als Wahn finde ich gar nicht schlecht. Ich kann an Strukturierung nichts schlechtes finden. Aber auch mit gotos kann man strukturiert programmieren. |
Auch hier hab ich nicht die Strukturierung an sich gemeint (bin ja vom Spagetticode zur OOP aufgewachsen *g*) sondern ebenfalls einige Fälle, wie z.B. Stichwort: 'Why go to is evil ...' Wir reden hier von einer Doktorarbeit.
Zitat: | Nach dem Kriterium muss ich ja ein ganz vorzüglicher Programmierer sein. |
Habe aber auch schon gehört: 'Gute Programmierer sind faule Programmierer'. Naja - ich bin sehr faul ...
Zitat: | Zu Deinem Beispiel: hier finde ich das mit dem goto überflüssig. So würde ich es machen. |
Ich weiß - es war ein schlechtes Beispiel, weil zu kurz ... ich habe ja extra noch das LowerCase reingepackt um zwei Aufrufe zu haben. Aber sagen wir mal, die Methode ist zirka 40 Zeilen fett (mehr sollte sie dann eh schon nicht haben - weil das wäre erst recht schlechter Stil und kein OOP).
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 04.04.03 13:19
Zitat: | wie z.B. Stichwort: 'Why go to is evil ...' |
Drei Befehle bilden einen Quelltext des Bösen: break, exit und goto
Zitat: | Aber sagen wir mal, die Methode ist zirka 40 Zeilen fett |
Ich weiß, ich kenne diese Methoden. Gute Beispiele sind zu lang, um sie hier zu posten.
Zitat: | mehr sollte sie dann eh schon nicht haben - weil das wäre erst recht schlechter Stil und kein OOP |
Auch das kommt immer auf den Inhalt an. Kein "Why large Codes are evil ...", bitte!
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|