Objektorientierte Programmierung
LVA 185.162, VL 2.0, 2008 W
6. Übungsaufgabe
Themen:
dynamische Typinformation, homogene Übersetzung von Generizität
Termine:
| Ausgabe: |
20.11.2008 |
| reguläre Abgabe: |
27.11.2008, 12:45 Uhr |
| nachträgliche Abgabe: |
04.12.2008, 12:45 Uhr |
Abgabeverzeichnis:
Gruppe/Aufgabe6
Programmaufruf:
java Test
Grundlage:
Skriptum bis Seite 123
Aufgabe
Welche Aufgabe zu lösen ist:
Von Personen ist der Vorname, der aktuelle Familienname und das Geburtsjahr bekannt.
Bei männlichen Personen ist weiters bekannt, ob sie den Grundwehrdienst oder den Zivildienst abgeleistet haben, ob sie für den Wehrdienst untauglich sind oder die Tauglichkeit noch nicht festgestellt wurde.
Bei weiblichen Personen ist der Mädchenname bekannt, falls sie bei der Heirat einen anderen Namen angenommen haben.
Aktive oder ehemalige Studenten sind weibliche oder männliche Personen.
Von Studenten wird (neben den sonstigen personenbezogenen Daten) das Jahr des Studienbeginns gespeichert, von ehemaligen Studenten auch das Jahr des Studienabschlusses bzw. Studienabbruchs und gegebenenfalls die Gesamtnote im Abschlusszeugnis.
Entwickeln Sie Java-Klassen bzw. Interfaces zur Darstellung von Personen und Studenten.
Folgende Funktionalität soll unterstützt werden:
- Erzeugen von Personen/Studenten
- Ändern der Information über Grundwehrdienst/Zivildienst bei Männern
- Ändern des Namens und setzen des Mädchennamens bei Frauen
- Setzen des Abschlussjahres und der Note im Abschlusszeugnis bei Studenten
Schreiben Sie eine Klasse Staat, die Informationen über Personen, die in einem Staat leben, verwaltet und statistische Auswertungen über diese Personen ermöglicht.
Jeder Staat soll einen unveränderlichen Namen haben.
Folgende Methoden sollen unterstützt werden:
- Einfügen von Personen in einen Staat
- Entfernen von Personen aus einem Staat
- Suchen nach Personen in einem Staat über deren Namen
- Methoden zum Berechnen folgender statistischer Werte:
- Akademikerquote für Frauen, Männer, sowie Frauen und Männer gemeinsam (wobei die Akademikerquote der Prozentsatz der Personen über 30 Jahren ist, die ein Studium abgeschlossen haben)
- durchschnittliche Studiendauer in Jahren für Frauen, Männer, sowie Frauen und Männer gemeinsam
- Prozentsatz der Studienabbrecher für Frauen, Männer, sowie Frauen und Männer gemeinsam
Die Klasse Test soll die wichtigsten Normal- und Grenzfälle überprüfen und die Ergebnisse in allgemein verständlicher Form in der Standardausgabe darstellen.
Machen Sie unter anderem Folgendes:
- Erstellen Sie eine Menge von Staaten mit unterschiedlichen Namen und unterschiedlichen Personen (wirklich eine Menge von Staaten, nicht nur eine Ansammlung einzelner Variablen).
Jeder Staat in der Menge soll über den eindeutigen Namen des Staates angesprochen werden können.
- Fügen Sie zu einigen Staaten in der Menge einzelne Personen hinzu, entfernen Sie einzelne Personen, und ändern Sie die Informationen zu einzelnen Personen, wobei Sie Staaten in der Menge sowie Personen in einem Staat nur über deren Namen ansprechen.
- Berechnen Sie die statistischen Werte aller Staaten (wie oben beschrieben).
Generizität, Arrays und vorgefertigte Container-Klassen dürfen in der Lösung dieser Aufgabe nicht verwendet werden.
Vermeiden Sie mehrfach vorkommenden Code für gleiche oder ähnliche Programmteile.
Warum die Aufgabe diese Form hat:
Diese Aufgabenstellung lässt Ihnen mehr Entscheidungsspielraum als die beiden vorangegangenen.
Die gleichzeitige Unterscheidung von Frauen und Männern sowie von Personen und Studenten stellt beispielsweise eine Schwierigkeit dar, für die es mehrere sinnvolle Lösungsansätze gibt.
Sie werden irgendeine Form von Container selbst erstellen müssen, wobei die genaue Form und Funktionalität nicht vorgegeben ist.
Da Container an mehreren Stellen benötigt werden, wäre die Verwendung von Generizität sinnvoll.
Dadurch, dass Sie Generizität nicht verwenden dürfen und trotzdem mehrfache Vorkommen ähnlichen Codes vermeiden sollen, werden Sie gezwungen, Techniken ähnlich denen einzusetzen, die der Compiler zur homogenen Übersetzung von Generizität verwendet.
Vermutlich sind Typumwandlungen kaum vermeidbar.
Sie sollen dadurch ein tieferes Verständnis des Zusammenhangs zwischen Generizität und Typumwandlungen erreichen.
Was im Hinblick auf die Beurteilung zu beachten ist:
Der Schwerpunkt bei der Beurteilung liegt auf der vernünftigen Verwendung von dynamischer und statischer Typinformation.
Kräftige Punkteabzüge gibt es für
- die Verwendung von Generizität bzw. von Arrays oder vorgefertigten Container-Klassen
- mehrfach vorkommende gleiche oder ähnliche Programmteile (wenn vermeidbar)
- den unnötigen Verlust an statischer Typsicherheit
- Verletzungen des Ersetzbarkeitsprinzips bei Verwendung von Vererbungsbeziehungen (also Vererbungsbeziehungen, die keine Untertypbeziehungen sind)
- und mangelhafte Funktionalität des Programms.
Punkteabzüge gibt es unter anderem auch für mangelhafte Zusicherungen und falsche Sichtbarkeit.
Wie die Aufgabe zu lösen ist:
Es wird empfohlen, die Aufgabe zuerst mit Hilfe von Generizität zu lösen und in einem weiteren Schritt eine homogene Übersetzung der Generizität (wie im Skriptum beschrieben) händisch durchzuführen.
Durch diese Vorgehensweise erreichen Sie eine statische Überprüfung der Korrektheit vieler Typumwandlungen und vermeiden den unnötigen Verlust an statischer Typsicherheit.
Zur Lösung dieser Aufgabe ist die Verwendung von Typumwandlungen ausdrücklich erlaubt.
Versuchen Sie trotzdem, die Anzahl der Typumwandlungen klein zu halten und so viel Typinformation wie möglich statisch vorzugeben.
Das hilft Ihnen, die Lösung überschaubar zu halten und einen unnötigen Verlust an statischer Typsicherheit zu vermeiden.
Gehen Sie auch möglichst sparsam mit dynamischen Typabfragen und Ausnahmebehandlungen um.
Achten Sie darauf, dass Sie Divisionen durch 0 vermeiden.
Führen Sie zumindest einen Testfall ein, bei dem eine statistische Auswertung ohne entsprechende Vorkehrungen eine Exception auslösen würde.
Bedenken Sie, dass es mehrere sinnvolle Lösungsansätze für diese Aufgabe gibt.
Wenn Sie einmal einen gangbaren Weg gefunden haben, bleiben Sie dabei, und vermeiden Sie es, zu viele Möglichkeiten auszuprobieren.
Das könnte Ihnen viel Zeit kosten, ohne die Lösung zu verbessern.