Objektorientierte Programmierung
LVA 185.162, VL 2.0, 2008 W
7. Übungsaufgabe
Themen:
kovariante Probleme, Untertypen, (mehrfaches) dynamisches Binden
Termine:
| Ausgabe: |
27.11.2008 |
| reguläre Abgabe: |
04.12.2008, 12:45 Uhr |
| nachträgliche Abgabe: |
11.12.2008, 12:45 Uhr |
Abgabeverzeichnis:
Gruppe/Aufgabe7
Programmaufruf:
java Test
Grundlage:
Skriptum bis Seite 134
Aufgabe
Welche Aufgabe zu lösen ist:
Entwickeln Sie einen Teil einer Datensicherungsanwendung zum Umgang mit freiem Platz auf Speichermedien.
In der abstrakten Klasse oder dem Interface
Memory werden folgende Methoden benötigt:
- available gibt die Größe des noch freien Speichers zurück.
- use reduziert die Größe des noch freien Speichers um den im Argument angegebenen Betrag.
Es werden einige Unterklassen von
Memory benötigt, die unterschiedliche Speicherarten darstellen:
- HardDisc ist eine Festplatte bei der das Speichermedium nicht gewechselt werden kann.
- DVDDrive ist ein fest eingebautes Laufwerk mit wechselbaren Speichermedien verschiedener Typen (DVD+RW, DVD-R, CD-RW, etc.).
Durch einen Aufruf von load wird ein geeignetes Speichermedium zugreifbar, nach einem Aufruf von unload ist es nicht mehr zugreifbar.
- BlueRayDrive ist auch ein fest eingebautes Laufwerk mit wechselbaren Speichermedien.
Als Speichermedium können neben den meisten Speichermedien, mit denen auch DVDDrive umgehen kann, BlueRay-Discs verwendet werden.
Eine CD-RW ist jedoch nicht verwendbar.
Ebenso wie für DVDDrive ist ein Speichermedium von einem Aufruf von load bis zu einem Aufruf von unload zugreifbar, sofern das Speichermedium in das Laufwerk passt.
- USBPort ist ein fest eingebauter Port, an den verschiedene Speichermedien angeschlossen werden können.
Durch einen Aufruf von plugIn wird das Speichermedium zugreifbar, und nach einem Aufruf von plugOut ist es nicht mehr zugreifbar.
- USBDrive ist ein an einen USBPort anschließbares Laufwerk, das mit denselben Speichermedien wie DVDDrive umgehen kann.
Vor Zugriffen muss mittels plugIn das Laufwerk und dann mittels load ein Speichermedium zugreifbar gemacht werden.
Nach plugOut bzw. unload ist das Laufwerk bzw. das Speichermedium nicht mehr zugreifbar.
Aufrufe von load und unload sind nur möglich, wenn das Laufwerk zugreifbar ist.
Falls vor einem Aufruf von plugOut das Speichermedium im Laufwerk noch zugreifbar war, wird dieses ebenso wie das Laufwerk nicht mehr zugreifbar gemacht.
- Speichermedien, auf die nur über ein Laufwerk oder über einen Port zugegriffen werden kann, wie z.B. USB-Stick, DVD+RW, DVD-R, CD-RW und BlueRay-Disc, sind auch Unterklassen von Memory.
Zur Vereinfachung der Aufgabe reicht es, wenn nur zwischen vier Arten solcher Medien unterschieden wird:
- solche, auf die über einen USBPort zugegriffen werden kann,
- solche, auf die nur über ein BlueRayDrive zugegriffen werden kann,
- solche, auf die nur über ein DVDDrive und USBDrive zugegriffen werden kann,
- und solche, auf die über ein BlueRayDrive, DVDDrive und USBDrive zugegriffen werden kann.
Eine Instanz von
HardDisc ist immer zugreifbar, und es braucht nicht überprüft werden, ob das Speichermedium geeignet ist.
Bei anderen Speichermedien sind Kontrollen nötig.
Für diesen Zweck hat jeder Untertyp von
Memory außer den fest eingebauten (
HardDisc,
USBPort,
DVDDrive und
BlueRayDrive) eine Methode
getId, die eine eindeutige Bezeichnung der Art des Speichers oder Laufwerks zurückgibt.
Die Methoden
plugIn und
load nehmen entsprechende Überprüfungen vor und geben nötigenfalls Fehlermeldungen aus.
Die Methoden
available und
use geben eine Fehlermeldung aus, wenn ein Laufwerk kein geeignetes Speichermedium geladen hat.
Die Klasse Test soll wie üblich die wichtigsten Normal- und Grenzfälle überprüfen und die Ergebnisse in allgemein verständlicher Form in der Standardausgabe darstellen.
Simulieren Sie am besten einen vereinfachten Computer mit mehreren fest eingebauten Instanzen von Memory, der wiederholt den freien Speicher überprüft und neuen Speicher anfordert, und testen Sie diesen Computer durch Hinzufügen und Entfernen von wechselbaren Speichermedien.
Lösen Sie die Aufgabe ohne Typumwandlungen und ohne dynamische Typabfragen.
Warum die Aufgabe diese Form hat:
Wie die letzte Aufgabe lässt Ihnen diese Aufgabe viel Entscheidungsspielraum, vor allem für die Gestaltung der Untertypbeziehungen zwischen den Untertypen von
Memory.
Es gibt mehrere sinnvolle Lösungsvarianten.
Die Form der Aufgabe legt die Verwendung kovarianter Eingangsparametertypen nahe, die aber tatsächlich nicht unterstützt werden.
Diese Einschränkung wirkt sich auf die Untertypbeziehungen aus.
Vielleicht erleichtert mehrfaches dynamisches Binden (durch simulierte Multi-Methoden bzw. das Visitor-Pattern) an der einen oder anderen Stelle die Lösung der Aufgabe.
Alternative Techniken, die auf Typumwandlungen und dynamischen Typabfragen beruhen, sind ausdrücklich verboten.
Anders als bei den beiden vorangegangenen Aufgaben gibt es keine vorgeschriebenen Testfälle, die zur Selbstkontrolle genutzt werden könnten.
Was im Hinblick auf die Beurteilung zu beachten ist:
Schwerpunkte bei der Beurteilung liegen auf der Entwicklung geeigneter Untertypbeziehungen und dem sinnvollen Einsatz (mehrfachen) dynamischen Bindens zur Vermeidung von Typumwandlungen und dynamischen Typabfragen.
Kräftige Punkteabzüge gibt es für
- die Verwendung von Typumwandlungen oder dynamischen Typabfragen,
- Verletzungen des Ersetzbarkeitsprinzips (also Vererbungsbeziehungen, die keine Untertypbeziehungen sind)
- und nicht der Aufgabenstellung entsprechende oder falsche Funktionalität des Programms.
Punkteabzüge gibt es unter anderem auch für mangelhafte Zusicherungen, schlecht gewählte Sichtbarkeit und unzureichendes Testen.
Wie die Aufgabe zu lösen ist:
Vermeiden Sie Typumwandlungen oder dynamische Typabfragen von Anfang an, da es schwierig ist, diese aus einem bestehenden Programm zu entfernen.
Akzeptieren Sie in einem ersten Entwurf eher kovariante Eingangsparametertypen und lösen Sie diese mithilfe von Techniken, die wir in der Vorlesung kennengelernt haben, auf.
Halten Sie die Anzahl der Klassen, Interfaces und Methoden möglichst klein und überschaubar.
Durch die Aufgabenstellung ist eine große Anzahl an Klassen ohnehin kaum vermeidbar, und durch weitere unnötige Strukturierung oder Funktionalität könnten Sie bald den Überblick verlieren.
Vermeiden Sie in diesem Zusammenhang auch Exceptions.
Einfachheit ist gerade bei der Lösung dieser Aufgabe ein großer Pluspunkt.
Wie in der letzten Aufgabe gibt es mehrere sinnvolle Lösungsansätze.
Bleiben Sie bei dem ersten von Ihnen gewählten sinnvollen Ansatz und probieren Sie nicht zuviel herum, damit Ihnen nicht die Zeit davonläuft.