- Spaghetticode
-
Spaghetticode ist ein abwertender Begriff für Software-Quellcode, der komplexe und verworrene Kontrollstrukturen aufweist. Insbesondere die häufige Verwendung von
GOTO
-Anweisungen ist ein Indiz für Spaghetticode, allerdings keine zwingende Voraussetzung dafür. Jedes verworrene und auch für erfahrene Programmierer schlecht nachvollziehbare Stück Quellcode kann als Spaghetticode bezeichnet werden.Spaghetticode kann unterschiedliche Ursachen haben. Oft neigen unerfahrene Programmierer dazu, Spaghetticode zu schreiben. Auch die häufige Erweiterung des Quellcodes, ohne dass ein Refactoring durchgeführt wird, kann zu Spaghetticode führen.
Verglichen mit klar strukturiertem Quellcode weist Spaghetticode eine deutlich schlechtere Wartbarkeit, also auch erhöhte Wartungskosten, auf. Zudem kann Spaghetticode bei ähnlichen Anforderungen an ein weiteres Programm in der Regel wesentlich schlechter wiederverwendet werden.
Beispiel
Das nachfolgende simple Basic-Programm gibt die Zahlen 1 bis 10 zusammen mit dem jeweiligen Quadrat auf dem Bildschirm aus. Die verworrenen
GOTO
-Anweisungen machen es schwierig, den Ablauf des Programms nachzuvollziehen. In der Praxis ist Spaghetticode meist erheblich komplexer, allein aufgrund der Größe der Programme und der Häufigkeit vonGOTO
-Anweisungen.10 i = 0 20 i = i + 1 30 PRINT i; " squared = "; i * i 40 IF i >= 10 THEN GOTO 60 50 GOTO 20 60 PRINT "Program Completed." 70 END
Das folgende Programm ist deutlich strukturierter und führt dieselbe Funktion aus:
10 FOR i = 1 TO 10 20 PRINT i; " squared = "; i * i 30 NEXT i 40 PRINT "Program Completed." 50 END
Es gibt aber noch weitere Anzeichen von Spaghetticode. Der
GOTO
-Sprung im ersten Programm ist noch im Rahmen, kann aber zu folgendem verleiten:10 CLS 20 i = 0 30 i = i + 1 40 PRINT i; " squared = "; i * i 50 IF i >= 10 THEN GOTO 70 60 GOTO 30 70 PRINT "Program Completed." 80 INPUT "Do it Again (j)"; sel$ 90 IF sel$ = "j" THEN GOTO 10 100 END
Diese Nutzung von
GOTO
führt meist dazu, dass man zwischen Programmblöcken hin und her springt, und damit ein richtiges Spaghetticode-Chaos anrichtet. Das gilt nicht nur für dieGOTO
-Anweisungen. Gerne wird auch mitIF
-Blöcken, die in sich mehrere Blöcke mitIF
,FOR
oder anderen Unterprozeduren enthalten, ein „Klammerchaos“ verursacht, wie das folgende Programm anhand vonIF
,FOR
undGOTO
verdeutlicht:10 FOR ia = 1 TO 10 20 IF ia = 5 THEN 30 FOR ib = 1 TO 10 40 PRINT "LOOP:";ia;" SUB LOOP:";ib 50 IF ib = 8 THEN GOTO 80 60 NEXT ib 70 END IF 80 PRINT "SUB LOOP:";ia;" END" 90 NEXT ia 100 END
Dieses Beispiel ist auch noch überschaubar, sollte man aber größere Sprünge in mehreren Ebenen machen, endet man bei einem Quellcode, der irgendwann auch vom Schreiber selbst nicht mehr durchschaubar ist.
Die größte Gefahr, selbst als Programmierer Spaghetticode zu produzieren, entsteht, wenn man eine Programmiersprache verwendet, die man noch nicht überblickt, oder der Befehle zur einfachen Schleifensteuerung fehlen, z.B. Assembler. In diesen Sprachen ist es unerlässlich, mit Sprungbefehlen zu arbeiten, daher kann man schnell den Überblick verlieren. Bestes Beispiel für reinste Sprünge ist ein endlicher Automat.
Generell wird empfohlen klare Kommentare im Quelltext zugunsten einer besseren Gliederung zu verwenden.
Weblinks
Wikimedia Foundation.