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