Objektorientierte Programmierung
LVA 185.162, VL 2.0, 2007 W
4. Übungsaufgabe
Themen:
Untertypbeziehungen, Vererbung, Sichtbarkeit, Klassen, Interfaces, Pakete
Termine:
| Ausgabe: |
08.11.2007 |
| reguläre Abgabe: |
22.11.2007, 12:45 Uhr |
| nachträgliche Abgabe: |
29.11.2007, 12:45 Uhr |
Abgabeverzeichnis:
Aufgabe4
Programmaufruf:
java Test
Grundlage:
Skriptum, die ersten zwei Kapitel.
Aufgabe
Welche Aufgabe zu lösen ist:
Entwickeln Sie in Java Teile eines optimierenden Programmiersystems.
Entwickeln Sie ein Paket datastructures
, welches zumindest Klassen und
Interfaces für folgende Zwecke enthält:
ExistsCollection
dient als Schnittstelle zu Sammlungen von
Zeichenketten (Strings) und unterstützt eine Methode zur Abfrage, ob eine
bestimmte Zeichenkette in der Sammlung enthalten ist.
InsertCollection
dient als Schnittstelle zu Sammlungen von
Zeichenketten und unterstützt eine Methode zum Einfügen von Zeichenketten.
- Eine Klasse, die zumindest diese beiden Schnittstellen implementiert.
Entwickeln Sie unter Verwendung des Pakets datastructures
ein Paket
processors
, welches Klassen und Interfaces für folgende Zwecke enthält:
- Instanzen von
IntCPU
sollen Mikroprozessoren beschreiben,
die ganze Zahlen verarbeiten können. Von einem Ganzzahlprozessor sind
die Anzahl der Befehle und die Namen (Zeichenketten) aller Befehle bekannt.
Methoden für (zumindest) diese Aufgaben sollen unterstützt werden:
- Abfrage ob ein bestimmter Befehl existiert
- Einfügen eines neuen Befehls
- Abfrage der Anzahl der Befehle
- Instanzen von
FloatCPU
sind den Instanzen von IntCPU
ähnlich und beschreiben Gleitkommaprozessoren. Zusätzlich zu
Ganzzahlbefehlen gibt es noch einen eigenen Gleitkommabefehlssatz.
Methoden für zumindest diese Aufgaben sollen unterstützt werden:
- Abfrage ob ein bestimmter Befehl existiert
- Einfügen eines neuen Ganzzahlbefehls
- Einfügen eines neuen Gleitkommabefehls
- Abfrage der Anzahl der Ganzzahlbefehle
- Abfrage der Anzahl der Gleitkommabefehle
Entwickeln Sie unter Verwendung der Pakete datastructures
und processors
ein Paket routines
, welches Klassen und Interfaces für folgende Zwecke enthält:
- Instanzen von
Routine
sollen compilierte Routinen beschreiben,
die für bestimmte Prozessoren optimiert sind. Eine Routine
hat einen Namen (Zeichenkette), eine Sammlung aller Befehle, die von dem Prozessor
unterstützt werden müssen, und die Laufzeit (ganze Zahl),
die die Routine benötigt, wenn sie auf dem Prozessor ausgefürt wird.
Methoden für zumindest diese Aufgaben sollen unterstützt werden:
- Abfrage der Laufzeit
- Abfrage der Liste der benötigten Befehle
- Es gibt eine Sammlung von Routinen. Wenn in dieser Sammlung mehrere Routinen den
gleichen Namen haben, dann müssen sie unterschiedliche Befehlsmengen besitzen.
- Instanzen von
Program
beschreiben ein Programm, welches aus den Namen
beliebig vieler Routinen besteht. Ein Routinenname kann im Programm auch mehrfach
vorkommen. Methoden für zumindest diese Aufgaben sollen unterstützt werden:
- Anfügen eines neuen Routinennamens an das Programm
- Abfrage der kleinsten Laufzeit des Programms für eine gegebene Sammlung
von Routinen und einen bestimmten Prozessor. Das heißt, es ist die Summe der
Laufzeiten der im Programm verwendeten Routinen zu bestimmen, wobei für jeden Routinennamen
im Programm die Routine mit der kleinsten Laufzeit zu verwenden ist, die nur
solche Befehle benützt, die auch vom Prozessor unterstützt werden.
Ist das Programm nicht ausführbar weil für einen im Programm vorkommenden
Routinennamen keine geeignete Routine vorhanden ist, dann soll als Laufzeit
0
zurückgegeben werden.
Entwickeln Sie ein Paket test
, das zum nicht interaktiven Testen
der Klassen und Interfaces dieser Aufgabe dient. Die wichtigsten Normal-
und Grenzfälle sollen überprüft werden, und die Testergebnisse sind in
allgemein verständlicher Form in der Standardausgabe darzustellen.
Schreiben Sie eine Klasse Test
im existierenden Ordner Aufgabe4
. Ein
Aufruf von java Test
in Aufgabe4
soll die Tests im Paket test
ausführen.
Wie die Aufgabe zu lösen ist:
Überlegen Sie genau, wo sie (abstrakte) Klassen und wo Interfaces verwenden.
Achten Sie darauf, Pakete wie oben beschrieben einzusetzen, und sorgen Sie
dafür, dass Methoden, Klassen und Interfaces nur dort sichtbar sind, wo sie
gebraucht werden. Bei den Methoden, Klassen und Interfaces, die in dieser
Aufgabenstellung beschrieben sind, ist davon auszugehen, dass sie auch
außerhalb der vorgegebenen Pakete verwendet werden sollen.
Setzen Sie Vererbung nur dort ein, wo Untertypbeziehungen bestehen. Überall,
wo Ersetzbarkeit ermöglicht werden kann, soll Ersetzbarkeit gegeben sein.
Erben Sie so viel Code wie möglich, und vermeiden Sie unnötigen Code.
Alle notwendigen Zusicherungen sollen als Kommentare im Code stehen. Vermeiden Sie
Kommentare, die keine Zusicherungen darstellen, sowie mehrdeutig formulierte
Zusicherungen. Wählen Sie stets jene Faktorisierung und jene Arten von
Zusicherungen, durch welche die Abhängigkeiten zwischen unterschiedlichen
Paketen am kleinsten sind.
Zur Lösung von Teilen dieser Aufgabe bietet sich die Verwendung von
Generizität an. Generizität wird aber erst in kommenden Vorlesungen
behandelt. Verzichten Sie daher auf die Verwendung von Generizität,
außer wenn Sie damit ausreichend Erfahrung haben und wissen, was Sie tun.
Hinweise zur Beurteilung:
Für Vererbungsbeziehungen, die keine Untertypbeziehungen sind, sowie für
nicht wahrgenommene Gelegenheiten für Untertypbeziehungen und Vererbung gibt
es kräftige Punkteabzüge. Ein Schwerpunkt bei der Beurteilung liegt auf
der richtigen Verwendung von Zusicherungen. Zusicherungen in Testklassen werden
jedoch nicht beurteilt. Für fehlende oder mißverständlich
formulierte Zusicherungen gibt es kräftige Punkteabzüge, ebenso wie
für Kommentare, die keine Zusicherungen darstellen. Die in dieser
Aufgabenstellung angeführten Eigenschaften der Klassen und Schnittstellen
dienen als Grundlage dafür, ob eine Zusicherung bei der Beurteilung als
nötig angesehen wird. Die Aufgabenstellung selbst gehört nicht zum
Programmcode. Daher dürfen Anforderungen in der Aufgabenstellung einem Leser
des Programmcodes nicht als bekannt vorausgesetzt werden. Für unnötige
Zusicherungen werden Punkte abgezogen, wenn dadurch sonst nicht benötigter
Programmcode geschrieben werden muss oder sonst mögliche Vererbungs- und
Untertypbeziehungen verhindert werden. Ein weiterer Schwerpunkt liegt auf einem
vernünftigen Einsatz von Interfaces und (abstrakten) Klassen, der korrekten
Verwendung von Paketen und einer kontrollierten Verwendung von
private
,
protected
und
public
.
Betreuung durch TutorIn:
Diese und alle folgenden Aufgaben sind von ihnen selbst zu lösen. Ihre
Tutorin bzw. Ihr Tutor wird Fragen zur Aufgabe natürlich trotzdem gerne
beantworten. Die genaue Struktur der Lösung betreffende Fragen werden aber
nur ausweichend beantwortet.
Was im Hinblick auf die Abgabe zu beachten ist:
Schreiben Sie Ihre Lösung in das bereits existierende Verzeichnis
Gruppe/Aufgabe4
. Das Programm soll von diesem Verzeichnis aus durch
java Test
aufrufbar sein. Schreiben Sie nicht mehr als eine Klasse in
jede Datei. Das Verzeichnis soll zu den Abgabezeitpunkten 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 Verzeichnissen
innerhalb von
Gruppe/Aufgabe4
, außer den zur Lösung der
Aufgabe unbedingt nötigen Verzeichnissen
datastructures
,
processors
,
routines
und
test
. Stellen Sie sicher, dass
ein Aufruf von
javac *.java
in
Gruppe/Aufgabe4
und allen
Unterverzeichnissen davon keine Fehlermeldungen liefert, da Lösungen mit
Syntaxfehlern in der Regel nicht beurteilt werden.