Frage deutsch
~~~~~~~~~~~~~~
Welche Nachteile hat der GOTO-Befehl?
Question English
~~~~~~~~~~~~~~
Why should I avoid the GOTO statement?
Antwort 1
~~~~~~~~~~
[ von Thomas Antoni, 19.5.2002 - 19.1.2006 ]
.
Wer GOTO verwendet, legt den Keim zur "Spagetti-Programmierung" und zu
schlecht strukturierten Programmen, bei denen der Durchblick und die Fehlersuche
schwer fällt. Bei nachträglichen Änderungen weiß man nie genau, von welchen
Stellen überall zu der gerade editierten Stelle hingesprungen wird, und schwer
zu findende Folgefehler sind eher die Regel als die Ausnahme.
Wenn man sich bemüht, das GOTO weitestgehend zu vermeiden, entstehen
automatisch wohlstrukturierte und gut wartbare Programme, und auch Du selbst
blickst wesentlich besser durch Dein Programm durch, wenn Du es nach längerer
Zeit mal erweitern oder Fehler darin beseitigen willst. Sihe auch unter ->
Strukturierte
Programmierung im Lexikon.
Häufig werden GOTOs zum vorzeitigen Verlassen von SUBs und Kontrollstrukturen
verwendet. Hierfür bietet QBasic jedoch zum Glück die folgenden speziellen
Befehle, die in meinem QB-Kochbuch im Detail beschrieben sind (Download des
Kochbuchs auf http://www.qbasic.de in der
Tutorial-Rubrik):
• EXIT SUB
• EXIT FUNCTION
• EXIT IF
• EXIT FOR
• EXIT DO
Es gibt immer einen Weg, ein GOTO zu vermeiden, auch wenn Du es nicht
glaubst. Wer mir das Gegenteil beweist erhält von mir eine Kiste Sekt :) Die
einzigen Ausnahmen, die ich für die Verwendung des GOTO-Befehls gelten lassen
würde sind:
• Das vorzeitige Verlassen einer CASE
SELECT Struktur (leider gibt es nur bei PowerBasic ein EXIT
SELECT)
• Anspringen einer Interruptbearbeitung
mit ON .. GOTO
Ich hasse den GOTO-Befehl! Ich finde ihn ekelhaft! Allein schon, dass man nie
wissen kann, von wo überall per GOTO zu einer Sprungmarke hingesprungen wird und
welche Seiteneffekte eine Programmänderung der Befehle nach der Sprungmarke
haben kann, macht ihn mir widerwärtig. Ich habe direkt eine fast krankhafte
Phobie vor dem GOTO-Befehl.
Viel besser sind doch strukturierte Programmblöcke, die genau einen Eingang
und einen Ausgang haben.
Es gibt dazu übrigens einen berühmten Artikel mit dem Titel "Goto Statement
Considered Harmful" von Edsger W. Dijkstra, dem Guru der "Strukturierten
Programmierung", Diesen Artikel kann man nachlesen unter www.acm.org/classics/oct95/ .
*** Hinweis von RockTheShock zu ON ... GOTO
Thomas: Du schreibst "bei den Interrupt-gesteuerten Dingen, wie ON
ERROR/KEY/TIMER GOTO"
Meines Wissens ist die ON ... Anweisung aber nicht interruptgesteuert. es
wird stattdessen hinter jeder Anweisung eine IF-Anweisung vom Compiler
eingefügt.
Das müsste der Grund sein, warum Programme, die mit ON ERROR arbeiten, sich
immer stärker aufblähen.
Diese Information fand ich in ETHAN WINER'S "PC Magazine's BASIC Techniques
and Utilities Book" welches Du in der Tutorial-Rubrik von www.qbasic.de
zum Download anbietet. Das kann man also dort nachlesen und auch wie man das
herausfindet auch. Ich denke, dies es ist das beste QB-Buch für Fortgeschrittene
das es gibt.
Antwort 2
~~~~~~~~~
Man soll den GOTO-Befehl nicht verwenden, weil der dadurch entstehende Code
bei mehreren dutzend oder gar hundert GOTOs ganz schnell unübersichtlich wird.
Durch den übermääßigen Gebrauch des GOTO-Befehls entsteht und ein völlig
unstrukturierter "Spagetticode" , den niemend mehr verstehen und warten kann -
auch nicht der Autor selbst nach einiger Zeit.
. Und die logische Strukturierung ist beim Programmieren das Wichtigste. Der
Compiler erzeugt am Ende noch genug verworrenen Code (IF...THEN...ELSE...END
IF!)! Da muss man als Programmierer auf keinen Fall seinen Senf dazugeben.
Außerdem wird durch das viele Springen das Programm viel langsamer (vorallem,
wenn es interpretiert wird!). Und die Zeiten, als es in BASIC noch Zeilennummern
bedurfte und es keine SUBs gab, sind zum Glück längst vorbei! GOTO lässt sich
immer, außer bei den Interrupt-gesteuerten Dingen, wie ON ERROR/KEY/TIMER GOTO,
vermeiden.
Antwort 3
~~~~~~~~~
[ von Helium ( m.beckah*gmx.de ) im QB-Forum,
8.6.2002 ]
.
GOTO oder nicht GOTO?
*** Wann sollte ich GOTO verwenden?
Wenn ich verschachtelte Schleifen verlassen will. Das in QB vorhandene EXIT
verlässt nähmlich nur die Aktuelle Schleife. Wenn ich nun aber
aus einer übergeordneten Schleife springen möchte, muss ich GOTO
verwenden.
*** Wann sollte ich GOTO nicht verwenden?
In allen anderen Fällen. Jedes andere GOTO lässt sich entweder durch eine
Schleife (DO...LOOP, ...) oder eine Funktion, bzw. Sub ersetzen.
Man sollte sein Programm aber von vornherein so konstruieren, dass keine
GOTOs verwendet werden, da man sonst probleme mit der Lokalität
von Variablen hat.
Answer 4
~~~~~~~~~
[ Tip by Buff ]
.
Keep GOTO statements to a minimum. Some say never use them. My personal
opinion is if they are only used within a small routine and kept to a minimum it
is ok. Don't use them to call one sub routine from another. It makes debugging
difficult, and almost always results in what is commonly called "spaghetti
code". This is versus "structured" programming that uses subroutines (either
gosub/return or QB subs/functions) to do tasks that are performed over and
over.
Answer 5
~~~~~~~~~
[ aus der Newsgroup news:comp.lang.basic.misc , 14.6.2002
]
.
What is so BAD about GOTO?
.
ANSWER
.
Nothing. However, people who use GOTO often have some screws
loose and use it to make the most hideous looking spaghetti code.
therefore, it is common practise to frown upon the use of GOTO.
GOTO is an acceptable construct of the BASIC language, and when used
properly, it poses no problems. It does not magically make code
unreadable, unmaintainable, or unprofessional contrary to popular
belief.
[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]