Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

30
Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008

Transcript of Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

Page 1: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

Philipp Ciechanowicz

6. Übung zu Software Engineering

WS 2007/2008

Page 2: 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.

Page 3: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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.

Page 4: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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

Page 5: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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.Ä.

Page 6: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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();

}

Page 7: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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();}

}

Page 8: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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

}}

Page 9: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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“;

}

}

Page 10: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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.

Page 11: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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

Page 12: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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)

Page 13: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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;}

}

Page 14: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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.

Page 15: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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;}

}

Page 16: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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.

Page 17: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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.

Page 18: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

18

Übung zu Software Engineering im WS 2007/2008

Philipp Ciechanowicz

Aufgabe 15 c)

Entwurfsmuster: Befehlkapselt Operationen

unterstützt undo

Page 19: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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

Page 20: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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();}

}

}

Page 21: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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);

}}

Page 22: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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“;

}}

Page 23: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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);

Page 24: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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?

Page 25: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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;}

Page 26: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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}

Page 27: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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!

Page 28: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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.

Page 29: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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

Page 30: Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008.

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