Goto und Verwandte



  • Not for publication

    Important: this text is in draft form and is reserved for the use of
    students in the ETH Zurich “Introduction to Programming” course
    (37-001),Winter semester 2003, as well as for members of the “Touch
    of Class” mailing list. Do not copy it other than for personal use, or
    distribute it without the author’s permission.



  • Die Rangfolge des Bösen, um den Ablauf in einer Schleife zu verändern:

    1. Schleifenindex verfummeln
    2. goto
    3. künstliche Abbruchvariable
    4. if um den ganzen Körper
    5. break
    6. continue
    7. return

    break ist erstaunlich selten nötig und return kann oft sinnvoll genommen werden. Aber wenn man das noch nicht drauf hat, sind die Tricks, die man anstellt, um break zu vermeiden, wenn break verboten ist, einfach schrecklich. Schritte in Richtung des Bösen.



  • @Zeus: Das ist als ob man einen offenen Koffer voller Geldscheine in eine dunkle Gasse stellt, daneben ein Papierschild anbringt "nichts entnehmen" und sich am nächsten Tag wundert, dass der Koffer leer ist.

    MfG SideWinder



  • Wurstinator schrieb:

    außer, wenn man dadurch vergisst Arbeitsspeicher freizugeben oder ähnliches.

    Das ist der Punkt. Faßt man seine Objekte mit using an oder denkt an finally-Blöcke oder schreibt C++, dann darf man frei returnen. Die meisten alten Sprachen haben sowas nicht. Da sollte man diesbezüglich sehr ängstlich sein und man war es ja auch vor 30 Jahren.



  • SideWinder schrieb:

    @Zeus: Das ist als ob man einen offenen Koffer voller Geldscheine in eine dunkle Gasse stellt, daneben ein Papierschild anbringt "nichts entnehmen" und sich am nächsten Tag wundert, dass der Koffer leer ist.

    MfG SideWinder

    Endlich bin ich reich.



  • @ Bashar: Wie du sagtest, meint er, Blöcke haben nur einen Eingang und Ausgang. Laut ihm wird der Code unübersichtlich, wenn man so "herumspringt".

    @ icarus2: Joa, ist ja das, was Bashar auch gesagt hat.

    @ volkard: Vielleicht bin ich ja einfach ein schlechter Programmierer, aber in Ruby hab ich break schon ab und zu benutzt. Öfter als continue :p
    Was meinst du mit "fasst man seine Objekte mit using an"? Und finally ist doch für Exceptions, wenn ich mich recht erinnere?



  • @ icarus2: Joa, ist ja das, was Bashar auch gesagt hat.
    [/quote]
    Das meiste schon. Aber du hast offenbar das "Loop postcondition principle" überlesen oder nicht verstanden was damit gemeint ist. Ich finde das ein gutes Argument.

    *Edit

    Wurstinator schrieb:

    Und finally ist doch für Exceptions, wenn ich mich recht erinnere?

    Finally ist einfach ein Codestück, das immer ausgeführt wird nach Verlassen des umschliessenden Blocks (des scopes oder wie man das auch immer formulieren will). Finally wird also immer ausgeführt, egal wie der Block verlassen wird. Ist nützlich für Aufräumarbeiten und um Garantien geben zu können, dass etwas ausgeführt wird, bevor ein Block (z.B. eine Funktion) verlassen wird. In C++ gibt es bekanntlich kein finally. Da löst man es über RAII.



  • Wurstinator schrieb:

    @ Bashar: Wie du sagtest, meint er, Blöcke haben nur einen Eingang und Ausgang. Laut ihm wird der Code unübersichtlich, wenn man so "herumspringt".

    Ja, das ist die alte Schule. Wo es die ganzen tollen Features die wir heute haben noch nicht gab. Damals hat das Sinn gemacht. Single Entry/Single Exit.

    Heute ist das halt komplett ueberholt.

    Vielleicht bin ich ja einfach ein schlechter Programmierer, aber in Ruby hab ich break schon ab und zu benutzt. Öfter als continue :p

    Ich wuerde darauf tippen das deine Funktionen generell laenger als 10 Zeilen sind. Stimmt das?



  • Naja, vor allem in C ist goto für CleanUp Code doch durchaus schön anwendbar.
    Verstehe den Rummel darum nicht, wenn mans nicht missbraucht ist es ein akzeptables Sprachfeature.



  • @Ethon:
    Genau. In C finde ich es schon fast plem strikt auf goto zu verzichten.

    In den letzten Jahren hab ich in C++ aber kein goto mehr geschrieben. Bin nichtmal wirklich in Versuchung gekommen. OK, vielleicht ein paar wenige Stellen wo ich aus ner verschachtelten Schleife raus wollte, aber die liessen sich alle leicht auf return umstellen, ohne dadurch unübersichtlicher zu werden.



  • Ist wohl mal wieder eine sehr emotional geprägte Fragestellung! 😃 Die ersten BASIC-Interpreter kannten als Kontrollstruktur nur goto. In FORTRAN war continue absolutes Muss. Die WinApi-Programmierung mit C erfordert den Einsatz von break bei switch.
    Sei beruhigt trotz anderer Meinungen. Selbst das zurecht verpönte goto kann noch seine Berechtigung haben. Ich selbst steige aus komplizierten Iterationen auch schon einmal mit goto ans Funktionsende aus, weil es übersichtlich ist. Funktionen sind bei mir meist klar definierte Blöcke mit Eingabe-Verarbeitung-Ausgabe (EVA).



  • berniebutt schrieb:

    Die WinApi-Programmierung mit C erfordert den Einsatz von break bei switch.

    Man muss auf Windows break und switch verwenden? Wie will das OS das denn überprüfen?



  • @ icarus2: Okay, ich habs beim ersten Lesen mehr überflogen. Jetzt hab ichs verstanden 🙂

    @ Shade of Mine: Nicht generell. Aber ich stelle mich absichtlich gegen Regeln, die besagen, dass Funktionen nur so und so lang sein dürfen. Für mich hört eine Funktion dann auf, wenn es Sinn macht 🙂

    Danke für all die Antworten 🙂



  • berniebutt schrieb:

    Funktionen sind bei mir meist klar definierte Blöcke mit Eingabe-Verarbeitung-Ausgabe (EVA).

    Haha. Auch ein Paradigma, das vor 20 Jahren schon 20 Jahre alt war.
    Eine Stilsünde zieht die andere nach sich.



  • volkard schrieb:

    berniebutt schrieb:

    Funktionen sind bei mir meist klar definierte Blöcke mit Eingabe-Verarbeitung-Ausgabe (EVA).

    Haha. Auch ein Paradigma, das vor 20 Jahren schon 20 Jahre alt war.
    Eine Stilsünde zieht die andere nach sich.

    Gibts Funktionen ohne EVA? Was machen die? Wobei ich A jetzt als return oder Hardwareausgabe sehe.



  • AdamsFrau schrieb:

    Gibts Funktionen ohne EVA? Was machen die? Wobei ich A jetzt als return oder Hardwareausgabe sehe.

    Das ist wie die Flucht-Interpretation, daß Gott überall sei, weil die Astronauten ihn im Himmel nicht gesehen haben.
    Nee, EVA war auf Code-Ebene gemeint und trueb schreckliche Blüten:

    int main(){
    //zuerst alle benutzereingaben lesen, alle! kein interaktiver dialogbetrieb. 
    //keine bedarfsgerechten nachfragen. 
    
    //dann die daten verarbeiten
    
    //dann ausgeben
    }
    
    bool f(char* filename,int size,somnizer** smz){
    //zuerst die eingabe, also datei auslesen und in ein array stopfigen!, 
    //und den somnizer auslesen
    
    //dann erst die verarbeitung, also vorwiegend nur die daten fluxieren, 
    //gegebenenfalls auf die konfigurationsdaten des auf verdacht ausgelesenenen 
    //somnizers zugreifen
    
    //dann die ausgabe, eventuell aufgetauchte fehler berichten und den 
    //somnizer rekalibrieren
    }
    


  • wo kann man somnizer kaufen?



  • AdamsFrau schrieb:

    wo kann man somnizer kaufen?

    Es werden schon lange keine mehr hergestellt.



  • volkard schrieb:

    AdamsFrau schrieb:

    wo kann man somnizer kaufen?

    Es werden schon lange keine mehr hergestellt.

    Schade! Ich habe auf dem Dachboden ein mir unbekanntes Gerät mit serieller Schnittstelle gefunden, das ein solcher somnizer sein könnte. Mangels Manual habe ich diesen vermeintlichen somnizer mit 'goto muell' entsorgt.

    Eva hatte den Apfel genommen. Das war ein Stilbruch. Sie hätte besser die Schlange genommen! 🙂


Anmelden zum Antworten