Als vor über 40 Jahren Batch-Dateien zu Microsofts DOS hinzugefügt wurden, war die einfache Programmiersprache BASIC vorherrschend. Die BASIC-Sprache verwendete die Goto-Anweisung und Sprungmarken, um dem Programmierer die Möglichkeit zu geben, Codezeilen zu wiederholen bzw. im Code zu springen. Also fügte Microsoft den Goto-Befehl zur Batch-Sprache bzw. in der Kommandozeile hinzu, um dieselbe Art von Funktionalität bereitzustellen. Bis heute gibt es Goto in vielen Programmier- und Skriptsprachen. Allerdings gibt es schon immer sehr viele kritische Meinungen zu Goto, weshalb es nicht zuletzt beispielsweise in der neuen PowerShell nicht mehr enthalten ist! In diesem Artikel erfährst du warum, wie du es in den meisten Programmiersprachen nutzt und was es für Alternativen gibt, wenn Goto nicht genutzt werden kann.
Goto-Nutzung in verschiedenen Programmier- und Skriptsprachen
Hier bekommst du zu vielen gängigen Programmiersprachen einen Überblick wie Goto dort, wenn vorhanden, genutzt werden kann:
Sprache | Goto-Syntax | ||
---|---|---|---|
C |
|
||
C++ | wie in C | ||
C# | wie in C | ||
Java | kein Goto in Java! | ||
PHP | wie in C | ||
Python | kein Goto in Python! | ||
VBA (Excel VBA) |
|
||
Bash / Shell unter Linux | kein Goto in Bash! | ||
Batch / CMD |
|
||
PowerShell | kein Goto in PowerShell! (aber man kann es sich wenn man es unbedingt nutzen will z. B. so selber bauen) | ||
JavaScript | kein Goto in JavaScript! |
Goto nutzen oder nicht?
Die Frage die wohl viele beschäftigt ist, ob man nun Goto nutzen sollte oder komplett aus seinem Code verbannen sollte:
Einfache Umsetzung (if X goto Z)
Für die Nutzung von Goto im Code spricht natürlich die sehr einfache Nutzung. Man kann relativ einfach Teile des Codes wiederholen und durch die Nutzung von if-Abfragen den Sprung an eine bestimmte Stelle im Code an Konditionen knüpfen. In Batch-Dateien z. B. lassen sich nur durch Hilfe von Goto While- und Until-Schleifen mehr oder weniger nachbilden.
Insbesondere für Anfänger mag dies erst einmal einfacher zu nutzen sein, da man sich eigentlich nur diesen Befehl und die Auszeichnung der Sprungmarken verinnerlichen muss. Die ganzen anderen Sprachelemente wie Schleifen, Funktionen oder andere Befehle braucht man sich gar nicht erst anschauen oder merken.
Unstrukturierter Spaghetti-Code durch Goto-Nutzung?
Der größte Nachteil an der durchgehenden Nutzung von Goto -Befehlen und Sprungmarken im gesamten Code eines Programms ist die Nachvollziehbarkeit des Codes. Diese leidet massiv darunter, wenn man im Code hin- und herspringt. Der Code wird dadurch schwer zu lesen und man verliert leicht den Überblick darüber, wann man an welche Stelle springt. Hierdurch lassen sich auch leicht Fehler einbauen und das Debugging wird unnötig erschwert.
Allerdings kann man schlechten Code auch in einer absolut modernen Programmiersprache ohne Nutzung von Goto bauen.
Goto-Alternativen
Als Alternativen zu Sprungmarken und Goto-Befehlen sind Schleifen, Funktionen und Befehle wie continue oder break, wenn sie in der Programmiersprache angeboten werden zu nutzen.
Apple’s Goto-Fail
Im Jahr 2014 wurde ein schwerwiegender Programmierfehler von Apple öffentlich. Hierbei wurde durch einen fehlerhaft gesetzten doppelten Goto-Befehl eine Überprüfung der SSL-Verbindung übersprungen und die Verbindung galt in jedem Fall als sicher:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
. . . hashOut.data = hashes + SSL_MD5_DIGEST_LEN; hashOut.length = SSL_SHA1_DIGEST_LEN; if ((err = SSLFreeBuffer(&hashCtx)) != 0) goto fail; if ((err = ReadyHash(&SSLHashSHA1, &hashCtx)) != 0) goto fail; if ((err = SSLHashSHA1.update(&hashCtx, &clientRandom)) != 0) goto fail; if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0) goto fail; if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) goto fail; goto fail; /* Diese Zeile durftte eigentlich nicht existieren! */ if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0) goto fail; err = sslRawVerify(...); . . . |
Fazit
Meiner persönlichen Meinung nach sollte man Goto auch möglichst sparsam einsetzen und auf moderne Elemente der Programmiersprachen zurückgreifen. In Sprachen wie Batch hat man aber kaum eine andere Wahl als Goto zu verwenden. Allerdings sollte man darauf achten in solchen Fällen den Code möglichst lesbar zu halten und nicht wild im Code vom Anfang zum Ende und wieder in die Mitte hin- und herzuspringen. Hier würde ich Goto in erster Linie nur zum Überspringen zum nächsten Schritt oder zum Nachbilden von Schleifen nutzen.
Excel: Sortieren – Spalten sortieren nach Datum oder alphabetisch
Excel: Filter setzen – Filter einfügen in Excel-Tabelle
Excel: Runden – Kaufmännisch runden und alle Runden-Funktionen
Excel: Oberste Zeile fixieren – Spalten und Zeilen fixieren
Goto in C#, Python, PHP, Excel VBA, Bash, PowerShell nutzen?
Excel- bzw. CSV-Datei in vCard umwandeln mit Freeware
Excel: AutoSumme funktioniert nicht – automatisch berechnen
Excel-Datei öffnet langsam – Tabellen öffnen dauert sehr lange
Excel: Kalenderwoche aus Datum ermitteln - Formel für KW
Dokumentation der Gebäude-Verkabelung mit Excel
Trennzeichen bei Dezimalzahlen in Excel plötzlich falsch
Makros per Gruppenrichtlinie deaktivieren
Makros signieren
Nutzung falscher Programme
Goto in C#, Python, PHP, Excel VBA, Bash, PowerShell nutzen?
Batch: if und else - Syntax verstehen
While- und Until-Schleifen in PowerShell und Batch
Wie lange läuft mein PC schon? – PC Laufzeit auslesen unter Windows 10
Wochentag in einer Batch-Datei ermitteln
CMD/Powershell: Ping-Ergebnis mit Errorlevel auswerten
Skript um Zeit-basiert Dateien zu tauschen
Die Gefahr durch mit Adminrechten ausgeführte Skripte
Powershell und CMD: Clear um Konsole zu leeren?
Java-Anwendungen über CMD oder Powershell starten
Kommandozeile aus Explorer in geöffnetem Ordner
Umlaute in Batch-Dateien – immer wieder schön