4. Design Gliederung: Einführung Anforderungsdefinition Analyse Design Klassendiagramme Regel-Diagramme <== Zetteltests Validierung Zusammenfassung Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Beispiel: Objektspiel Spielstein raussetzen Main Memory Objects Rule Diagram / Program Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
The FAMous Fujaba Abstract Machine (Teil 1) Der Befehlssatz: in den Objekten werden Kommandos / Nachrichten von vergesslichen „Object Guys“ abgearbeitet Object Guys schlafen normaler weise beim Aufwachen wird die Umgebung wird vom „Nebel des Vergessens“ verschleiert Object Guys sehen nicht was die anderen tun Jeder Object Guy hat eigenen „Namensraums“ Object Guy hat „Handlungsanweisungen“ für jedes mögliche Komando Immer ein Object Guy pro Nachricht Object Guy kann: Kanten lesen und lokale Namen für Nachbarn vergeben Attribute lesen und prüfen temporäre Werte notieren Berechnungen durchführen Nachrichten verschicken (wartet (untätig) auf Antwort) Antworten zurückschicken (und wieder einschlafen) Attribute schreiben Kanten löschen / erzeugen Objekte löschen / erzeugen Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Rule Diagrams: graphische Notation für Befehle der Fujaba Abstract Machine Main Memory Objects Rule Diagram / Program benenne this lese gehoert Link; benenne meinSp lese hat; benenne seinWuerfel prüfe augenzahl == 6 lese ist_Startfeld_von, benenne seinStart lese steht_in; benenne meinHeim lösche ist_Startfeld_von erzeuge steht_auf Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Fujaba Abstract Machine Teil 2: Zetteltest Main Memory Objects Rule Diagram / Program this meinHeim meinSp seinStart steht auf seinWuerfel Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Rule Diagram Syntax: benennen Objektkasten: class Spielstein { ... public void raussetzen () { Heimatfeld meinHeim = null; Spieler meinSp = null; Feld seinStart = null; Wuerfel seinWuerfel = null; . . . benennen: Objekttyp mit angeben ungebundene Objekte werden zu gebundenen Objekten, unbekannte Objekte werden bekannt Namen benutzen: ohne Objekttyp ACHTUNG: bei [failure] des Vorgängerschritts wurden eventuell nicht alle Variablen gebunden ! Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Rule Diagram Syntax: lese Link Link: bei zu-1 Links von bekanntem Objekt zu unbekanntem Objekt - get-Methode verwenden - Erfolg prüfen: meinSp = this.getGehoert (); if (meinSp != null) { .... oder try { ... meinSp = this.getGehoert (); JavaSDM.ensure ( meinSp != null ); ... } catch (SDMException e) { sdmSuccess = false } ... danach ist der Name zugewiesen Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Hilfsmethode JavaSDM.ensure class JavaSDM { public static void ensure (boolean expr) if (expr == false) throw new SDMException (); } Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Rule Diagram Syntax: lese Link Link: bei zu-n Links von bekanntem Objekt zu unbekanntem Objekt - iteratorOf-Methode verwenden - while Schleife bis zum Erfolg: sdmSuccess = false; ... Iterator iter = meinSp.iteratorOfSteine (); while ( !(sdmSuccess) && iter.hasNext () ) { try { stein2 = (Spielstein) iter.next (); JavaSDM.ensure ... // prüfen ob es der richtige ist sdmSuccess = true; } catch (SDMException e) { } } // while Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Rule Diagram Syntax: prüfe Attributwert Attributbedingung: sdmSuccess = false; ... try { ... seinWuerfel = meinSp.getHat (); JavaSDM.ensure ( seinWuerfel != null); JavaSDM.ensure ( seinWuerfel.getAugenzahl == 6); ... } catch (SDMException e) { } Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Rule Diagram Syntax: prüfe Link zwischen gebundenen (schon benannten) Objekten Link: Link zwischen gebundenen Objekten: JavaSDM.ensure ( meinSp.getHat () == seinWuerfel); oder bei zu-n Link: JavaSDM.ensure ( x.hasInNeighbours (y)); prüfe allgemeinen Constraint: Prüfung JavaSDM.ensure ( meinSp.noOfSteine() < w.getAugenzahl() ); Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Rule Diagram Syntax: prüfe kein Nachbar da negatives Objekt: kollege = seinStart.getBewohner(); JavaSDM.ensure ( ! (kollege.getGehoert() == meinSp)) prüfe kein Link da negativer Link: JavaSDM.ensure ( (x.getGehört() != meinSp)) Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Rule Diagram Syntax: x :C next > x :C1 y :C2 others :C3 benenne wenn möglich optionales Objekt: lese/prüfe Link wenn möglich optionaler Link: benenne alle Nachbarn Mengenobjekt : x :C next > x :C1 y :C2 others :C3 Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Rule Diagram Syntax: loesche Objekt <<destroy>>: gegener.removeYou() loesche Link <<destroy>>: this.setStehtIn (null); erzeuge Objekt <<create>>: neuStein = new SpielStein (); erzeuge Link <<create>>: this.setStehtAuf (seinStart); setze Attributwert augenzahl := 0: w.setAugenzahl (0); nachricht m1() 1: m1() meinSp.naechsterSpieler(); Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Rule Syntax: Overview Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Rule Diagrams: Kontrollfluss Activities start activity stop activities rule acitivities code activities branch activities Transitionen ohne Guard [success] [failure] [boolean condition] [else] Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel http://www.se.eecs.uni-kassel.de/se/fileadmin/se/courses/MSE/download/fujaba/FujabaTutorialStoryDrivenModeling.ppt
Rule Diagrams: for-each Activities this this lhome looser at lostCounter noPos noPos noPos Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Rule Diagrams: for-each Activities class Game { public void collectThrownCounters () { . . . Iterator looserIter = this.iteratorOfPlayers(); while (!sdmSuccess && looserIter.hasNext()) { try { sdmSuccess = false; looser = looserIter.next (); lhome = looser.getHome (); JavaSDM.ensure (lhome != null); countersIter = looser.iteratorOfCounters (); while (!sdmSuccess && countersIter.hasNext()) { try { lostCounter = countersIter.next (); JavaSDM.ensure (lostCounter.getAt() == null); sdmSuccess = true; lostCounter.setAt (lhome); } catch (SDMException e) {} } // while } catch (SDMException e) {} } // while Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Rule Diagrams: for-each Activities doppelte Activity Box anwenden so oft wie möglich [each time] transition für zusätzliche Aktionen für jeden Match [end] transition nach Abbruch [end] Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Rule Diagrams: for-each Activities class Game { public void collectThrownCounters () { . . . Iterator looserIter = this.iteratorOfPlayers(); while (!sdmSuccess && looserIter.hasNext()) { try { sdmSuccess = false; looser = looserIter.next (); lhome = looser.getHome (); JavaSDM.ensure (lhome != null); countersIter = looser.iteratorOfCounters (); while (!sdmSuccess && countersIter.hasNext()) { try { lostCounter = countersIter.next (); JavaSDM.ensure (lostCounter.getAt() == null); sdmSuccess = true; lostCounter.setAt (lhome); } catch (SDMException e) {} } // while } catch (SDMException e) {} } // while [end] Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel
Programmiermethodik SS2006 © 2005 Albert Zündorf, University of Kassel