Aufgabenblatt 02 - Hochschule Osnabrück

Werbung
Prof. Dr. Stephan Kleuker
Hochschule Osnabrück
Fakultät Ing.-Wissenschaften und Informatik
- Software-Entwicklung -
Komponentenbasierte Software-Entwicklung
Wintersemester 2013/14
2. Aufgabenblatt
Aufgabe 4 (5 Punkte)
Studierende wurden aufgefordert, eigene Sortieralgorithmen zu implementieren. Um diese
flexibel vergleichbar zu machen, wurde ein Interface definiert, dass von den eigenen
Sortierklassen realisiert werden soll. Das Interface sieht wie folgt aus und kann generisch
beliebige Klassen T sortieren, die das Interface Comparable<T> realisieren.
package hilfsklassen;
import java.util.List;
public interface MeinSortierer <T extends Comparable<T>>{
public List<T> sortieren(List<T> list);
}
Die Methode sortieren erhält eine Liste übergeben und soll eine sortierte Liste mit den
gleichen Objekten zurückgeben, die absteigend sortiert sind. Eine Klasse ohne
Implementierung muss damit wie folgt aussehen.
package hilfsklassen;
import java.util.ArrayList;
java.util.ArrayList;
import java.util.List;
public class Sortierer1<T extends Comparable<T>>
implements MeinSortierer<T> {
public List<T> sortieren(List<T> list) {
// hier sortieren
}
}
Von der Webseite der Lehrveranstaltung können acht Beispielimplementierungen des
Interfaces in einem Projekt geladen werden. Mit der Klasse MainSortierer zeigen die
Studierenden vermeintlich, dass zumindest einige ihrer Ideen funktionieren.
a) Überlegen Sie sich zunächst genau, wie man formalisieren kann, dass eine Liste mit
beliebigen Elementen, die geordnet werden können, durch eine Methode geordnet
wird. Schreiben Sie diese Kriterien als Text auf.
b) Überlegen Sie sich anschaulich verschiedene Szenarien, also anschauliche
Äquivalenzklassen, die eine Überprüfung des Sortierverhaltens einer Liste erlauben.
Um die Aufgabe einzuschränken, sollten Sie mindestens fünf Szenarien benennen.
c) Formulieren Sie die in b) gefundenen Testfälle für die verschiedenen Sortierer als
JUnit4-Testfälle. Welche Sortierer scheitern an welchen Testfällen?
d) [ohne Punkte, freiwillig] Die meisten der fehlerhaften Sortierer lassen sich recht
einfach korrigieren. Führen Sie diese Korrekturen, z. B. in einem eigenen EclipseProjekt, durch und testen Sie diese Lösungen.
Hinweise:
Außer zu d) müssen Sie nebenbei den genauen Programmcode nicht verstehen.
Hilfsreich kann es sein, sich um parametrisierbare Tests zu kümmern. Einige Hinweise
können
http://home.edvsz.fh-osnabrueck.de/skleuker/SS11_QS/SS11SQ_Teil01_1.pdf
(Folien 71-74) entnommen werden (muss nicht genutzt werden).
Zur Erinnerung:
Um beliebige Objekte in Java sortieren zu können, muss eine Klasse X nur das Interface
Comparable, besser Comparable<X> implementieren. Dieses Interfaces beinhaltet eine
Methode
public int compareTo(X x)
Seite 1 von 3
Prof. Dr. Stephan Kleuker
Hochschule Osnabrück
Fakultät Ing.-Wissenschaften und Informatik
- Software-Entwicklung -
Komponentenbasierte Software-Entwicklung
Wintersemester 2013/14
2. Aufgabenblatt
die, falls this kleiner als x sein soll, einen beliebigen negativen Wert, für größer einen
beliebigen positiven Wert und bei Gleichheit den int-Wert Null zurückliefern muss. Die
Methode muss eine Halbordnung definieren, was anschaulich bedeutet, dass für zwei
Objekte a und b, nur einer der drei Fälle, a kleiner b, a gleich b, a größer b, gelten darf.
Weiterhin muss aus a kleiner b immer b größer a folgen. Für eine Klasse Mitarbeiter mit
einer Objektvariablen int id können die Ergänzungen wie folgt aussehen.
public class Mitarbeiter implements Serializable, Comparable<Mitarbeiter>{
Comparable<Mitarbeiter>{
//...
@Override
public int compareTo(Mitarbeiter o) {
return o.ido.id-id;
}
Die Klasse Integer realisiert auch das Interface.
Aufgabe 5 (5 Punkte)
Über Reflection ist es möglich, fast beliebige Informationen über Klassen durch die Nutzung
von Methoden zur Programmlaufzeit zu erfahren, Objekte zu erzeugen und die Werte der
Exemplarvariablen zu verändern. Ihre Aufgabe besteht darin, für eine eingegebene Klasse
ein UML-Klassendiagramm auszugeben. Dazu müssen der Klassenname, die Namen der
Variablen mit ihren Typen und die Namen der Methoden mit ihren Parametertypen und
Rückgabetypen zusammen mit der jeweiligen Sichtbarkeit ausgegeben werden. Sollten
Exemplarvariablen von einem Collection- oder Array-Typ sein, muss Ihre Ausgabe nicht
vollständig korrekt sein. Weiterhin sind aber nur Methoden auszugeben, die innerhalb der
betrachteten Klasse deklariert und die damit nicht geerbt werden. Nutzen Sie die Methoden
zur Analyse der einzelnen Objekte und nicht deren toString()-Methode.
Auf
der
Web-Seite
finden
Sie
ein
unvollständiges
Projekt,
das
den
Nutzungsdialog, eine Ausgabeklasse und eine
Beispielklasse model.Dummy enthält. Ein
Nutzungsdialog kann wie folgt aussehen,
Eingaben sind umrandet. Ihre Ausgabe sollte
möglichst der Ausgabe auf der rechten Seite
mit
den
visualisierten
Sichtbarkeiten
entsprechen. Es sollten natürlich auch Klassen
wie java.lang.String dargestellt werden können.
Was wollen Sie?
(0) Programm beenden
(1) neue Klasse zur Analyse auswählen
1
vollständiger Klassenname: model.Dummy
Was wollen Sie?
(0) Programm beenden
(1) neue Klasse zur Analyse auswählen
0
Die Ausgabeklasse graphik.EinfachesFenster bietet die folgenden Methoden an:
Constructor Detail
EinfachesFenster
public EinfachesFenster()
Konstruktor zur Erzeugung des Fensters, das noch nicht angezeigt wird. Die Ausgabe erfolgt erst durch
den Aufruf der Methode setGroesse.
Method Detail
Seite 2 von 3
Prof. Dr. Stephan Kleuker
Hochschule Osnabrück
Fakultät Ing.-Wissenschaften und Informatik
- Software-Entwicklung -
Komponentenbasierte Software-Entwicklung
Wintersemester 2013/14
2. Aufgabenblatt
texthoehe
public int texthoehe(java.lang.String text)
Methode zur Bestimmung der Texthöhe in Pixeln in der Ausgabe.
Parameters:
text - Beispieltext, für den die Höhe geprüft werden soll (wird in dieser Implementierung nicht
genutzt)
Returns:
Höhe des aktuell genutzten Fonts in Pixeln
textbreite
public int textbreite(java.lang.String text)
Methode zur Bestimmung der Textbreite in Pixeln in der Ausgabe für den übergebenen Text.
Parameters:
text - Text, dessen Länge in Pixeln berechnet werden soll
Returns:
Länge des übergebenen Textes in Pixeln bei einer möglichen Ausgabe.
setGroesse
public void setGroesse(int breite,
int gesamthoehe)
Methode zur Festlegung der Größe des Ausgabefensters. Das Fenster wird erst nach dem erstmaligen
Aufruf dieser Methode sichtbar.
Parameters:
breite - Breite des Ausgabefensters in Pixeln
gesamthoehe - Höhe des Ausgabefensters in Pixeln
linie
public void linie(int
int
int
int
startX,
startY,
endeX,
endeY)
Methode zum Hinzufügen einer Linie. Der Ursprung (0,0) befindet sich links-oben im Fenster, X-Werte
werden nach rechts, Y- Werte nach unten größer.
Parameters:
startX - X-Ordinate des Startpunktes der Linie
startY - Y-Ordinate des Startpunktes der Linie
endeX - X-Ordinate des Endpunktes der Linie
endeY - Y-Ordinate des Endpunktes der Linie
schreibe
public void schreibe(int x,
int y,
java.lang.String text)
Methode zum Hinzufügen eines Textes, dabei wird der Text oberhalb dieses Punktes dargestellt. Der
Ursprung (0,0) befindet sich links-oben im Fenster, X-Werte werden nach rechts, Y- Werte nach unten
größer.
Parameters:
x - X-Ordinate des Ausgangspunktes des Textes (links unten)
y - Y-Ordinate des Ausgangspunktes des Textes (links unten)
text - auszugebender Text
loeschen
public void loeschen()
Methode zum Löschen der bisherigen Inhalte. Damit die Methode einen Effekt hat, muss danach
setGroesse() aufgerufen werden.
Seite 3 von 3
Herunterladen