Programmbeispiel in Pascal
Dieses Programmbeispiel soll die Nachteile der nicht-objektorientierten funktionalen Programmierung aufzeigen.
program FigurenBewegung; var kreisX, kreisY: integer; quadratX, quadratY: integer; procedure setzeKreisPosition(x, y: integer); begin kreisX := x; kreisY := y; end; procedure setzeQuadratPosition(x, y: integer); begin quadratX := x; quadratY := y; end; procedure bewegeKreisNachRechts(schritte: integer); begin kreisX := kreisX + schritte; end; procedure bewegeQuadratNachRechts(schritte: integer); begin kreisX := kreisX + schritte; end; procedure gibKreisPositionAus; begin writeln('Kreis befindet sich bei (', kreisX, ', ', kreisY, ')'); end; procedure gibQuadratPositionAus; begin writeln('Quadrat befindet sich bei (', quadratX, ', ', quadratY, ')'); end; begin setzeKreisPosition(10, 20); setzeQuadratPosition(5, 5); gibKreisPositionAus; bewegeKreisNachRechts(15); bewegeQuadratNachRechts(-30); gibKreisPositionAus; gibQuadratPositionAus; end.
In diesem Programm sollen ein Kreis und ein Quadat mit Anfangswerten versehen werden. Dazu dienen die manipulierenden Prozeduren setzeKreisPosition() und setzeQuadratPosition(). Die Variablen kreisX, kreisY, quadratX und quadratY werden dann auf die Werte gesetzt, die von den Parametern geliefert worden sind.
Zwei weitere Prozeduren sollen den Kreis bzw. das Quadrat nach rechts bewegen. Auch dazu wird ein Parameter ausgewertet und dessen Wert wird dann einfach zu dem X-Wert des Kreises bzw. Quadrats addiert.
Am Ende haben wir noch zwei Ausgabe-Prozeduren, welche die Koordinaten des Kreises und des Quadrats ausgeben.
Der Kreis befindet sich nach Aufruf von setzeKreisPosition(10,20) an der Position (10,20), das Quadrat nach Aufruf der entsprechenden Quadrat-Methode an der Position (5,5).
Dann soll der Kreis um 15 Einheiten nach rechts bewegt werden, das Quadrat dagegen um 30 Einheiten nach links.
Die neuen Positionen wären also (25,20) für den Kreis und (-25,5) für das Quadrat.
Ausgegeben werden aber folgende Daten:
Kreis befindet sich bei (-5, 20) Quadrat befindet sich bei (5, 5)
Offensichtlich ist bei der Entwicklung dieses Programm ein gravierender Fehler unterlaufen, da die Positionen völlig falsch angegeben werden. Wieso befindet sich der Kreis 15 Einheiten weiter links statt 15 Einheiten weiter rechts, während sich das Quadrat überhaupt nicht bewegt hat?
Der Fehler liegt in der Prozedur
procedure bewegeQuadratNachRechts(schritte: integer); begin kreisX := kreisX + schritte; end;
Anstelle der Quadrat-Koordinaten werden hier die Kreis-Koordinaten verändert.
Bei diesem Programm gibt es keine Objekte, sondern nur Variablen und Prozeduren. Die Variablen, die für den Kreis und das Quadrat zuständig sind, liegen völlig ungeschützt vor. Die Quadrat-Prozeduren können die Kreis-Koordinaten ohne Weiters verändern - und umgekehrt.
In der Objektorientierten Programmierung ist so etwas nicht möglich. Ein Kreis-Objekt speichert die Koordinaten in privaten Instanz-Variablen, auf die von außerhalb des Objektes nicht zugegriffen werden kann (Datenkapselung). Das Gleiche gilt für ein Quadrat-Objekt, auch seine Daten können von außen nicht verändert werden.
Ein Fehler, wie er in dem Pascal-Programm vorliegt, könnte bei der OOP nicht passieren.
Quellen:
- Lahres et al.: Objektorientierte Programmierung, Rheinwerk Computing 2021.
- Barnes, Kölling: Java lernen mit BlueJ - Objects first. Pearson-Verlag 2019.
- Ullenboom: Java ist auch eine Insel, Rheinwerk Computing 2023.