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.
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. |
Wir stellen zunächst eine Liste der bei unserem Problem autretenden Objekte zusammen:
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.
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.)
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!
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:
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.
Dr. Bernd Kokavecz