Kann "goto" wieder "in" werden?



  • Ich frage mich, ob alle die heute so gegen goto wettern, je den Code gesehen haben, der zu dem 'Anti-goto-Hype' geführt hat[1].
    So wie einige heute gotos verwenden ist das absolut harmlos und führt zu einfachen und lesbaren Programmen.

    [1]: Ich kenne diese Codes nicht. Aber ich kenne procmail ...



  • Original erstellt von Daniel E.:
    **Ich frage mich, ob alle die heute so gegen goto wettern, je den Code gesehen haben, der zu dem 'Anti-goto-Hype' geführt hat[1].
    So wie einige heute gotos verwenden ist das absolut harmlos und führt zu einfachen und lesbaren Programmen.

    [1]: Ich kenne diese Codes nicht. Aber ich kenne procmail ...**

    Für einige \isin erfahrene_programmierer spricht IMHO auch nichts dagegen.



  • Original erstellt von Daniel E.:
    Ich frage mich, ob alle die heute so gegen goto wettern, je den Code gesehen haben, der zu dem 'Anti-goto-Hype' geführt hat[1].

    Gutes Argument... vielleicht sollte man nicht so oft Berichte über Softwareprobleme der 80er lesen, wenn man schon fast 2003 schreibt... 😉



  • GOTO bzw. das Assembler Äquivalent JMP ist in Ordnung, benutze ich oft. 😃 😃



  • Original erstellt von malfunction:
    GOTO bzw. das Assembler Äquivalent JMP ist in Ordnung, benutze ich oft. 😃 😃

    Zitat aus einem C++ Buch :

    Q : "Where should I use goto ?"
    A : "In your worst enemy's code !"



  • Also bei den Trollen? 🙄



  • @malfunction:

    GOTO bzw. das Assembler Äquivalent JMP ist in Ordnung, benutze ich oft.

    In ASM ist das ja normal, aber in C++? gelegentlich ok, aber häufig? Ich glaube du machst da was falsch. Hast du mal Basic programmiert?



  • gelegentlich ok

    😕 😕

    ganz ganz ganz selten ok



  • ich hab auch nichts gegen goto, versuche aber es nur zu benutzen wenn es nicht anders geht (z.b. zeikritische routinen).
    hab die erfahrung gemacht, das die meisten leute die gegen goto wettern nicht erklären können warum sie dagegen sind. die haben es dann meistens nur gehört oder gelesen und verbreiten es weiter um mit "fachwissen" zu glänzen (ähnlich wie das verpönte root-arbeiten unter linux). 😉



  • Original erstellt von tenim:
    ich hab auch nichts gegen goto, versuche aber es nur zu benutzen wenn es nicht anders geht (z.b. zeikritische routinen).
    hab die erfahrung gemacht, das die meisten leute die gegen goto wettern nicht erklären können warum sie dagegen sind. die haben es dann meistens nur gehört oder gelesen und verbreiten es weiter um mit "fachwissen" zu glänzen (ähnlich wie das verpönte root-arbeiten unter linux). 😉

    spagetie code, was soll man da noch viel argumentieren?



  • Original erstellt von Dimah:
    spagetie code, was soll man da noch viel argumentieren?

    Du weißt aber hoffentlich, daß dieser Spaghetti-Code in einer Zeit entstanden ist, als man kaum Möglichkeiten hatte Funktionen mit lokalen Variablen zu erstellen?

    Wenn heute jemand in einer 20 Zeilen langen Funktion mitten in einer Schleife mit return (also einem "goto lastline") rausspringt, so sehe ich da keinen Spaghetti-Code...

    Btw, eine Exception in C++ ist auch nur eine Art goto... übrigens kann man Exception-Handling auf Funktionsebene (für Fehlerhandling) sehr schön durch goto ersetzen.



  • spaghetticode ist nur eine mögliche auswirkung und auch nur wenn man goto exessiv benutzt. ich gehe von einmaliger nutzung im notfall aus. 😉



  • int i = 1;
    for (;i < 1000000, array[i] != 'A' ; ++i) ;
    

    wann wird sich endlich rumgesprochen haben, wie der 'op,' funktioniert?
    hier ist ein && gemeint, sonst wirds wohl irgendwann ne schutzverletzung geben.

    edit: zum thema: ich hatte noch nie wirklich das beduerfnis, ein goto zu verwenden. koennts mir hoechstens vorstellen, wenn man aus einer inneren schleife raushuepfen will. aber meist tut man eh die suche oder was immer diese beiden schleifen tun in eine extra funktion, und dann tuts auch ein return.

    [ Dieser Beitrag wurde am 02.12.2002 um 14:20 Uhr von PeterTheMaster editiert. ]



  • Im Assembler-Code und später Maschinencode werden doch sowieso gotos verwendet, ausserdem lässt sich leicht beweisen, dass man mit gotos dasselbe machen kann wie mit while oder loop-Schleifen.
    Es sieht ohne zwar besser aus, kann aber manchmal ohne auch etwas lästig sein !



  • @Snakey:

    Man vermeidet goto nicht, wie du zu glauben scheinst, weil es zuwenig kann, sondern weil es zuviel kann.



  • Original erstellt von PeterTheMaster:
    aber meist tut man eh die suche oder was immer diese beiden schleifen tun in eine extra funktion, und dann tuts auch ein return.

    Sicherlich, aber genau das ist (für C- und C++-Entwickler) der interessante Punkt:

    Wer sowas schreibt:

    void func()
    {
       for (...)
       {
          if (something)
             return;
          ...
       }
    }
    

    verwendet ein goto. Daran beißt die Maus keinen Faden ab:

    void func()
    {
       for (...)
       {
          if (something)
             goto endmark;
          ...
       }
    endmark:
    }
    

    Ist ja auch ok - das bringt oftmals Performance und ist typischer und akzeptierter C-Stil.

    Lustig wird's nur dann, wenn jemand return in Schleifen (oder break) verwendet, aber gleichzeitig zum Kreuzzug gegen goto ausreitet. 😉



  • das ist aber das Problem, dass sich die Sprungmarke auch überschneiden könnte, was beim compilieren zu merkwürdigen Fehlermeldungen führen kann 😞



  • Das Problem beim goto ist aber nicht die Anwendung die einem break, return oder continue entspricht, welche sich darauf beschränkt, ein paar Zeilen im strukturierten Code zu überspringen (also zur weiter runter im Aufrufstack zu gehn), sondern dass ich mit goto irgendwohin an ne ganz andere Stelle im Code in ner ganz anderen Funktion springen kann. Hier wird der Programmfluss, wie er lt. strukturiertem Programmierparadigma sein sollte, völlig unterlaufen. Noch nicht mal mit nem throw kann ich komplett woanders hinspringen.

    Klar, wenn ich vorsichtig damit bin, kann ich goto in diesen Fällen einsetzen. Aber ein return garantiert mir halt, dass ich ans Ende der Funktion springe und von da aus in die aufrufende Funktion zurückkehre, wo sicher aller lokalen Variablen initialisiert sind, und nicht versehentlich sonstwohin.

    Man kann auch mit ner strukturieren Programmiersprache objektorientiert programmieren. Aber warum sollte man nicht gleich die Sprachmittel einer objektorientierten Sprache nehmen? Dasselbe ist mit goto. Klar kann man ganz ohne Funktionen funktional programmieren und mit gotos rumstpringen. Aber warum?
    Außer wenns um wirklich hochoptimierten Code geht, wird man ein goto in einem C/C++-Programm immer und ohne Verrenkungen durch was anderes ersetzen können. Wenn nicht, siehts mir schwer nach nem Design-Fehler aus. Aber natürlich lässt sich jede Regel durch eine Ausnahme bestätigen.



  • while if for etc. sind doch sowieso nur spezialisierungen von gotos. wenn man solche spezialisierungen schon hat dann sollte man sie auch benutzen.. aber sobald man dadurch einen murks erzeugen muss sollte man die benutzung von sochen höheren konstrukten nicht erzwingen...



  • Original erstellt von kartoffelsack:
    sondern dass ich mit goto irgendwohin an ne ganz andere Stelle im Code in ner ganz anderen Funktion springen kann.

    In BASIC vielleicht...

    Das ist doch der Gag, das Goto von dem im Zusammenhang mit dem berüchtigten Spaghetti-Code die Rede ist (Sprünge an beliebige Programmzeilen innerhalb des gesamten Codekomplexes) hat mit dem Schlüsselwort goto der Sprachen C und C++ nur geringe Gemeinsamkeiten. Deswegen ist die Anführung von Argumenten gegen das BASIC-Goto im Zusammenhang mit dem C-goto nur mäßig sinnvoll.


Anmelden zum Antworten