Objektorientierte Programmiertechniken
LVA 185.A01, VU, 3 Ects, 2012/2013 W

5. Übungsaufgabe

Themen:

Generizität, Container und Iteratoren

Termine:

Ausgabe: 14.11.2012
reguläre Abgabe: 21.11.2012, 12:00 Uhr
nachträgliche Abgabe: 28.11.2012, 12:00 Uhr

Abgabeverzeichnis:

Gruppe/Aufgabe5

Programmaufruf:

java Test

Grundlage:

Skriptum, Schwerpunkt auf den Abschnitten 3.1 und 3.2

Aufgabe

Welche Aufgabe zu lösen ist:

Entwickeln Sie in Java Klassen bzw. Interfaces entsprechend folgender Beschreibung:

Ein Aufruf von java Test soll wie gewohnt die wichtigsten Normal- und Grenzfälle überprüfen und die Ergebnisse in allgemein verständlicher Form darstellen. Anders als in bisherigen Aufgaben sind die Überprüfungen jedoch teilweise vorgegeben und in dieser Reihenfolge auszuführen:

  1. Erzeugen Sie eine Instanz von OrderedSet deren Elemente vom Typ Description sind. Fügen Sie einige Elemente in unsortierter Reihenfolge ein, lesen Sie alle Elemente der Menge über den Iterator aus, und schreiben Sie die Anzahlen der Zeilen in die Standard-Ausgabe. Führen Sie Änderungen durch und geben Sie die Elemente erneut aus. Diesen Vorgang können Sie mit unterschiedlichen Änderungen so oft wiederholen, wie es Ihnen als nötig erscheint.
  2. Erzeugen Sie eine Instanz von OrderedMap, deren Elemente vom Typ MeanElapsedTime sind und die auf Objekte vom Typ CompositeTime verweisen – nicht sehr sinnvoll, aber gut zum Testen geeignet. Fügen Sie einige Elemente und damit verbundene Objekte ein, lesen Sie alles über die Iteratoren aus, und schreiben Sie jeweils den größten Messwert (für Elemente) bzw. die kürzeste Einzelzeit (für Objekte, auf die Elemente verweisen) in die Standard-Ausgabe. Testen Sie Änderungen ähnlich wie bei Punkt 1.
  3. Falls OrderedMap mit entsprechenden Typparameterersetzungen ein Untertyp von OrderedSet ist, betrachten Sie die in Punkt 2 erzeugte Menge als Instanz von OrderedSet, fügen Sie noch einige Elemente ein, lesen Sie alle Elemente über den Iterator aus, und schreiben Sie die größten Messwerte in die Standard-Ausgabe. Falls OrderedMap kein Untertyp von OrderedSet ist, geben Sie anstelle der Testergebnisse eine Begründung dafür aus, warum zwischen diesen Typen keine Untertypbeziehung besteht.
  4. Erzeugen Sie eine Instanz von OrderedSet, deren Elemente vom Typ ElapsedTime sind. Lesen Sie alle Elemente der in Punkt 2 erzeugten (und möglicherweise in Punkt 3 erweiterten) Menge und alle Objekte, auf welche die Elemente verweisen, aus und fügen Sie diese (Instanzen von MeanElapsedTime ebenso wie von CompositeTime) in die neue Menge ein. Lesen Sie alle Elemente der neuen Menge aus, und schreiben Sie die durch count ermittelten Werte in die Standard-Ausgabe.
  5. Bei Bedarf weitere Testsfälle, die Ihnen nötig erscheinen, die Sie aber nicht in den anderen Punkten untergebracht haben.

Wie die Aufgabe zu lösen ist:

Von den oben beschriebenen Interfaces, Klassen und Methoden wird erwartet, dass sie überall verwendbar sind (außer den Daten in MeanElapsedTime und CompositeTime). Der Bereich, in dem weitere Methoden, Variablen, Klassen und Interfaces sichtbar sind, soll so klein wie möglich gehalten werden.

Alle Klassen in dieser Aufgabe sind ohne Verwendung von Arrays (außer in CompositeTime und falls gewünscht auschließlich für Testzwecke in Test), ohne vorgefertigte Container-Klassen (wie LinkedList, HashSet, etc.) und ohne vorgefertigte Iterator-Implementierungen zu lösen. Die benötigten Container und Iteratoren sind selbst zu schreiben.

Typsicherheit soll so weit wie möglich vom Compiler garantiert werden. Auf die Verwendung von Typumwandlungen (Casts) und ähnliche Techniken ist daher zu verzichten, und der Compiler darf keine Hinweise auf mögliche Probleme im Zusammenhang mit Generizität geben. Achtung: Übersetzen Sie die Klassen mittels javac -Xlint:unchecked *.java; dieses Compiler-Flag schaltet genaue Compiler-Meldungen im Zusammenhang mit Generizität ein. Andernfalls bekommen Sie auch bei schweren Fehlern vom Compiler nur eine harmlos aussehende Meldung (Note: ...). Entsprechende Überprüfungen durch den Compiler dürfen nicht ausgeschaltet werden.

