Cobol bietet elegante Möglichkeiten:

GOTOs können vermieden werden

11.03.1983

Als Erwiderung auf einen Artikel von Rudolf Gogoll zur Strukturierten Programmierung in Cobol (siehe CW 8/83, Seite 10) übersandte uns Dr. Hans-Jürgen Scheibl von der Technischen Akademie in Esslingen den folgenden Beitrag. Dr. Schleibl meint, daß die Schleifenbehandlung, die Gogoll vorgeschlagen hatte, verbesserungswürdig sei. Seiner Meinung nach gebe es gerade bei der Programmiersprache Cobol durchaus Möglichkeiten, elegant Problematiken wie die Schleifenbildung zu umgehen. Vorschläge und Beispiele sollen in diesem Beitrag die Meinung des Autors untermauern.

Betrachten wir uns die von Rudolf Gogoll vorgeschlagene Lösung einer Einleseschleife genauer und berücksichtigen wir auch die sicher notwendigen Vernachlässigungen. Nach der Anfangsverarbeitung beginnt eine (in Cobol) abweisende "Until"-Schleife, die das Endekriterium abprüft. Es kann angenommen werden, daß die Variable "Ende" durch eine "Value"-Klausel vorbesetzt ist.

Die Variable "Ende" ist die Kontrollvariable der Schleife. Damit keine Endlosschleife entsteht, muß diese Variable innerhalb des Schleifenrumpfes verändert werden. In den drei Datenblöcken

- Dateneingabe

- Gruppenverarbeitung

- Einzelverarbeitung

kann dies nur bei der Dateneingabe, das heißt beim Lesen von einer Datei oder bei der Eingabe über den Bildschirm erfolgen. "Ende" wird im Block Dateneingabe von zum Beispiel Null auf Eins gesetzt. Hiermit soll dem Programm signalisiert werden, daß kein Satz mehr vorliegt. Trotzdem läuft das vorliegende Beispielprogramm in die Gruppen- und Einzelverarbeitung. Diese Verarbeitung muß dann eine interne Logik enthalten, die das Endekriterium prüft. Gerade diese interne Logik sollte aber nach den Ausführungen des Artikels vermieden werden. Das Strukturprogramm und das dazugehörige Programm zeigen also noch erhebliche Schwächen.

Wie kann man nun diese Probleme umgehen?

Die erste Möglichkeit besteht darin, eine von vielen beanstandete Exit-Konstruktion ins Strukturprogramm aufzunehmen (Bild 1). Eine solche Konstruktion kann man in Cobol auf zwei verschiedene Weisen realisieren:

OHNE NEUES GOTO

STEUERLEISTE SECTION.

ST 1.

PERFORM

ANFANGSVERARBEI TUNG.

PERFORM ST 2 UNTIL ENDE = 1.

GOTO ST-3.

ST-2.

PERFORM DARENEINGABE.

IF ENDE = 0 THEN PERFORM

GRUP PENVERARBEITUNG.

IF ENDE = 0 THEN PERFORM

EINZEL VERARBEITUNG.

ST-3.

PERFORM SCHLUSSVERARBEITUNG.

STOP RUN.

MIT GOTO:

STEUERLEISTE SECTION.

ST-1

PERFORM

ANFANGSVERARBEITUNG .

PERFORM ST-2 UNTIL ENDE = 1.

ST-2.

PERFORM DATENEINGABE.

IF ENDE = 1 THEN GOTO ST-3.

PERFORM GRUPPENVERARBEITUNG.

PERFORM EINZELVERARBEITUNG.

ST-3.

PERFORM SCHLUSSVERARBEITUNG.

STOP RUN.

Weder die eine noch die andere Lösung ist besonders elegant.

Programmierung ohne GOTO

Vergleicht man nun eine Einleseschleife mit einer normalen Zählschleife (Bild 2), dann sieht man, daß in einer Zählschleife die Kontrollvariable an zwei Stellen verändert wird. Warum macht man dieses nicht auch in einer Einleseschleife! Es entsteht nun ein neues Struktogramm mit einer abweisenden Schleife (Bild 3). Das Programm läßt sich in Cobol elegant realisieren. Weiterhin sieht man, daß sämtliche GOTOs entfallen. Die Einleseschleife mit Abbruchkriterien ist daher in Cobol GOTO-frei programmierbar.

STRUKTURIERTE LÖSUNG

STEUERLISTE SECTION.

ST-1.

PERFORM

ANFANGSVERARBEI TUNG.

PERFORM DATENEINGEABE

PERFORM GRUPPENVERARBEITUNG

UNTIL ENDE = 1.

PERFORM SCHLUSSEVERARBEITUNG.

STOP RUN.

GRUPPENVERARBEITUNG SECTION.

GR-1.

PERFORM RUPPENVERARBEITUNG

PERFORM EINZELVERARBEITUNG

UNTIL ENDE = 1 OR

GRUPPENWECHSEL.

PERFORM GRUPPENNACHARBEITEN.

GR-EXIT.

EXIT.

EINZELVERARBEITUNG SECTION.

EI-1.

PERFORM EINZELVORARBEITEN.

PERFORM EINZELARBEITEN.

PERFORM DATENEINGABE.

EI-EXIT.

EXIT.

Damit soll auf keinen Fall behauptet werden, daß man immer in Cobol auf solche GOTO-freie Lösungen kommt. Hier muß man Herrn Gogoll zustimmen, daß ein zurückhaltend und überlegt eingesetztes GOTO die Klarheit eines Programmes nicht notwendigerweise zerstören muß. Vergleicht man sehr viele Cobol-Programme untereinander, so stellt man fest, daß sehr viele Cobol-Programmierer keine Sections benutzen, obwohl sie sich hervorragend zur Modularisierung anbieten.

Man kann verbieten, daß zwischen Sections hin- und hergesprungen wird. Damit stellt jede Section ein Modul mit einem Eingang und einem Ausgang (Exit-Paragraph) dar. Innerhalb der Sections wird diese Regel gelockert, indem man hier Sprünge zuläßt. Insbesondere sollte hier nur der Sprung auf den Exit-Paragraph bevorzugt werden. Damit erreicht man eine GOTO-Freiheit im "großen", wohingegen man diese Freiheit im "kleinen" nicht fordert. Dies entspricht bekanntlich auch der Struktur von heutigen Maschinen, die auf Assembler-Ebene mit GOTOs operieren müssen.

Die Technik des Vor- und Nachlesens ergibt grundsätzlich gleiche Strukturen bei der Gruppenverarbeitung mit n-Rängen, wie die beiden nachfolgenden (lauffähigen) Programmentwürfe (Bild 4, 5) zeigen. Hierbei handelt es sich um das Einlesen einer nach Artikelnummern sortierten Artikeldatei "DO1ART".