-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: GOTO's sind unschoen - oder doch nicht?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.11.2005
    Ort
    QTH: JO43BC
    Alter
    49
    Beiträge
    112

    GOTO's sind unschoen - oder doch nicht?

    Anzeige

    Bis vor kurzem war ich der festen Ueberzeugung das GOTO's in Bascom unschoen sind. Igitt, bah - so was benutzt man nicht! Und so was braucht man auch nicht!

    In einem komplexeren Programm, welches ich gerade fuer ein kommerzielles Projekt schreibe, treffe ich auf eine Stelle wo diverse Ja/Nein Entscheidungen getroffen werden muessen. Und dementsprechend muss auch gesprungen werden. Kann man alles nicht so in einem Satz erklaeren, aber die GOTO's erschienen mir hier - nach laengerer Ueberlegung - wirklich als die beste Loesung. Und ich wollte nicht unbedingt Programmteile wieder in eine SUB verbannen, die dann letztendlich nur zweimal aufgerufen wird.
    Ein Teil des Programmmoduls laeuft nun. Mit GOTO's. Und das sogar bestens. Bisher habe ich diesen Befehl bewusst vermieden. Einfach weil man sonst echt Gefahr laeuft in einen Spaghettiprogrammierstil abzugleiten. Und gerade bei umfangreicheren Programmen verliert man dann schnell die Uebersicht. Ich schreibe gerade nur noch Programmmodule, die dann spaeter (hoffentlich) nahtlos zusammenarbeiten...
    Aber ich haette nicht gedacht, dass ich das GOTO irgendwann mal einsetzen wuerde. Und irgendwie fuehle ich mich nun auch echt unwohl dabei. ;)

    Mit freundlichen Gruessen
    Digitali

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Hallo

    Letztlich wird aus dem "GoTo" ein einfacher Assemblersprung über einen Programmbereich. Eine "while", "case"- oder "if..elseif"-Konstuktion verwandelt der Kompiler auch nur in bessere Sprungtabellen. Es spricht also technisch nichts gegen die Verwendung von "GoTo".

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    Spricht nichts gegen die Verwendung des GOTO Befehls. Sonst würde es ihn nicht geben. Ich selbst benutze ihn, wenn ich ihn für geeignet halte.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.01.2005
    Alter
    45
    Beiträge
    294
    Zitat Zitat von peterfido
    Spricht nichts gegen die Verwendung des GOTO Befehls. Sonst würde es ihn nicht geben. Ich selbst benutze ihn, wenn ich ihn für geeignet halte.
    100% ACK
    Das Gegenteil von "gut" ist "gut gemeint"!

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.04.2005
    Beiträge
    1.469
    Letztlich wird aus dem "GoTo" ein einfacher Assemblersprung über einen Programmbereich.
    So isses. Und bei Assembler redet auch keiner von Spaghetticode.
    Ich komme meistens zwar ohne Gotos aus, aber es gibt eben Fälle, wo das ganz nett ist.
    Heutzutage springt man ja auch nicht mehr zu Zeilennummern, sondern zu (möglichst aussagekräftigen) Labels. Von daher kann man das auch halbwegs übersichtlich halten.

    Gruß
    Christopher

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.08.2005
    Beiträge
    178
    Zitat Zitat von Klaus Schmaranz, Softwareentwicklung in C
    7.7 Das unselige goto Statement

    Die Überschrift sagt im Prinzip schon vieles uber das goto-Statement aus:
    Es ist eines der unseligsten Statements, die jemals in höhere Programmiersprachen Einzug gefunden haben. Bevor ich erläutere, warum man goto keinesfalls und unter keinen Umständen verwenden soll, mochte ich trotzdem zumindest seine Funktionsweise kurz beschreiben:

    Im Prinzip ist goto eine unbedingte Sprunganweisung an eine Stelle irgendwo im Programm. Irgendwo im Programm bedeutet, an eine Stelle, die man zuvor durch einen Label gekennzeichnet hat.

    1 // goto.c - a tiny program demonstrating the use of goto
    2
    3 main ( )
    4 {
    5 int spaghetti_counter = 0;
    6
    7 nirvana:
    8 printf ( "I'm in nirvana...\ n" );
    9 spaghetti_counter++;
    10 if ( spaghetti_counter > 5)
    11 goto walhalla;
    12 goto nirvana;
    13 walhalla:
    14 printf ( " finally in walhalla \n" ) ;
    15 }

    Ausführen des Programms liefert den folgenden Output:

    I'm in nirvana...
    I'm in nirvana...
    I'm in nirvana...
    I'm in nirvana...
    I'm in nirvana...
    I'm in nirvana...
    finally in walhalla

    In diesem Beispielprogramm werden zwei verschiedene Labels, nirvana und walhalla definiert, die als mögliches Ziel einer Sprunganweisung dienen können. Mittels goto werden diese dann angesprungen.

    Man sieht schon bei diesem winzigen Codeschnipsel, dass die Lesbarkeit des Codes eine mittlere Katastrophe darstellt. Nun stelle man sich vor, dass man es mit einem großen Programm zu tun hatte, in dem wild kreuz und quer durch das Programm gesprungen wird! Schon hier haben wir eine Schleife programmiert, die keines unserer bekannten Schleifenkonstrukte verwendet. Man muss aber zweimal hinsehen, um dies auch zu erkennen. Nun denke man daran, dass sich eine solche Schleife über mehrere Sprungstellen hintereinander im Code definiert. Kein Mensch kann dieses Konstrukt noch in vernünftiger Zeit durchschauen. Die Einfuhrung von goto in Hochsprachen fand noch zu einer Zeit statt, in der die meisten Softwareentwickler sehr viel mit Assemblersprachen zu tun hatten, bei denen unbedingte Sprunganweisungen zum täglichen Brot gehören. Intern arbeiten Computer ja nicht strukturiert, wie auch? Auch bei Anfängern in der Programmierung ist goto noch recht beliebt, da sie die Gefahr dahinter nicht erkennen. Zumeist dauert es aber dann nicht lang, bis sie ihren eigenen Code nicht mehr durchschauen, weil die Sprünge jede Struktur im Programm verschleiern.

    Nicht umsonst haben jahrzehntelang viele berühmte (und auch nicht so berühmte) Softwareentwickler kein gutes Haar an diesem Statement gelassen, weil es ein Programm absolut undurchsichtig, unwartbar, nicht erweiterbar und fehleranfällig macht. Glücklicherweise hat es sich mittlerweile schon weit herumgesprochen, dass man keine goto Anweisungen verwenden soll. Warum denn auch? Es gibt kein einziges Problem, das man nicht ohne goto auch lösen konnte. Leider findet man vereinzelt noch in verschiedenen Büchern "gute Gründe" fur dieses grauenvolle Konstrukt. Aber egal, um welchen guten Grund es sich handelt, es gibt immer noch bessere Gründe, es nicht so zu machen.

    In diesem Sinne schließe ich mich vollstandig der Meinung fast aller Softwareentwickler an: Ein goto hat in keinem Programm etwas verloren!!!!!

    Um diese Aussage noch weiter zu untermauern: In Java ist goto ein reserved-word, aber es ist bewusst nicht implementiert. Damit hat man es gleich im Prinzip von der Sprache her nicht zugelassen und jeden Versuch zu seiner Implementierung unterbunden!
    http://www.asc.tuwien.ac.at/eprog/do.../schmaranz.pdf

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.01.2005
    Alter
    45
    Beiträge
    294
    Gähn, niemand hat gesagt das goto der tollste Befehl auf Erden ist.

    Und ob man Spaghetticode schreibt hängt nicht vom goto alleine ab.

    Und gerade in C gibt es genug möglichkeiten ein Programm grauenhaft zum Lesen zu machen, auch ohne ein goto.
    Das Gegenteil von "gut" ist "gut gemeint"!

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.08.2005
    Beiträge
    178
    goto hell

    lg
    johns

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.10.2007
    Ort
    41462 Neuss
    Alter
    49
    Beiträge
    375
    @johns
    ein wirklicher experte würde nie behaupten, man solle etwas nie tun, sondern höchstens man solle es nur tun, wenn man nen guten grund dafür hat. und ein guter grund findet sich immer, wenn man nur lange genug sucht.

    stures festhalten an irgendwelchen prinzipien ohne die aktuelle situation zu berücksichtigen ist nicht nur beim programmieren meistens ne schlechte idee.

    dann ists auch noch ein unterschied, ob man goto in basic, pascal, c oder c++ verwendet.
    basic z.b. wurde mit goto geboren. warum sollte man es dann verteufeln. in c hat mans eingebaut, um gewisse dinge nicht umständlicher als nötig formulieren zu müssen. was nützt der perfekte goto-freie code, wenn er viel länger, komplizierter und unverständlicher ist als ein kleines goto an der richtigen stelle.

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    03.11.2004
    Ort
    Süderlügum
    Alter
    36
    Beiträge
    86
    Gotos werden doch prinzipiell verteufelt (auch ich gestehe, ich mag sie nicht), weil sie einer früheren Sprachengeneration angehören.
    So entsteht ein unhübsches Mischmasch.
    Ich erklär mal:
    Am Anfang war die Zeilennummerbasierte programmierung. Da waren GOTOs mehr oder minder notwendig, auch wenns ja noch so eine Art Prozedur-Vorläufer gab, die mit GOSUB angesprungen und mit RETURN wieder zurückgeführt wurden.

    Später kam (war das mit Modulo und Pascal?) die prozedurale Programmierung auf, mit diesem Konzept wurden die GOTOs überflüssig, wenn auch in den meissten Programmiersprachen noch implementiert, und genau hier haben wir die Situation warum es unhübsch ist, sie einzusetzen. Sie sind gegen das Konzept der Programmiersprache.

    Ähnlich sieht es in Java aus, welches als objektorientierte Programmiersprache quasi noch eine "Generation weiter" ist, wenn man Methoden in einer Klasse als static deklariert. Damit verweichlicht man auch das objektorientierte Prinzip und kann diese Methoden aufrufen ohne vorher ein Objekt zu erzeugen. Schon hat man wieder prozedurale Programmierung.

    Ich fasse also zusammen was ich unschön finde:
    - Prozedurale Programmierung in einer objektorientierten Sprache
    - Zeilennummerbasierte Programmierung in einer prozeduralen Sprache

    Es ist schlicht und ergreifend unschön, weil man die Generationen der Programmiersprachen durchmischt. Funktionelle Nachteile sehe ich auch keine, halt nur stilistische.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •