Kapitel 1

Dr. Bernd Kokavecz

Python - creeping

Das Programm "Hello World"

Unvermeidlich - und doch instruktiv - ist das in allen Programmiersprachen dieser Welt fabrizierte Programm "Hallo Welt", kann man sich doch das Zusammenspiel von Editor, Compiler / Interpreter und Betriebssystem hiermit verdeutlichen.

Gehen Sie zur Lektion 1: "Mein erstes Python-Programm"

Objektorientierte Programmierung (OOP)

Programmieren in der Schule folgt in der Regel dem Problemlösungsansatz. Das oben vorgestellte Programm hat weder damit, noch mit der OOP etwas zu tun. Die OOP setzt eine objektorientierte (Problem-) Analyse (OOA) und einen objektorientierten Entwurf (OOD = objektorientiertes Design) einer Problemstellung voraus.

Problembeschreibung:

spinne In einem englischen unübersichtlichen Spukschloß soll verhindert werden, dass Touristen über Nacht eingeschlossen werden. Zu diesem Zweck wird am Eingang eine Lichtschrankeneinheit montiert, mit der elektronisch erkannt wird, wenn ein Besucher in die Museumsräume schloss.gif eintritt oder sie verläßt. Durch Verwendung zweier im Abstand von wenigen Millimetern montierter Sensoren innerhalb der Lichtschrankeneinheit ist die Auswerteelektronik (R-S-T-Flip-Flop) in der Lage, zwischen "Eintritt" und "Austritt" eines Besuchers zu unterscheiden. Mit Hilfe eines Zählers, der bei Eintritt aufwärts und bei Austritt abwärts zählt, und einer Anzeige des Zählerstandes kann dafür gesorgt werden, dass das Museumspersonal beruhigt abschließen kann, wenn der Zählerstand am Abend auf "NULL" steht.

Sollte sich das System bewähren, ist geplant, eine entsprechende Anlage in Windsor-Castle zu installieren. Hier sind vom Zähler jedoch wegen der Größe der Anlage 2 bis 10 Türen zu überwachen und es wäre sehr hilfreich, an mehreren Orten den aktuellen Zählerstand ablesen zu können.


"Windsor Castle"


zaehler.gif

Das Bild zeigt das Ergebnis der Programmieraufgabe, die modellhaft auszuführen ist. Deshalb werden die Lichtschranken durch zwei Eingabeknöpfe simuliert, die per Mausklick den Eintritt und den Austritt eines Besuchers vortäuschen. Auch die Anzeigegeräte werden in Form von Bildschirmfenstern simuliert. Unser Programm wird also nur ein Abbild der in der Aufgabenstellung beschriebenen Realität sein. Auch der eigentliche Zähler ließe sich in der Realität rein elektronisch (ohne Software) verwirklichen. Das Hintergrundbild gehört nicht zur Programmieraufgabe!

Programmieren bedeutet hier: Es wird ein Modell (ein Abbild) der Wirklichkeit geschaffen, das im Vergleich zur Realtät durch Abstraktion und Reduktion leichter handhabbar ist.

Zum Pflichtenheft


Das Pflichtenheft beschreibt - für den Auftraggeber verständlich - u.a. die Aufgaben und die Funktionen des gewünschten Softwareprodukts. Im vorliegenden Fall sind Details leicht aus der Aufgabenstellung (Problembeschreibung) extrahierbar, auf folgende Besonderheiten soll jedoch explizit hingewiesen werden:

  1. Es wird die Programmierung eines zentralen Zählers verlangt
  2. Die Erweiterungsmöglichkeit, mehrere Türen überwachen zu können, ist sofort zu brücksichtigen
  3. Die Fenster mit den Eingabemöglichkeiten (aufwärts, abwärts) besitzen einen dritten Knopf, um das Programm zu beenden (in der Abbildung wegen der eingestellten Fenstergröße nicht sichtbar).
  4. Auf Wunsch sind mehrere Anzeigen vorzusehen, die in ihrer Ausgestaltung (Lay-Out) durchaus unterschiedlich ausfallen dürfen!
  5. Es ist ein geeigneter Mechanismus zu implementieren, der dafür sorgt, daß eine beliebige Anzahl von Anzeigen auf Änderungen des Zählerstandes reagieren können.
  6. Das Problem soll nicht mit Hilfe einer Client-Server-Architektur gelöst werden.

Gehen Sie zur Lektion 2 der OOP: "Was sind Objekte"

Wir stellen zunächst eine Liste der bei unserem Problem autretenden Objekte zusammen:

  1. Es wird ein Ereigniszähler benötigt
  2. Es werden mehrere simulierte Lichtschranken (Eingaben) benötigt
  3. Es werden mehrere Anzeigen (Ausgaben) benötigt, die z.T. unterschiedlich zu gestalten sind.

Gehen Sie zur Lektion 3 der OOP: "Klassen und Objekte"

Kümmern wir uns um unser erstes Objekt, "unseren Zähler". Für seine Erzeugung ist zunächste eine Klasse "Zähler" zu programmieren. Aus bestimmten Gründen wollen wir diese Klasse sehr einfach ausgestalten und erst in einer zweiten Generation eine für unsere Anwendung geeignete Zählerklasse bilden.

Gehen Sie zur Vorübung (L4): "Meine erste Klasse"

Da dieser primitive Zähler zu wenige Funktionen besitzt, erstellen wir nun eine Klasse "Moderner Zähler", in der der Zähler auch abwärts zählen und auf Wunsch auf einen bestimmten Wert gesetzt werden kann. Da die übrigen Eigenschaften mit dem primitiven Zähler übereinstimmen, vererben wir dem modernen Zähler die Methoden und Attribute, wie sie in der Klasse "Zaehler" festgelegt sind. (Durch Überschreiben von Methoden gibt es noch weitergehendere Möglichkeiten.)

Gehen Sie zur Lektion 5 der OOP: "Vererbung"

Betrachten wir nun unsere "Lichtschranken". Sie haben drei "Knöpfe", die von der Maus bedient werden: "aufwärts" (entspricht Eintritt), "abwärts" (entspricht Austritt) und "ENDE", um das Programm beenden zu können.

Für die Gestaltung der Oberflächen steht eine umfangreiche Klassenbibliothek (Tkinter) zur Verfügung. Im Folgenden sollen mit einfachsten Mitteln (ohne Optimierung des Lay-Outs) diese vorgefertigten Klassen benutzt werden. Eine genaue Beschreibung des Systems zur Gestaltung von grafischen Oberflächen ist hier an dieser Stelle nicht vorgesehen!

Gehen Sie zur Lektion "Fenster und Knöpfe"  (L6)

Nun wollen wir das Gesamtsystem für unser Spukschloß fertigstellen. Dazu müssen wir uns noch ein Verfahren überlegen, mit dem es möglich ist, mehrere Anzeigen zu synchronisieren. Es handelt sich dabei um ein grundsätzliches Problem bei der Benutzung grafischer Oberflächen. Beispielsweise öffnet man aus einer Tabellenkalkulation heraus gleichzeitig ein Fenster mit einer Balkendiagramm-Darstellung und ein Fenster mit einer Kreisdiagramm-Darstellung. Ändert man irgendwelche Daten in der Tabelle, so sollen alle Darstellungen automatisch der Änderung folgen. Noch verzwickter wird es, wenn innerhalb verschiedener Darstellungen Änderungen eingegeben werden können.

Die Lösung des Problems sieht so aus: Eingabefenster und Ausgabefenster (oft eng miteinander gekoppelt) werden völlig vom sogenannten "Fachkonzept" (dem Modell, hier unserem Zähler) getrennt. Die Views (Ausgabefenster) haben die Möglichkeit, sich beim Modell als "ausgabeinteressiertes Objekt" mit ihrer Referenz anzumelden. Werden mit irdendeiner Methode die Attribute (Daten) des Modells geändert, benachrichtigt das Modell alle angemeldeten Views darüber, die wiederum dann die Möglichkeit haben, die interessierenden Daten vom Modell abzurufen: VIEW

Typische Methoden eines Modells sind in diesem Zusammenhang: anmelden, abmelden, benachrichtigen, den_Zustand_ändern und den_Zustand_abfragen.

Die Interaktionen in diesem Beobachtermuster lassen sich mit Hilfe eines Sequenzdiagramms (4) darstellen. Dabei verläuft die Zeitachse von oben nach unten. Um die Darstellung besser zu verstehen, empfehle ich, sich die Klassen M_VC_Manager und Superzaehler in der endgültigen Lösung mit allen Quelltexten anzuschauen.

Sequenzdiagramm


python zurück zur Startseite

Dr. Bernd Kokavecz
Datum: 25.04.2000
dr.bernd@kokavecz.de