Zum Inhalt springen

Spaghetticode

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 9. Juli 2014 um 01:58 Uhr durch 80.141.233.190 (Diskussion) (historisch: typpo). Sie kann sich erheblich von der aktuellen Version unterscheiden.
Ein Teller Spaghetti sieht verworren und unübersichtlich aus. Von diesem Aussehen leitet sich der Name Spaghetticode ab.

Spaghetticode ist ein abwertender Begriff für Software-Quellcode, der verworrene Kontrollstrukturen aufweist. Ein Indiz dafür kann etwa die übermäßige Verwendung von Sprunganweisungen (wie GOTO) sein, wobei übermäßig bedeutet: Zum gleichen Ziel könnte man auch mit weniger Sprüngen gelangen. Jedes verworrene und auch für erfahrene Programmierer schlecht nachvollziehbare Stück Quellcode kann als Spaghetticode bezeichnet werden. Eine so geschriebene Software muss nicht schlecht funktionieren; auch bedeutet Spaghetticode nicht zwingend eine mangelhafte Kommentierung der einzelnen Programmierschritte.

Spaghetticode kann unterschiedliche Ursachen haben. Oft neigen unerfahrene Programmierer dazu, „einfach drauf los zu programmieren“, wodurch zwangsläufig Spaghetticode entsteht. Auch die wiederholte spätere Erweiterung des Quellcodes, ohne dass ein Refactoring durchgeführt wird, kann zu Durcheinander und damit zu Spaghetticode führen.

Verglichen mit klar strukturiertem Quellcode weist Spaghetticode eine deutlich schlechtere Wartbarkeit, also auch erhöhte Test- und Wartungskosten, auf. Zudem kann Spaghetticode bei ähnlichen Anforderungen in der Regel wesentlich schlechter oder nur mit hohem Aufwand wiederverwendet werden.


Begriff und vermutliche Herkunft

In den ersten Anfängen der Rechner- und damit Computerentwicklung wurden Berechnungen, Abläufe und Daten abhängig von der zur Verfügung stehenden Hardware auch fest verdrahtet, Die Grenzen zwischen reinen Lochkartensortern und ersten Rechenfunktionen sind hierbei zum Teil fließend. IBM stellt etwa mit den Typen IBM_407, 402, 77, 88 entsprechende Maschinen her.

Die Verdrahtung in der jeweiligen Maschine oder an einem defür gedachten, dedizierten Feld (Control Board, Plugboard, Patch Panel) war penibel zu planen und auszuführen. Eine Übersichtlichkeit der bestehenden Verdrahtung war nicht zwingend gegeben. Insbesondere die Verdrahtung mit einzelnen Litzen auf engen Steckfeldern war hiervon betroffen.

Der heute für unübersichtliche Programme und deren Programmierweise verwendete Begriff dürfte in dieser Zeit, auf diesen und ähnlichen Maschinen entstanden sein. Er hat den Übergang zu reinen Computern, zu Großrechnern und früher mittlerer Datentechnik, über Tasten, Dreh- und Kippschaltern, Lochkarten und Lochstreifen zu magnetischer und optischer und Halbleiterspeichertechnik überstanden, die mit steigenden Aufgaben und steigender Größe und Leistungsfähigkeit der Hardware die feste Verdrahtung unüblich machte.


Programmierbeispiel

Das nachfolgende, in der Programmsprache BASIC erstellte Programm gibt die Zahlen 1 bis 10 zusammen mit dem jeweiligen Quadrat auf dem Bildschirm aus. Die beiden aufeinander folgenden GOTO-Anweisungen machen den Spaghetticode aus: Sie sind nicht nötig, und sie bedeuten Stolpersteine für Interessierte, die den Code nachvollziehen wollen. In der Praxis ist Spaghetticode meist erheblich komplexer.

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 Fully Completed."
70 END


Im Klartext sagt das Programm: Fang' bei 0 an, danach erhöhe immer um eine 1. Bringe das Ergebnis auf den Bildschirm, zusammen mit seinem Quadrat. Wenn die Zahl größer oder gleich 10 ist, spring nach unten. Ansonsten spring an den Anfang. Fertig.

Das folgende Programm leistet dasselbe, kommt aber ohne die beiden Sprünge aus. Es ist zudem kürzer und damit eleganter. Paraphrasiert funktioniert es so: Fange bei 1 an und gehe bis 10, bringe die jeweilige Zahl auf den Bildschirm, zusammen mit ihrem Quadrat. Hol' die nächste Zahl aus dem Pool. Fertig.


10 FOR i = 1 TO 10
20 PRINT i; " squared = "; i * i
30 NEXT i
40 PRINT "Program Fully Completed."
50 END


Es gibt aber noch weitere Anzeichen für 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 die GOTO-Anweisungen. Gerne wird auch mit IF-Blöcken, die in sich mehrere Blöcke mit IF, FOR oder anderen Unterprozeduren enthalten, ein „Klammerchaos“ verursacht, wie das folgende Programm anhand von IF, FOR und GOTO 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, so dass man schnell den Überblick verlieren kann. Bestes Beispiel für reinste Sprünge ist ein endlicher Automat.

Generell wird empfohlen, den Code in kleine, überschaubare Einheiten (Methoden, Funktionen) zu teilen und gleiche Teile wiederzuverwenden. Es kann deshalb von Vorteil sein, auf Papier die Ideen zu der Programmierung zu skizzieren und anschließend den Quellcode zu erstellen.

Programmierparadigmen

Unterschiedliche Programmierparadigma bieten unterschiedliche Mittel um Spaghetticode zu vermeiden. Die Objektorientierte Programmierung bietet beispielsweise verschiedene Möglichkeiten um Code innerhalb von Klassen und über Klassengrenzen hinweg zu verteilen und wiederzuverwenden. Jedoch kann nur mittels konsequenter Einhaltung der Paradigmen der objektorientierten Programmierung Spaghetticode vermieden werden. Insbesondere die Einhaltung der Prinzipien objektorientierten Designs, korrekte Benutzung von Entwurfsmustern und Domain-Driven Design verhindern Spaghetticode.

Siehe auch

historisch