Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "Philipp Ciechanowicz 6. Übung zu Software Engineering WS 2007/2008."—  Präsentation transkript:

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

2 1 Ü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 2 Ü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 3 Übung zu Software Engineering im WS 2007/2008 Philipp Ciechanowicz Aufgabe 14 a) und b) erster Ansatz Klassenexplosion zweiter Ansatz jedes Fahrzeug verwaltet eine Liste von Extras Nachteil: Zum Ausgeben des Fahrzeugs muss über die Liste iteriert und auf jedem Objekt toString() aufgerufen werden

5 4 Übung zu Software Engineering im WS 2007/2008 Philipp Ciechanowicz Aufgabe 14 a) und b) finaler Ansatz: Dekorierer Dekorierer 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 5 Ü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 6 Übung zu Software Engineering im WS 2007/2008 Philipp Ciechanowicz Aufgabe 14 a) und b) public abstract class Dekorierer extends Fahrzeug { protected Fahrzeug fahrzeug; public Dekorierer(Fahrzeug f) { fahrzeug = f; } // delegiert den Aufruf an das dekorierte Fahrzeug public String toString() { return fahrzeug.toString(); }

8 7 Übung zu Software Engineering im WS 2007/2008 Philipp Ciechanowicz Aufgabe 14 a) und b) public class AirbagDekorierer extends Dekorierer { public AirbagDekorierer(Fahrzeug f) { super(f); } public String toString() { return fahrzeug +, inklusive Airbag;// Delegation }

9 8 Ü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 9 Ü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 10 Ü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 } Anmerkungen Reihenfolge der Dekoration u.U. wichtig Dekorierer werden in der Java API für Streams benutzt

12 11 Ü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 Umsetzung public 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 12 Ü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 13 Ü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 14 Übung zu Software Engineering im WS 2007/2008 Philipp Ciechanowicz Aufgabe 15 a) public class Counter { private int value; // Standardkonstruktor public Counter() { value = 0; } // Getter public int getValue() { return value; } // Setter public void setValue(int value) throws IllegalArgumentException { if(value < 0) { throw new IllegalArgumentException(); } this.value = value; }

16 15 Ü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 16 Ü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 17 Übung zu Software Engineering im WS 2007/2008 Philipp Ciechanowicz Aufgabe 15 c) Entwurfsmuster: Befehl kapselt Operationen unterstützt undo

19 18 Übung zu Software Engineering im WS 2007/2008 Philipp Ciechanowicz Aufgabe 15 c) Alternative zusä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 19 Ü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ückgabetypen public Command clone() throws RuntimeException { try { return (Command)super.clone(); } catch(Exception e) { throw new RuntimeException(); }

21 20 Ü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 21 Ü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 22 Übung zu Software Engineering im WS 2007/2008 Philipp Ciechanowicz Aufgabe 15 c) Konzepte der Klasse CounterGui Vector commands speichert die ausgeführten Befehle Combobox kann beliebige Objekte aufnehmen, auch Befehle comboboxCommand.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 23 Ü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 24 Ü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 25 Übung zu Software Engineering im WS 2007/2008 Philipp Ciechanowicz Aufgabe 16 b) Anforderungen while-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 liefern sowohl der if- als auch der else- Zweig werden durchlaufen Beispiele a = {1, 3, 2} a = {2, 4, 6, 8, 0}

27 26 Ü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 x dem 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 27 Übung zu Software Engineering im WS 2007/2008 Philipp Ciechanowicz def-use-Ketten funktionieren gut für überschaubare Programme Probleme (Auswahl) Exceptions Rekursion Seiteneffekte Vorgehensweise sämtliche Variablen identifizieren, die in einer Methode vorkommen für jede Variable Quelltext mit d (def) und/oder u (use) markieren Variablen nacheinander abarbeiten def-Anweisung fixieren sämtliche use-Anweisungen aufschreiben, die erreicht werden können, ohne eine weitere use-Anweisung auszuführen nächste def-Anweisung fixieren usw.

29 28 Ü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 u u d d d

30 29 Ü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 u u d d d


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

Ähnliche Präsentationen


Google-Anzeigen