1 / 30

6. Übung zu Software Engineering

6. Übung zu Software Engineering. WS 2007/2008. Aufgabe 14.

duy
Download Presentation

6. Übung zu Software Engineering

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 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. Aufgabe 14 a) und b) • Implementieren Sie mit Hilfe eines geeigneten Strukturierungsmusters oben dargestellten Sachverhalt und begründen Sie dabei die Wahl Ihres Musters. • Überschreiben Sie in geeigneten Klassen die Methode public String toString(), die eine Beschreibung des Fahrzeugs inklusive aller Extras zurück gibt.

  4. 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 Aufgabe 14 a) und b)

  5. 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. Aufgabe 14 a) und b) publicabstractclass Fahrzeug { // muss in den Unterklassen // überschrieben werden publicabstract String toString(); // optional, siehe unten publicabstractboolean istDekorierer(); }

  7. Aufgabe 14 a) und b) publicabstractclass 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. Aufgabe 14 a) und b) publicclass AirbagDekorierer extends Dekorierer { public AirbagDekorierer(Fahrzeug f) { super(f); } public String toString() { return fahrzeug + “, inklusive Airbag“; // Delegation } }

  9. Aufgabe 14 a) und b) publicclass KlimaanlageDekorierer extends Dekorierer { public KlimaanlageDekorierer( Fahrzeug f) { super(f); } public String toString() { return fahrzeug + “, inklusive Klimaanlage“; } }

  10. Aufgabe 14 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. Aufgabe 14 c) publicclass Aufgabe14 { publicstaticvoid 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. 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 • publicint zähleDekorierer(Dekorierer d) in der Klasse Dekorierer implementieren • publicabstractboolean istDekorierer() in der Klasse Fahrzeug definieren und in den Unterklassen entsprechend implementieren (optional, spart lediglich instanceof)

  13. Aufgabe 14 publicint 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. Aufgabe 15 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. Aufgabe 15 a) publicclass Counter { privateint value; // Standardkonstruktor public Counter() { value = 0; } // Getter publicint getValue() { return value; } // Setter publicvoid setValue(int value) throws IllegalArgumentException { if(value < 0) { thrownew IllegalArgumentException(); } this.value = value; } }

  16. Aufgabe 15 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. Aufgabe 15 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. Aufgabe 15 c) • Entwurfsmuster: Befehl • kapselt Operationen • unterstützt undo

  19. 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. Aufgabe 15 c) publicabstractclass Command implements Cloneable { publicabstractvoid execute(); publicabstractvoid 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) { thrownew RuntimeException(); } } }

  21. Aufgabe 15 c) publicabstractclass CounterCommand { protectedint oldValue; protected Counter c; public CounterCommand(Counter c) { if(c == null) thrownew NullPointerException(); this.c = c; } publicvoid execute() { oldValue = c.getValue(); } publicvoid undo() { c.setValue(oldValue); } }

  22. Aufgabe 15 c) publicclass Increase extends CounterCommand { public Increase(Counter c) { super(c); } publicvoid execute() { super.execute(); c.setValue(oldValue + 1); } public String toString() { return “increase“; } }

  23. Aufgabe 15 c) • Konzepte der Klasse CounterGui • Vector<Command> 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. 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 • Erstellen Sie für die Methode maximum einen Flussgraphen. • Erstellen Sie einen Testfall, bei dem sämtliche Kanten des Flussgraphen überdeckt werden. • Ermitteln Sie für die Methode maximum sämtliche def-use-Ketten. • Sei a = {1, 3, 2}. Welche def-use-Ketten werden beim Aufruf der Methode mit diesem Parameter durchlaufen?

  25. 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. 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. 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. 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. 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] Aufgabe 16 c) d d u u d u d u u

  30. 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] Aufgabe 16 d) d d u u d u d u u

More Related