Objektorientierte Programmierung
LVA 185.162, VL 2.0, 2010 W
6. Laborübungsaufgabe
Themen:
dynamische Typinformation, homogene Übersetzung von Generizität
Termine:
| Ausgabe: |
24.11.2010 |
| reguläre Abgabe: |
01.12.2010, 13:45 Uhr |
| nachträgliche Abgabe: |
09.12.2010 (Donnerstag), 13:45 Uhr |
Abgabeverzeichnis:
Aufgabe6
Programmaufruf:
java Test
Grundlage:
Skriptum bis Seite 124, Schwerpunkt auf den Abschnitten 3.3.1 und 3.3.2
Aufgabe
Welche Aufgabe zu lösen ist:
Ein Fuhrpark besteht aus beliebig vielen Fahrzeugen.
Jedes Fahrzeug hat eine eindeutige, unveränderliche Nummer und einen Zähler für den Kilometerstand.
Es gibt Fahrzeuge mit Verbrennungsmotor und Fahrzeuge mit Elektromotor.
Fahrzeuge mit Verbrennungsmotor haben einen Zähler für den Treibstoffverbrauch, Fahrzeuge mit Elektromotor haben einen Zähler für den Stromverbrauch.
Fahrzeuge können für unterschiedliche, auch wechselnde Aufgaben eingesetzt und dazu umgerüstet werden.
Es gibt zwei Arten von Einsatzbereichen, Personenbeförderung und Lastenbeförderung:
Bei der Personenbeförderung ist die Anzahl der verfügbaren Sitzplätze (inkl. Fahrer) und bei der Lastenbeförderung ist die Größe der Ladefläche (in Quadratmeter) und die höchste zulässige Zuladung (in Kilogramm) bekannt.
Zu einem Zeitpunkt wird ein Fahrzeug höchstens für eine Art von Aufgabe eingesetzt.
Entwickeln Sie Java-Klassen bzw. Interfaces zur Darstellung von Fahrzeugen auch für unterschiedliche Einsatzarten.
Folgende Funktionalität soll unterstützt werden:
- Erzeugen eines Fahrzeuges.
- Erhöhen des Kilometerstandes.
- Auslesen des Kilometerstandes.
- Erhöhen und Auslesen des Standes des Treibstoffverbrauches (in Liter gemessen) bei Fahrzeugen mit Verbrennungsmotor.
- Erhöhen und Auslesen des Stromverbrauchs (in Kilowattstunden gemessen) bei Fahrzeugen mit Elektromotor.
- Ändern der Art des Einsatzes eines Fahrzeugs, wobei Informationen über frühere Einsätze dieses Fahrzeugs verloren gehen.
Schreiben Sie eine Klasse Fuhrpark, die Informationen über einen Fuhrpark verwaltet und statistische Auswertungen über diesen Fuhrpark ermöglicht.
Jeder Fuhrpark wird über einen eindeutigen, unveränderlichen Namen identifiziert.
Folgende Methoden sollen unterstützt werden:
- Erzeugen eines Fuhrparks.
- Einfügen von Fahrzeugen in einen Fuhrpark.
- Entfernen von Fahrzeugen aus einem Fuhrpark.
- Ändern der Informationen über Fahrzeuge wie oben beschrieben.
- Methoden zum Berechnen folgender statistischer Werte:
- Der durchschnittliche Treibstoffverbrauch pro Kilometer eines Fahrzeugs mit Verbrennungsmotor für alle Fahrzeuge eines Fuhrparks und zusätzlich aufgeschlüsselt nach den Einsatzarten (Personen- oder Lastenbeförderung).
- Der durchschnittliche Stromverbrauch pro Kilometer eines Fahrzeugs mit Elektromotor für alle Fahrzeuge eines Fuhrparks und zusätzlich aufgeschlüsselt nach den Einsatzarten (Personen- oder Lastenbeförderung).
- Die durchschnittliche Sitzanzahl aller Fahrzeuge zur Personenbeförderung insgesamt und aufgeschlüsselt nach Fahrzeugen mit Verbrennungsmotor und Elektromotor.
- Die durchschnittliche Größe der Ladefläche aller Fahrzeuge zur Lastenbeförderung insgesamt und aufgeschlüsselt nach Fahrzeugen mit Verbrennungsmotor und Elektromotor.
Die Klasse Test soll die wichtigsten Normal- und Grenzfälle (nicht interaktiv) überprüfen und die Ergebnisse in allgemein verständlicher Form in der Standardausgabe darstellen.
Machen Sie unter anderem Folgendes:
- Erstellen Sie eine Menge von Fuhrparks von jeweils einigen Fahrzeugen – wirklich eine Menge von Fuhrparks, nicht nur eine Ansammlung einzelner Variablen.
Jeder Fuhrpark in der Menge soll über seinen eindeutigen Namen angesprochen werden können, und jedes Fahrzeug eines Fuhrparks über seine eindeutige Nummer.
- Fügen Sie zu einigen Fuhrparks einzelne Fahrzeuge hinzu, entfernen Sie einzelne Fahrzeuge, und ändern Sie die Informationen zu einzelnen Fahrzeugen, wobei Sie Fuhrparks und Fahrzeuge nur über deren Nummern und Namen ansprechen.
- Berechnen Sie die statistischen Werte aller Fuhrparks (wie oben beschrieben).
Generizität, Arrays und vorgefertigte Container-Klassen dürfen zur 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 Elektrofahrzeugen und Fahrzeugen mit Verbrennungsmotor sowie zwischen unterschiedlichen Beförderungsarten 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 bekommen.
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 dabei, 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.
Die Art der Verwendung eines Fahrzeugs für verschiedene Beförderungszwecke kann sich im Laufe der Zeit ändern.
Am besten stellt man solche Beziehungen über Rollen dar:
Für jede Art von Fahrzeugen gibt es eine eigene Klasse mit den für die jeweilige Art typischen Daten, und ein gemeinsamer Obertyp ermöglicht den Zugriff auf diese Daten auf einheitliche Weise.
In jedem Fahrzeug gibt es einen Zeiger auf die aktuelle Art der Beförderung (= die Rolle, die das Fahrzeug gerade spielt).
Wenn sich die Art ändert, braucht nur dieser Zeiger neu gesetzt zu werden.
Durch geschickte Auswahl der Methoden einer Rolle sind die meisten Fallunterscheidungen vermeidbar, das heißt, Fallunterscheidungen werden durch dynamisches Binden ersetzt.
Was im Hinblick auf die Abgabe zu beachten ist:
Verzichten Sie auch bei der Lösung dieser Aufgabe auf die Verwendung von packages und Verzeichnissen innerhalb des Abgabeverzeichnisses
Gruppe/Aufgabe6.
Schreiben Sie (abgesehen von geschachtelten Klassen) nicht mehr als eine Klasse in jede Datei.