Objektorientierte Programmierung
LVA 185.162, VL 2.0, 2005 W
3. Übungsaufgabe
Themen:
Untertypbeziehungen, Stabilität, Programmiereffizienz
Termine:
| Ausgabe: |
27.10.2005 |
| reguläre Abgabe: |
03.11.2005, 12:45 Uhr |
| nachträgliche Abgabe: |
10.11.2005, 12:45 Uhr |
Abgabeverzeichnis:
Aufgabe3
Programmaufruf:
java Reservierung
Grundlage:
Skriptum bis Seite 57
Aufgabe:
Erweitern Sie Ihr Programm aus der 2. Übung folgendermaßen:
- Das Reservierungssystem soll nicht nur für Theaterkarten verwendbar
sein, sondern auch Sitzplätze in Zügen, Flugzeugen, u.s.w.
reservieren können. Neue Arten von Reservierungen (Zug, Flugzeug,
u.s.w.) sollen jederzeit hinzufügbar sein, wobei bestimmte Züge,
Flüge u.s.w. den Theatervorstellungen und Klassen (1. Klasse, 2. Klasse,
Business Class, Economy Class) oder Teilbereiche davon den Bereichen im
Theater entsprechen.
- Beim Hinzufügen neuer Reservierungsarten soll der Text in den
Benutzerschnittstellen und Ausgaben entsprechend angepasst werden.
- Bei der Vergabe beliebiger Plätze in einem Bereich soll eine klare
Reihenfolge festgelegt sein, in der die Plätze vergeben werden - z.B.
mit aufsteigenden Platz- und Reihennummern im Theater, möglichst
gleichmäßig verteilt auf alle Waggons im Zug, und von der Reihe
über den Flügeln aus abwechselnd nach hinten und vorne
aufgefüllt im Flugzeug. Pro Reservierungsart (siehe unten) soll eine
eigene Reihenfolge vorgegeben werden können. Bei der Reservierung
mehrerer nebeneinander liegender Sitze soll dieselbe Reihenfolge verwendet
werden, wobei Sitzplätze ohne ausreichende Nachbarplätze
übersprungen werden.
- Zur Vereinfachung des Hinzufügens neuer Züge, Flüge,
Theateraufführungen, u.s.w. sollen Typen von Reservierungsarten
(entsprechend Theaterräumen, Zugszusammenstellungen und Flugzeugtypen)
erstellt werden können, die alle nötigen Basisdaten enthalten:
Bereiche, Reihen und Plätze pro Bereich, Reservierungsreihenfolge,
Bezeichnungen und Texte für Benutzerschnittstellen und Ausgaben, u.s.w.
Beim Hinzufügen einer Aufführung, eines Zuges oder eines Fluges
ist der entsprechende Typ anzugeben.
- Die gleichzeitige Reservierung von Plätzen für mehrere
Aufführungen, Züge, Flüge, u.s.w. soll möglich sein.
Wird dabei die Nummer eines Platzes angegeben, müssen alle
Reservierungen vom selben Typ sein (z.B. selbes Theater bzw. selber
Flugzeugtyp). Wird kein fixer Platz angegeben, brauchen Art und Typ der
Reservierung nicht übereinstimmen. Beispielsweise kann man Hin- und
Rückflüge zusammen mit Theaterkarten in einem Schritt reservieren.
- Zur Verwaltunsvereinfachung sollen alle Daten in Listenform ausgegeben
werden können. Vor allem werden folgende Listen benötigt: Liste
aller Reservierungen einer Person (manchmal eingeschränkt auf ein
vorgegebenes Zeitintervall und/oder ein oder mehrere Vorstellungen,
Züge, Flüge, u.s.w.) und die Liste aller Reservierungen einer
Vorstellung, eines Zuges oder eines Fluges (sortiert nach Bereichen, Reihen
und Plätzen oder alphabetisch nach den Personen, manchmal
eingeschränkt auf ein oder mehrere Bereiche, Reihen und Plätze).
- Manchmal ist es nötig, eine Vorstellung von einem Raum in einen
anderen zu verlegen, Züge umzustellen, oder den Flugzeugtyp zu
ändern, ohne dass dabei (die meisten) Reservierungen ungültig
werden. Für je zwei Typen von Reservierungsarten soll eine Tabelle
definiert werden können, die Plätze des einen Typs in Plätze
des anderen Typs umwandelt. Mit Hilfe solcher Tabellen sollen Umstellungen
einfach durchführbar sein, wobei übriggebliebene Plätze, die
nach der Umstellung nicht mehr reserviert sind, auszugeben sind.
Lesen Sie das Skriptum bis Seite 57. Erweitern bzw. ändern Sie Ihr
Programm aus der 2. Übungsaufgabe entsprechend. Setzen Sie
Untertypbeziehungen so oft wie möglich ein, und achten Sie darauf,
dass das Ersetzbarkeitsprinzip erfüllt ist. Vermeiden Sie unnötige
Änderungen der Objektschnittstellen. Vermeiden Sie, wo immer es Ihnen
möglich scheint, die Verwendung von switch
- und geschachtelten
if
-Anweisungen. Halten Sie Ihre Lösung so einfach wie möglich.
Die Aufgabenstellung ist umfangreich. Falls Sie meinen, bis zum Abgabetermin
keine vollständige Lösung fertigstellen zu können, konzentrieren
Sie sich auf die für die Brauchbarkeit des Programms wesentlichen Teile
und ignorieren Sie weniger wichtige Forderungen der Aufgabenstellung.
Abgesehen davon können Sie die Aufgabenstellung frei interpretieren.
Schreiben Sie Ihre Lösung in den bereits existierenden Ordner
Aufgabe3
in Ihrem Verzeichnis auf dem Übungsrechner b3. Das
Programm soll von diesem Ordner aus durch java Reservierung
aufrufbar
sein; das heißt, die Methode main
soll in der Klasse
Reservierung
in der Datei Reservierung.java
(die Sie selbst
schreiben) stehen. Schreiben Sie nicht mehr als eine Klasse in jede Datei.
Der Ordner soll zum Zeitpunkt der Abgabe (03.11.2005, 12:45 Uhr) und der
nachträglichen Abgabe (09.11.2005, 12:45 Uhr) alle .java
-Dateien
enthalten, die Sie für Ihre Lösung benötigen. Bitte entfernen
Sie alle .java
-Dateien, die nicht zur Abgabe gehören. Dateien mit
anderen Endungen werden bei der Beurteilung nicht berücksichtigt.
Verzichten Sie auf die Verwendung von Ordnern innerhalb von Aufgabe3
.
Wichtiger Hinweis:
Der Umfang dieser Aufgabenstellung ist bewußt hoch angesetzt, um Ihnen
einen Eindruck von den in der Praxis nicht immer idealen Rahmenbedingungen der
Softwareentwicklung zu vermitteln. Für eine sehr gute Beurteilung Ihrer
Lösung reicht es, wenn ca. 90% der von einem fiktiven Anwender
benötigten Funktionalität zur Verfügung steht, für eine
positive Beurteilung reichen 50% (bei rechtzeitiger Abgabe der Lösung und
wenn die oben genannten Bedingungen - Untertypbeziehungen, Ersetzbarkeit,
Einfachheit, u.s.w. - erfüllt sind). Die ersten 50 bis 90 Prozent dieser
Funktionalität sind sicher mit viel kleinerem Aufwand erreichbar als die
restlichen 10 bis 50 Prozent. Sie schneiden jedenfalls besser ab, wenn Sie eine
unvollständige Lösung rechtzeitig abgeben als wenn Sie eine
vollständige Lösung nachträglich abgeben (und dafür nur die
Hälfte der Punkte erhalten). Sie können Ihre Beurteilung verbessern,
wenn Sie weniger wichtige aber aufwändig zu implementierende
Funktionalität gezielt weglassen.