namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


lernen:goto

goto Spaghetti : Unstrukturiertes Programmieren

Autor: Dr. R. Richter
Schlagworte: goto spaghetti code

 Die Qualität des Quelltextes steht im umgekehrten Verhältnis 
 zur verwendeten Zahl von Sprungbefehlen.
---  Edsger Wybe Dijkstra

Aufgabe

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.

Lösung

Programmablaufplan

Ein Flussdiagramm (Programmablaufplan) ist eine (die einzige?) Möglichkeit, den Programmablauf zu verdeutlichen.

 Flussdiagramm nach DIN 66001.

Umbau

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.

 Vereinfachter Steuerfluss.

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.

 Strukturiertes Programm.

Struktogramm

In einem Nassi-Shneiderman-Diagramm (Struktogramm) treten Schleifen und Verzweigungen deutlicher hervor als im Programmablaufplan.

 Struktogramm nach DIN 66261.

Vereinfachter Quelltext

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;
}

Wertung

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!

weiterführende Literatur

  1. Edsger W. Dijkstra: Go To Statement Considered Harmful. CACM 11, No. 3 (March 1968) 147-148.
  2. Donald E. Knuth: Structured Programming with goto. (1974).
  3. Steve McConnell: Code Complete. Microsoft Press. (1993) 347-359.
lernen/goto.txt · Zuletzt geändert: 2014-07-13 16:14 (Externe Bearbeitung)