Fortgeschrittene objektorientierte Programmierung
LVA 185.211, VL 2.0, 2005 S
Benötigt wird eine einfache graphische Oberfläche für ein
einfaches schwarz/weiß-ASCII-Terminal. Insbesondere sollen am Terminal
Fenster darstellbar sein, deren Ränder in der Regel durch die Zeichen
|
(vertikal), -
(horizontal) und +
(an den Ecken)
gezeichnet sind. Es sollen gleichzeitig mehrere Fenster (auch überlappend)
darstellbar sein. Aktiv ist immer das vorderste Fenster unter der aktuellen
Cursor-Position. Alle Tastatureingaben haben entweder globale Bedeutung,
unabhängig davon, wo der Cursor steht, oder beziehen sich auf das aktive
Fenster, falls es eines gibt. Tastatureingaben, die im aktuellen Zustand nicht
erlaubt sind, sollen dazu fuehren, dass entweder das ganze Terminal (bei
Tastatureingaben mit globaler Bedeutung bzw. wenn es kein aktives Fenster gibt)
oder das aktive Fenster inklusive Rand für kurze Zeit (ca. eine halbe bis
eine Sekunde) komplett mit #
-Zeichen gefuellt ist.
Folgende Tastatureingaben beziehen sich auf das Fenster selbst und haben
globale Bedeutung, alle anderen Eingaben werden an die Applikation im aktiven
Fenster weitergeleitet:
l,
r,
uund
d:
L,
R,
Uund
D:
b:
>und
<:
+und
-:
0bis
9:
Jedem Fenster ist genau eine Applikation zugeordnet, und jede Applikation
hat genau ein Fenster. Als Beispielapplikation soll ein kleines Zeichenprogramm
(kann auch ein Programmteil sein) dienen: An jeder Position (= Cursor-Position)
der Zeichnung steht entweder ein Leerzeichen oder *
. Zeichnungen haben
undefinierte Größe (bis zu einer Größe von mindestens
32000 Zeichen in jeder Dimension nach rechts und oben erweiterbar) und
bestehen zu Beginn nur aus Leerzeichen. Den Applikationsnummern 0 bis 9
soll das Zeichenprogramm mit unterschiedlichen Zeichnungen zugeordnet sein.
Jede der zehn Zeichnungen soll persistent gespeichert werden. Beim Start einer
Applikation wird die Zeichnung mit der entsprechende Nummer geladen und in
einem neuen, ganz vorne liegenden Fenster angezeigt. Größe und
Position des Fensters sollen der Größe und Position des Fensters mit
dieser Zeichnung beim letzten Abspeichern entsprechen. Zeichnungen sollen
nicht nochmals geladen werden, wenn sie bereits geladen sind; statt dessen
soll kurz ein nur aus #
-Zeichen bestehendes Fenster entsprechender
Größe und Position eingeblendet werden, das gleich wieder
verschwindet.
Folgende Tastatureingaben sollen von der Applikation verarbeitet werden:
s:
q:
x:
*und Leerzeichen:
*bzw. Leerzeichen. Die Tastatureingabe ist nicht erlaubt, wenn der Cursor auf dem Fensterrand steht.
Es soll möglich sein, dass von mehreren Terminals aus gleichzeitig auf die
persistenten Zeichnungen zugegriffen wird. Jedoch soll es nicht möglich
sein, dass Zeichnungen mit derselben Nummer auf verschiedenen Terminals
gleichzeitig offen sind. Daher soll eine Zeichnung nur dann geladen werden,
wenn auf keinem anderen Terminal, das auf denselben persistenten Speicher
zugreift, eine Zeichnung mit dieser Nummer existiert. Auch in diesem Fall
soll beim Versuch, die Applikation zu starten, ein Fenster aus #
-Zeichen
kurz eingeblendet werden.
Gestalten Sie Ihre Lösung möglichst einfach und gut wartbar. Denken Sie daran, dass Fenster und Beispielapplikation möglichst unabhängig voneinander austauschbar sein sollen. Persistente Daten sollen auch in neueren Versionen des Zeichenprogramms verwendbar sein. Der Inhalt eines Fensters soll so spät wie möglich und nur so weit wie nötig aus dem persistenten Speicher geladen werden. Achten Sie auf den Speicherverbrauch, da Zeichnungen sehr groß werden können, obwohl sie meist nur klein sind. Überlegen Sie sich geeignete Möglichkeiten zur Synchronisation mehrerer Terminals mit gemeinsamem persistenten Speicher und bedenken Sie, dass der gewählte Synchronisationsmechanismus später vielleicht gegen einen anderen ausgetauscht werden muss. Verwenden Sie ganz bewusst Softwareentwurfsmuster, die Ihnen für diese Anwendung geeignet erscheinen, und vermeiden Sie ebenso bewusst Entwurfsmuster, deren Einsatz Ihnen hier nicht für gerechtfertigt erscheint.
Die eigentliche Bildschirmausgabe können Sie einfach gestalten. Beispielsweise können Sie einmal pro Sekunde (oder in kürzeren Intervallen) den aktuellen Bildschirminhalt neu ausgeben. Denken Sie aber bitte daran, dass Tastatureingaben (durch Umlenken der Standardeingabe) sehr schnell erfolgen können. Vermeiden Sie überlange Testzeiten, indem Sie nicht nach jeder Tastatureingabe sofort den gesamten Bildschirminhalt neu ausgeben.