6. Übung zu software engineering
DESCRIPTION
6. Übung zu Software Engineering. WS 2007/2008. Aufgabe 14. - PowerPoint PPT PresentationTRANSCRIPT
Philipp Ciechanowicz
6. Übung zu Software Engineering
WS 2007/2008
2
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 14
Ein Fahrzeughersteller möchte zur Unterstützung seiner Produktionsprozesse eine Software entwickeln lassen, die im Wesentlichen die von ihm gefertigten Fahrzeuge verwalten soll. Zu den Produkten des Unternehmens zählen sowohl PKW als auch LKW, die ab Werk eine gewisse Ausstattung besitzen. Dem Kunden wird aller-dings die Möglichkeit geboten, die Fahrzeuge mit diver-sen Extras, wie z.B. Airbag oder Klimaanlage, zu verse-hen. Die Fahrzeuge können mit beliebig vielen Extras ausgestattet werden, wobei die Liste der Sonderaus-stattungen für die Zukunft erweiterbar sein soll.
3
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 14 a) und b)
a) Implementieren Sie mit Hilfe eines geeigneten Strukturierungsmusters oben dargestellten Sachverhalt und begründen Sie dabei die Wahl Ihres Musters.
b) Überschreiben Sie in geeigneten Klassen die Methode public String toString(), die eine Beschreibung des Fahrzeugs inklusive aller Extras zurück gibt.
4
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 14 a) und b)
erster AnsatzKlassenexplosion
zweiter Ansatzjedes Fahrzeug verwaltet eine Liste von Extras
Nachteil: Zum Ausgeben des Fahrzeugs muss über die Liste iteriert und auf jedem Objekt toString() aufgerufen werden
5
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 14 a) und b)
finaler Ansatz: DekoriererDekorierer ist ein Fahrzeug
Fahrzeuge lassen sich mit beliebig vielen Objekten dekorieren (siehe unten)
Dekorierer und Fahrzeuge flexibel erweiterbar
zum Ausgeben des Fahrzeugs wird der Methodenaufruf an das dekorierte Objekt delegiert
Aggregation meint lediglich „ist Teil von“ und keine Liste o.Ä.
6
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 14 a) und b)
public abstract class Fahrzeug {
// muss in den Unterklassen
// überschrieben werden
public abstract String toString();
// optional, siehe unten
public abstract boolean istDekorierer();
}
7
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 14 a) und b)
public abstract class Dekoriererextends Fahrzeug {
protected Fahrzeug fahrzeug;
public Dekorierer(Fahrzeug f) {fahrzeug = f;
}
// delegiert den Aufruf an das dekorierte Fahrzeugpublic String toString() {
return fahrzeug.toString();}
}
8
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 14 a) und b)
public class AirbagDekoriererextends Dekorierer {
public AirbagDekorierer(Fahrzeug f) {super(f);
}
public String toString() {return fahrzeug + “, inklusive Airbag“; // Delegation
}}
9
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 14 a) und b)
public class KlimaanlageDekorierer
extends Dekorierer {
public KlimaanlageDekorierer(
Fahrzeug f) {
super(f);
}
public String toString() {
return fahrzeug + “, inklusive Klimaanlage“;
}
}
10
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 14 c)
c) Schreiben Sie eine kurze Testmethode, die die von Ihnen implementierte Funktionalität testet. Dabei sollen Fahrzeuge mit verschiedenen Extras erzeugt sowie deren Beschreibungen auf dem Bildschirm ausgegeben werden.
11
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 14 c)
public class Aufgabe14 {
public static void main(String[] args) {Fahrzeug auto = new Auto();Fahrzeug autoAirbag = new AirbagDekorierer(auto);Fahrzeug autoKlimaanlage = new KlimaanlageDekorierer(auto);Fahrzeug autoAirbagKlimaanlage = new KlimaanlageDekorierer(new AirbagDekorierer(auto));Fahrzeug autoKlimaanlageAirbag = new AirbagDekorierer(new KlimaanlageDekorierer(auto));
System.out.println(auto); // „Auto“System.out.println(autoAirbag); // „Auto, inklusive Airbag“System.out.println(autoKlimaanlage); // „Auto, inklusive Klimaanlage“System.out.println(autoAirbagKlimaanlage); // „Auto, inklusive Airbag, inklusive Klimaanlage“System.out.println(autoKlimaanlageAirbag); // „Auto, inklusive Klimaanlage, inklusive Airbag“
}}
AnmerkungenReihenfolge der Dekoration u.U. wichtigDekorierer werden in der Java API für Streams benutzt
12
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 14
Frage: Wie kann ich die Anzahl der Objekte steuern, d.h. z.B. maximal 1 Klimaanlage oder 2 Airbags erzwingen?
Antwort: Im Muster prinzipiell nicht vorgesehen, aber Objekte sind über eine lineare Liste verschachtelt
Verschachtelung über das Attribut fahrzeug
lineare Liste im Konstruktor durchlaufen und Instanzen zählen
bei Überschreitung einer festgelegten Zahl Exception erzeugen
Umsetzungpublic int zähleDekorierer(Dekorierer d) in der Klasse Dekorierer implementieren
public abstract boolean istDekorierer() in der Klasse Fahrzeug definieren und in den Unterklassen entsprechend implementieren (optional, spart lediglich instanceof)
13
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 14
public int zähleDekorierer(Dekorierer d) {int result = 0;
if(this.getClass().equals(d.getClass())) {result = 1;
}
if(fahrzeug.istDekorierer()) {return result + ((Dekorierer)fahrzeug).zähleDekorierer(d);
}else {
return result;}
}
14
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 15 a)
a) Implementieren Sie eine Klasse Counter, das ein int-Attribut verwaltet. Die Klasse soll Methoden zum Auslesen und zum Setzen des Attributs zur Verfügung stellen. Falls das Attribut auf einen Wert < 0 gesetzt wird, soll eine Ausnahme vom Typ IllegalArgument-Exception erzeugt werden. Der Standardkonstruktor der Klasse soll die Variable mit 0 initialisieren, weitere Konstruktoren sind nicht vorgesehen.
15
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 15 a)
public class Counter {
private int value;
// Standardkonstruktorpublic Counter() { value = 0; }
// Getterpublic int getValue() { return value; }
// Setterpublic void setValue(int value) throws IllegalArgumentException {
if(value < 0) {throw new IllegalArgumentException();
}
this.value = value;}
}
16
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 15 b)
b) Entwerfen Sie eine grafische Benutzeroberfläche, die auf der Klasse Counter aufsetzt und ausschließlich aus den folgenden vier Komponenten besteht:
Eine Combobox zum Auswählen der gewünschten Operation, d.h. erhöhen, erniedrigen oder zurücksetzen.Eine Schaltfläche zum Durchführen der in der Combobox ausgewählten Operation.Eine Schaltfläche zum Annullieren der zuletzt ausgeführten Operation. Wird die Schaltfläche zweimal hintereinander betätigt, so soll sowohl die letzte als auch die vorletzte Operation annulliert werden usw. Mit der Schaltfläche sollen folglich sämtliche Operationen, die seit dem Start des Programms durchgeführt wurden, rückgängig gemacht werden können.Ein Label, das den aktuellen Wert der Variablen in der Klasse Counter anzeigt.
Eine mögliche grafische Benutzeroberfläche ist im Folgenden dargestellt, Sie sind jedoch nicht an dieses Layout gebunden.
17
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 15 c)
c) Da in Zukunft weitere Operationen für die Klasse Counter vorgesehen sind, z.B. das Verdoppeln oder Quadrieren des Werts der Variablen, muss die Implementierung durch die Wahl eines geeigneten Entwurfsmusters zukunftssicher gestaltet werden. Implementieren Sie obigen Sachverhalt unter Zuhilfenahme eines geeigneten Verhaltensmusters und begründen Sie dabei die Wahl Ihres Musters.
18
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 15 c)
Entwurfsmuster: Befehlkapselt Operationen
unterstützt undo
19
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 15 c)
Alternativezusätzliche ab-strakte Klasse CounterCommand
zieht Gemeinsam-keiten hoch
Counter c;
int oldValue;
implementiert Methoden vor
execute speichert alten Wert
undo schreibt alten Wert zurück
20
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 15 c)
public abstract class Command implements Cloneable {
public abstract void execute();
public abstract void undo();
// funktioniert seit dem JDK 1.5 durch sog. kovariante Rückgabetypenpublic Command clone() throws RuntimeException {
try {return (Command)super.clone();
}catch(Exception e) {
throw new RuntimeException();}
}
}
21
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 15 c)
public abstract class CounterCommand {
protected int oldValue;protected Counter c;
public CounterCommand(Counter c) {if(c == null) throw new NullPointerException();this.c = c;
}
public void execute() {oldValue = c.getValue();
}
public void undo() {c.setValue(oldValue);
}}
22
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 15 c)
public class Increase extends CounterCommand {
public Increase(Counter c) {super(c);
}
public void execute() {super.execute();c.setValue(oldValue + 1);
}
public String toString() {return “increase“;
}}
23
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 15 c)
Konzepte der Klasse CounterGuiVector<Command> commands speichert die ausgeführten Befehle
Combobox kann beliebige Objekte aufnehmen, auch BefehlecomboboxCommand.addItem(new Increase(counter));
einzige Stelle, die bei einem neuen Befehlt geändert werden muss!
angezeigt wird der String, der von der Methode toString() geliefert wird
beim Klick auf den Button execute wird der selektierte Befehl aus der Combobox geclont, ausgeführt und im Vektor gespeichert
Command c = ((Command)combobox.getSelectedItem()).clone();
c.execute(); commands.add(c);
beim Klick auf den Button undo wird der zuletzt ausgeführte Befehl rückgängig gemacht und aus dem Vektor entfernt
commands.elementAt(commands.size() - 1).undo();
commands.removeElementAt(commands.size() - 1);
24
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 16
Betrachten Sie die unten aufgeführte Methode maximum, die aus dem übergebenen int-Array a der Länge n > 0, n ∈ ℕ den größten Wert sucht und diesen zurückgibt
a) Erstellen Sie für die Methode maximum einen Flussgraphen.
b) Erstellen Sie einen Testfall, bei dem sämtliche Kanten des Flussgraphen überdeckt werden.
c) Ermitteln Sie für die Methode maximum sämtliche def-use-Ketten.
d) Sei a = {1, 3, 2}. Welche def-use-Ketten werden beim Aufruf der Methode mit diesem Parameter durchlaufen?
25
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 16 a)
int maximum(int[] a) { int index = 1; int max = a[0];
while(index < a.length) { if(a[index] > max) { max = a[index]; }
index = index + 1; }
return max;}
26
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 16 b)
Anforderungenwhile-Schleife muss mindestens zweimal durchlaufen werden
Länge von a ≥ 3
das Maximum darf sich nicht an Position a[0] befinden
sonst würde nur der else-Zweig durchlaufen werden
if muss einmal false liefernsowohl der if- als auch der else-
Zweig werden durchlaufen
Beispielea = {1, 3, 2}
a = {2, 4, 6, 8, 0}
27
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
def-use-Kette
Idee: Durchläuft ein Testprogramm alle def-use-Ketten, ist es sehr wahrscheinlich, dass das Programm korrekt funktioniert. Dies ist aber nicht garantiert!werden für eine Variable x betrachtet und bestehen aus
dem Namen der Variablen xdem Ausdruck, der der Variablen x einen Wert zuweist (def)dem Ausdruck, der den Wert der Variablen x benutzt (use)
Notation: [x; def; use]wichtig: zwischen einer def- und einer use-Anweisung darf keine zweite def-Anweisung vorkommen!Die Überdeckung aller Kanten im Flussgraphen bedeu-tet nicht, dass alle def-use-Ketten durchlaufen werden!
28
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
def-use-Ketten
funktionieren gut für überschaubare ProgrammeProbleme (Auswahl)
ExceptionsRekursionSeiteneffekte
Vorgehensweisesämtliche Variablen identifizieren, die in einer Methode vorkommenfür jede Variable Quelltext mit d (def) und/oder u (use) markierenVariablen nacheinander abarbeiten
def-Anweisung fixierensämtliche use-Anweisungen aufschreiben, die erreicht werden können, ohne eine weitere use-Anweisung auszuführennächste def-Anweisung fixieren usw.
29
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 16 c)
int maximum(int[] a) { int index = 1; int max = a[0];
while(index < a.length) { if(a[index] > max) { max = a[index]; }
index = index + 1; }
return max;}
[index; index = 1; index < a.length][index; index = 1; a[index] > max][index; index = 1; max = a[index]][index; index = 1; index = index + 1][index; index = index + 1; index < a.length][index; index = index + 1; a[index] > max][index; index = index + 1; max = a[index]][index; index = index + 1; index = index + 1][max; max = a[0]; a[index] > max][max; max = a[0]; return max][max; max = a[index]; a[index] > max][max; max = a[index]; return max]
d
u
u
u
uu
d
d
d
30
Übung zu Software Engineering im WS 2007/2008
Philipp Ciechanowicz
Aufgabe 16 d)
int maximum(int[] a) { int index = 1; int max = a[0];
while(index < a.length) { if(a[index] > max) { max = a[index]; }
index = index + 1; }
return max;}
[index; index = 1; index < a.length][index; index = 1; a[index] > max][index; index = 1; max = a[index]][index; index = 1; index = index + 1][index; index = index + 1; index < a.length][index; index = index + 1; a[index] > max][index; index = index + 1; max = a[index]][index; index = index + 1; index = index + 1][max; max = a[0]; a[index] > max][max; max = a[0]; return max][max; max = a[index]; a[index] > max][max; max = a[index]; return max]
d
u
u
u
uu
d
d
d