Aufgaben Objektentwurf (Einschub zum 5. Tutorium) Tutorium 6 13. März 2009 © Svetlana Matiouk, Uni Bonn Ferientutorien zur Vorlesung Softwaretechnologie WS 2008 6. Treffen, Aufgabe 1 Vorwärtsmodellierung Realisierung von Assoziationen • • • a) Erläutern Sie das allgemeine Prinzip, wie die entsprechende Assoziation in Java umzusetzen ist, malen Sie ein einfachstmögliches vollständiges UML‐Beispiel dazu und setzen Sie Ihr Beispiel in Java um. Unidirektionale Assoziation mit Kardinalität 1 public class Kunde { private Konto konto = null; public class Kunde { Konto konto = null; } © Svetlana Matiouk, Uni Bonn public Kunde() { konto = new Konto(); } oder public Konto getKonto() { return konto; } } Ferientutorien zur Vorlesung Softwaretechnologie WS 2008 6. Treffen, Aufgabe 1 Vorwärtsmodellierung Realisierung von Assoziationen • • • Erläutern Sie das allgemeine Prinzip, wie die entsprechende Assoziation in Java umzusetzen ist, malen Sie ein einfachstmögliches vollständiges UML‐Beispiel dazu und setzen Sie Ihr Beispiel in Java um. b) Unidirektionale 1‐zu‐N‐Assoziation public class Kunde { private Collection<Konto> konten; public Kunde() { konten = new ArrayList<Konto>(); } import java.util.Collection; public class Kunde { Collection<Konto> konten; } © Svetlana Matiouk, Uni Bonn public Collection<Konto> getKonto() { return konten; } oder public void addKonto(Konto konto) { konten.add(konto); } } Ferientutorien zur Vorlesung Softwaretechnologie WS 2008 6. Treffen, Aufgabe 1 Vorwärtsmodellierung Realisierung von Assoziationen • • • Erläutern Sie das allgemeine Prinzip, wie die entsprechende Assoziation in Java umzusetzen ist, malen Sie ein einfachstmögliches vollständiges UML‐Beispiel dazu und setzen Sie Ihr Beispiel in Java um. c) Bidirektionale 1‐zu‐1‐Assoziation. Geben Sie auch den Code der Methode(n) zum Einfügen von Elementen an! Aufgabe 1 Vorwärtsmodellierung Realisierung von Assoziationen • • • Erläutern Sie das allgemeine Prinzip, wie die entsprechende Assoziation in Java umzusetzen ist, malen Sie ein einfachstmögliches vollständiges UML‐Beispiel dazu und setzen Sie Ihr Beispiel in Java um. d) Bidirektionale 1‐zu‐N‐Assoziation. Geben Sie auch den Code der Methode(n) zum Einfügen von Elementen an! Aufgabe 1 Vorwärtsmodellierung Realisierung von Assoziationen • • • Erläutern Sie das allgemeine Prinzip, wie die entsprechende Assoziation in Java umzusetzen ist, malen Sie ein einfachstmögliches vollständiges UML‐Beispiel dazu und setzen Sie Ihr Beispiel in Java um. e) Bidirektionale N‐zu‐M‐Assoziation. Überlegen Sie sich eine Implementierung in der die in Beziehung stehenden Klassen nicht um Variablen erweitert werden und erläutern Sie das Prinzip! Aufgaben Workflows: Refactoring und Testen © Svetlana Matiouk, Uni Bonn Ferientutorien zur Vorlesung Softwaretechnologie WS 2008 6. Treffen, Aufgabe 2 Black‐Box Testen (Äquivalenzklassentests) a) b) c) Erklären Sie, was in JUnit geschieht, wenn eine JUnit‐Assertion innerhalb einer Testmethode fehlschlägt. Worin unterscheidet sich hier das Verhalten von einem „normalen“ Java‐Assert? Erläutern Sie kurz den Unterschied zwischen Blackbox‐Tests und Whitebox‐Tests. Eine Methode calcSumFromString(String input) soll getestet werden. Die Methode berechnet für einen String mit einer Addition als Inhalt die resultierende Summe und gibt diese als Integerwert zurück. Z.B.: calcSumFromString(“1+2+3+4“) = 10 d) Denken Sie sich 5 sinnvolle Tests aus und beschreiben Sie sie mit jeweils einem Satz. Tipp: Testen Sie nicht nur die Korrektheit der Methode in sinnvollen Szenarien, sondern auch die Behandlung von Fehlerfällen. © Svetlana Matiouk, Uni Bonn Ferientutorien zur Vorlesung Softwaretechnologie WS 2008 6. Treffen, Aufgabe 2 Black‐Box Testen (Äquivalenzklassentests) d) Beschreiben Sie eine Eingabe für die die obige Implementierung der Methode zu einem Fehler führt und erklären Sie welche Fehlerbehandlung hier fehlt. public static int calcSumFromString(String input){ if(input.equals("")) return 0; int result = 0; int pointer = 0; while(pointer< input.length()){ int pointer_next = nextPointer(pointer, input); String nN = input.substring(pointer, pointer_next); result+= Integer.parseInt(nN); pointer = pointer_next + 1; } return result; } private static int nextPointer(int index, String input) { while(index< input.length()){ if( input.charAt(index) == '+'){ return index; } else index++; } return input.length(); } Aufgabe 3 Whitebox Testing (Strukturtests) Gegeben sei folgende Methode doSth: public int doSth(int werte[]) { int sum = 0; // 1 for (int i = 0; i < werte.length; i++) { if (werte[i] >= 0) { sum += werte[i]; // Anweisung-Nr. // 2 // 3 // 4 // 5 // 6 }; } return sum; // 7 } Zeichnen Sie den Kontrollflussgraphen der Methode doSth. Beschriften Sie dabei auch die von den Verzeigungsknoten ausgehenden Kanten mit den dazugehörigen Bedingungen. Aufgabe 3 Whitebox Testing (Strukturtests) Lösung: Aufgabe 3 Whitebox Testing (Strukturtests) • Geben Sie ein Feld als Eingabeparameter der Methode doSth an, welches nötig ist, um eine Anweisungsüberdeckung zu erreichen. • Schreiben Sie den Pfad auf (als Sequenz der Anweisungsnummern) der für das gewählte Eingabefeld durchlaufen wird. public int doSth(int werte[]) { int sum = 0; // 1 for (int i = 0; i < werte.length; i++) { if (werte[i] >= 0) { sum += werte[i]; // 2 // 3 // 4 // 5 // 6 }; } return sum; } // Anweisung-Nr. // 7 Aufgabe 3 Whitebox Testing (Strukturtests) • Erreichen Sie mit den Eingabewerten aus b) eine Verzweigungsabdeckung? Begründen Sie kurz Ihre Antwort. Falls nicht, dann geben Sie ein weiteres Feld an, welches die noch fehlenden Verzweigungen abdeckt. Notieren Sie zum neuen Testfall wieder den Pfad (als Anweisungsfolge), welcher mit diesem Feld getestet wird. • Ist mit Ihren bisherigen Testeingaben auch eine Pfadabdeckung erreicht? Falls nicht, geben Sie die fehlenden Pfade an. public int doSth(int werte[]) { int sum = 0; // 1 for (int i = 0; i < werte.length; i++) { if (werte[i] >= 0) { sum += werte[i]; // 2 // 3 // 4 // 5 // 6 }; } return sum; } // Anweisung-Nr. // 7 Aufgabe Refactoring a) b) Erklären Sie, was man unter Refactoring versteht, und nennen Sie zwei Gründe, warum man Rafactoring anwendet! Gegeben sei die folgende Methode: Durch welches Refactoring kann die Schleife aus Zeile 17 bis 20 zu einer Methode zusammengefasst werden? Schreiben Sie die durch das Refactoring gewonnene neue Methode und die transformierte printRechnung()‐Methode auf! © Svetlana Matiouk, Uni Bonn Ferientutorien zur Vorlesung Softwaretechnologie WS 2008 6. Treffen, Aufgabe Refactoring Lösung: © Svetlana Matiouk, Uni Bonn Ferientutorien zur Vorlesung Softwaretechnologie WS 2008 6. Treffen, Aufgabe Refactoring Alternative Lösung: © Svetlana Matiouk, Uni Bonn Ferientutorien zur Vorlesung Softwaretechnologie WS 2008 6. Treffen,