Objektorientierte Programmierung
LVA 185.162, VL 2.0, 2008 W
| Ausgabe: | 30.10.2008 |
| reguläre Abgabe: | 06.11.2008, 12:45 Uhr |
| nachträgliche Abgabe: | 13.11.2008, 12:45 Uhr |
public interface Box {
// instances represent rectangular boxes
// consisting of printable characters
void print();
// writes several lines representing
// the box "this" to standard output
void setSize(int width, int height);
// 3 <= width <= 40; 3 <= height <= 10 (preconditions)
// sets the size of the frame of the box
void setFrameChar(char fc);
// the frame of the box consists of fc
}
Es werden mehrere unterschiedliche Klassen benötigt, die Untertypen von Box sein sollen:
setSize(5,4) gesetzt) und aus * besteht (im Konstruktor oder mittels setFrameChar('*') gesetzt), dann gibt print folgende Zeilen aus:
***** ***** ***** *****Der Konstruktor von BlackBox hat geeignete Parameter, um die anfängliche Größe und das anfängliche Zeichen zu bestimmen.
* sieht so aus:
***** * * * * *****Auch der Konstruktor von WhiteBox hat geeignete Parameter, um die anfängliche Größe und das anfängliche Zeichen zu bestimmen.
* und Füllzeichen | sieht so aus:
***** *|||* *|||* *****Der Konstruktor von GreyBox hat einen Parameter zum Setzen des Füllzeichens (zusätzlich zu den Parametern, die es auch in den Konstruktoren von BlackBox und WhiteBox gibt). Das Füllzeichen ist in einer bestehenden Instanz von GreyBox nicht änderbar.
Versehen Sie Ihre Klassen und Interfaces mit geeigneten Zusicherungen und stellen Sie sicher, dass Sie nur dort eine Vererbungsbeziehung verwenden, wo tatsächlich eine Untertypbeziehung (auch hinsichtlich der Zusicherungen) besteht. Zwischen je zwei Untertypen von Box soll eine Untertypbeziehung bestehen, wenn dies aufgrund der Schnittstellen und Zusicherungen möglich ist.
Schreiben Sie eine Klasse Test zum Testen Ihrer Untertypen von Box. Überprüfen Sie mittels Testfällen, ob dort, wo eine Vererbungsbeziehung besteht, die Ersetzbarkeit (bezüglich des Verhaltens) gegeben ist.
Eine Grundlage für das Auffinden der Untertypbeziehungen sind gute Zusicherungen in Form von Kommentaren. Alle wesentlichen Zusicherungen kommen bereits in obigen Beschreibungen der benötigten Klassen vor. Sie brauchen die einzelnen Beschreibungsteile nur mehr den richtigen Zusicherungsarten in den entsprechenden Teilen der Klassen zuordnen. Untertypbeziehungen ergeben sich dann fast von selbst aus den erlaubten Beziehungen zwischen Zusicherungen in Unter- und Obertypen. Es hat sich als günstig erwiesen, alle Zusicherungen, die in einem Obertyp gelten, im Untertyp nochmals hinzuschreiben, da sie sonst leicht übersehen werden, was zu schwerwiegenden Fehlern führen kann.
Vergewissern Sie sich der Korrektheit der Untertypbeziehungen zusätzlich über geeignete Testfälle. Die Anzahl der Testfälle ist nicht entscheidend, wohl aber deren Qualität: Es kommt darauf an, dass die Testfälle mögliche Verletzungen der Ersetzbarkeit aufdecken können. Beispielsweise muss überprüft werden, ob print auch nach Ersetzungen und anderen Methodenaufrufen das ausgibt, was erwartet wird.
Zusicherungen in Testklassen werden aus praktischen Überlegungen bei der Beurteilung nicht berücksichtigt.
Sorgen Sie aber bitte dafür, dass ein Aufruf von java Test einigermaßen nachvollziehbaren Output generiert.
Zur Lösung dieser Aufgabe müssen Sie Untertypbeziehungen und vor allem den Einfluss von Zusicherungen auf Untertypbeziehungen im Detail verstehen. Holen Sie sich entsprechende Informationen aus Kapitel 2 des Skriptums. Folgende zusätzlichen Informationen könnten hilfreich sein:
Nutzen Sie die für die Laborübung vorgesehene Zeit bis 6. November zur Lösung der aktuellen Aufgabe, und stellen Sie noch ausstehende Arbeiten an früheren Aufgaben vorübergehend ein. Am 6. November gibt es keine neue Aufgabe, und ab dann haben Sie eine Woche Zeit, ausstehende Arbeiten nachzuholen.
javac *.java compilierbar und durch java Test aufrufbar sein.
In Gruppe/Aufgabe4 finden Sie bereits die Datei Box.java mit dem vorgegebenen Interface. Bitte verändern Sie diese Datei nicht sinnändernd.
Es ergibt sich immer wieder das Problem, dass ein Gruppenmitglied eine Datei ohne Schreibrechte für die Gruppe in das Abgabeverzeichnis stellt und andere Gruppenmitglieder diese Datei nicht ohne weiteres ändern können.
Das passiert oft unabsichtlich beim Übertragen von Dateien.
Bitte denken Sie daran, und geben Sie Ihren Gruppenmitgliedern Lese- und Schreibrechte, z.B. durch einen Aufruf von chmod g+rw *.
Nur der Besitzer der Dateien (in der Regel derjenige, der die Dateien angelegt hat) kann dieses Kommando erfolgreich ausführen.
Falls Sie keine ausreichenden Rechte auf einer Datei haben, können Sie die Datei aufgrund Ihrer Rechte im Abgabeverzeichnis trotzdem entfernen oder (mit Leserechten) sogar ändern.
Beispielsweise können Sie die Datei mittels mv Datei .. aus dem Abgabeverzeichnis hinausschieben und (mit Leserechten) mittels cp ../Datei . eine Kopie anlegen, die Sie selbst besitzen.
Generell sollten Sie Änderungen der Struktur der Abgabeverzeichnisse vermeiden, um die automatisierte Abgabe nicht zu behindern. Sie können aber in Gruppe (jedoch nicht in Gruppe/Aufgabe?, wobei ? für eine Ziffer steht) beliebig weitere Verzeichnisse anlegen und dort beispielsweise Backups oder andere Dateien, die nicht zur Abgabe gehören, ablegen.