Die Qualität des Quelltextes steht im umgekehrten Verhältnis zur verwendeten Zahl von Sprungbefehlen. --- Edsger Wybe Dijkstra
Verstehst du den folgenden Quelltext?
if (n == 1) goto stop; if (n % 2 == 0) goto gerade; ungerade: n = 3 * n + 1; if (n == 1) goto stop; gerade: n = n / 2; if (n == 1) goto stop; if (n % 2 == 0) goto gerade; goto ungerade; stop:
Veranschauliche ihn mit einem Programmablaufplan (Flussdiagramm, DIN 66001). Vereinfache den Algorithmus, ohne seine Wirkung zu ändern. Baue den Quelltext so um, dass er in einem Struktogramm (DIN 66261) darstellbar ist. Codiere das Ergebnis wieder in C++. Ziehe Schlussfolgerungen.
Ein Flussdiagramm (Programmablaufplan) ist eine (die einzige?) Möglichkeit, den Programmablauf zu verdeutlichen.
Der Steuerfluss ist unnötig kompliziert. Besonders fallen die beiden aufeinander folgenden Tests ins Auge. Die Tests im unteren Bildteil lassen sich entfernen, wenn nach dem Halbieren zum Start zurückgegangen wird.
Mit Strichlinie markiert ist die nächste Vereinfachung. Der Rücksprung zum Start nach dem Verdreifachen spart eine weitere Verzweigung. So entsteht eine dritte, strukturierte Version, die aus einer abweisenden Schleife und einer Verzweigung besteht.
In einem Nassi-Shneiderman-Diagramm (Struktogramm) treten Schleifen und Verzweigungen deutlicher hervor als im Programmablaufplan.
Der entstehende Quelltext ist nur halb so lang und einfacher zu verstehen.
while (n != 1) { if (n % 2 == 0) n = n / 2; else n = 3 * n + 1; }
Programme mit vielen Sprungbefehlen sind schwer verständlich und damit fehleranfällig. Solche Quelltext umzubauen ist auch nicht immer einfach. Vielmehr sollte man beim Algorithmenentwurf darauf achten, nicht nur mit "wenn … dann …" zu formulieren, sondern wiederholte Anweisungen mit den Worten "solange wie …" oder "wiederhole bis …" zu beschreiben:
Solange wie n noch nicht bei 1 angekommen ist,halbiere n, falls es gerade ist,
sonst verdreifache es und füge 1 hinzu.
Dann kann Spaghetti-Code gar nicht erst entstehen. Um aufrichtig zu sein, es ist ein unfaires, zu stark vereinfachendes Beispiel. Es gibt komplexe Situationen, in denen goto nur schwer zu ersetzen ist. Allerdings sind diese Situationen sehr selten.
Spaghetti gehören auf den Teller, nicht in den Quelltext. Pasta!