Warum die Aufgabe diese Form hat:

Die Aufgabe ist so konstruiert, dass dabei einige Schwierigkeiten auftauchen, für die wir Lösungsmöglichkeiten kennengelernt haben. Beispielsweise wird gebundene Generizität benötigt.

Durch die Untertypen von ElapsedTime muss Generizität über mehrere Ebenen hinweg betrachtet werden. Vereinfachende Sichtweisen sind durch den von diesen Typen unabhängigen Typ Description ausgeschlossen. Dieser Teil der Aufgabe ist z.B. durch Verwendung von Typ-Wildcards einfach lösbar, bei falschem Ansatz aber praktisch unlösbar.

Vorgegebene Testfälle stellen sicher, dass die Schwierigkeiten erkannt werden. Um Umgehungen zu vermeiden sind Typumwandlungen verboten, und Hinweise des Compilers auf unsichere Verwendungen von Generizität dürfen nicht ausgeschaltet werden. Neben Techniken zur Lösung der speziellen Schwierigkeiten wird in dieser Aufgabe auch der Umgang mit Sichtbarkeit und Untertypbeziehungen auf generischen Typen geübt. Am Beispiel von Iteratoren soll intuitiv klar werden, welchen Einfluss die Verwendung innerer Klassen (speziell für Iteratoren) auf die Sichtbarkeit von Implementierungsdetails nach außen hat.

Was im Hinblick auf die Beurteilung wichtig ist:

Der wichtigste Schwerpunkt bei der Beurteilung liegt auf der sinnvollen und korrekten Verwendung von Generizität. Dementsprechend gibt es bedeutende Punkteabzüge, wenn der Compiler mögliche Probleme im Zusammenhang mit Generizität meldet oder wichtige Teilaufgaben nicht gelöst oder (durch Nichtbefolgung von Teilen der Aufgabenstellung) umgangen werden.

Ein zusätzlicher Schwerpunkt liegt auf dem gezielten Einsatz von Sichtbarkeit. Es gibt Punkteabzüge, wenn Programmteile, die überall sichtbar sein sollen, nicht public sind, oder Teile, die nicht für die allgemeine Verwendung bestimmt sind, unnötig weit sichtbar sind. Durch die Verwendung innerer Klassen kann das Sichtbarmachen mancher Programmteile nach außen verhindert werden.

Nach wie vor spielen auch Untertypbeziehungen und Zusicherungen eine große Rolle bei der Beurteilung.

Generell führen Abänderungen der Aufgabenstellung – beispielsweise die Verwendung von Typumwandlungen, Arrays (dort, wo sie verboten sind) oder vorgefertigten Containern und Iteratoren oder das Ausschalten von Überprüfungen durch @SuppressWarning – zu bedeutenden Punkteabzügen.

Vermeiden Sie die Verwendung von packages auch schon in Ihrem ersten Entwurf, da diese immer wieder zu Problemen bei der Übertragung und Beurteilung führen. Legen Sie im Abgabeverzeichnis keine Unterverzeichnisse an.

Complang
Puntigam
   Kontakt
   Research
   Lehre
      OOP
      Typsysteme
      EP2
      FOOP
      Prog.spr.
      frühere Lehre
         LVAs 2017 W
         LVAs 2017 S
         LVAs 2016 W
         LVAs 2016 S
         LVAs 2015 W
         LVAs 2015 S
         LVAs 2014 W
         LVAs 2014 S
         LVAs 2013 W
         LVAs 2013 S
         LVAs 2012 W
            PK
            OOP
               1. Aufgabe
               2. Aufgabe
               3. Aufgabe
               4. Aufgabe
               5. Aufgabe
               6. Aufgabe
               7. Aufgabe
               8. Aufgabe
               9. Aufgabe
            Typsysteme
         LVAs 2012 S
         LVAs 2011 W
         LVAs 2011 S
         LVAs 2010 W
         LVAs 2010 S
         LVAs 2009 W
         LVAs 2009 S
         LVAs 2008 W
         LVAs 2008 S
         LVAs 2007 W
         LVAs 2007 S
         LVAs 2006 W
         LVAs 2006 S
         LVAs 2005 W
         LVAs 2005 S
         LVAs 2004 W
         LVAs 2004 S
         LVAs 2003 W
   Links
Sitemap
Kontakt
Schnellzugriff:
Tutoren
Lehrunterlagen
vorige Aufgabe
nächste Aufgabe
Fakultät für Informatik
Technische Universität Wien
Anfang | HTML 4.01 | Datenschutzerklärung | letzte Änderung: 2012-11-14 (Puntigam)