LUNDS TEKNISKA HÖGSKOLA (5) Institutionen för datavetenskap LÖSNINGSFÖRSLAG Tentamen Objektorienterad modellering och design EDA665, 4 poäng 2003-06-03, 8.00-3.00 Anvisningar: Skrivningen består av 2 uppgifter. Uppgift -0 ger vardera 3 poäng, uppgift -2 ger vardera 5 poäng. För betyg G krävs ca 20 poäng, för betyg VG ca 30 poäng. Hjälpmedel: Bifogat blad med sammanfattning av UML-notationen.. Användningsfallsmodellen beskriver (bland annat) kraven på systemet; ritar användningsfallsdiagram (use case-diagram). Den statiska modellen beskriver systemets statiska utseende (klasser och deras relationer); ritar klassdiagram. Den dynamiska modellen beskriver systemets dynamiska uppförande (tidsberoende); ritar sekvensdiagram och eventuellt tillståndsdiagram. 2. Den främsta fördelen med iterativa metoder är att man under arbetet kan dra nytta av det som man lärt sig om systemet under tidigare iterationer. Dessutom blir det mindre att kasta bort om man upptäcker att man tidigare har tagit ett felaktigt beslut, och man har lättare att planera arbetet, osv. Icke-iterativa metoder kallas vattenfallsmodeller. 3. Användningsfallsmodellen används för att specificera kraven på systemet. Den är också till nytta när man skall planera utvecklingsarbetet, t ex för att planera iterationer. Man beskriver ett användningsfall i vanlig text. Först ger man förutsättningarna för användningsfallet, sedan ger beskriver man i tidsordning vad som händer i användningsfallet. Cash withal <<include>> Bank Customer Transfer funds <<include>> Validate customer
2(5) 4. Klassdiagram: Korg 0 {subset Frukt Banan Päron Äpple..0 0..5 5. Tillståndsdiagram AV A(på)/V-on A(av)/V-off PÅ B(av) B(på) B(av)/P-off B(på)/P-on AV2 A(på)/V-on&P-on A(av)/V-off&P-off GÖR 6. Klassdiagram: Bokare 0..* 0..* Bokning dag : int start : int slut : int nummer : int Sal namn : int platser : int ändamål : {f, ö, t 7. Klassdiagrammet beskriver hur Module implementerar interfacet Stringifiable, dvs implementerar metoden stringify(). Man ser också att klassen Printer har en association till Module, och mer specifikt, att Printer använder sig av interfaceimplementeringen i Module. 8. Javaklasser (många varianter finns naturligtvis): class Client { private Invoker invoker; public void newcommand(string cmdtext) { Command cmd; if (cmdtext.equals( X )) cmd = new XCommand(); else if (cmdtext.equals( Y )) cmd = new YCommand(); else cmd = new ZCommand(); invoker.store(cmd);
3(5) abstract class Command { public abstract void execute(); class XCommand extends Command { class YCommand extends Command { class ZCommand extends Command { class Invoker { private Command[] mycommand = new Command[000]; private int nbrcommands = 0; public void store(command cmd) { mycommand[nbrcommands] = cmd; nbrcommands++; public void docommand(int nbr) { mycommand[nbr].execute(); 9. Mönstret heter Composite. Objektdiagram :Drawing :Group :Circle :Square :Drawing :Group :Circle :Square :User
4(5) 0. Klassdiagram: Game 2 Player 2 Die GameBoard 2 0..* Square name : String position : int Expert Novice. Bristen är att ramverket här ska försöka skapa subklasser till Shape men eftersom det endast känner till den abstrakta klassen (Shape) vilken ju inte ska instantieras, så går inte det. GUI DrawingEditor 0..* Shape create(kind:string): Shape() move(dx:int, dy:int) () edit() Framework Supplied by user myeditor Circle Square create(kind:string): Shape() creates class myeditor extends DrawingEditor { Shape create(kind:string) { if (kind.equals( Circle )) return new Circle(); else if (kind.equals( Square )) return new Square(); else <felhanteringt ex return null>
5 2. Klassdiagram 0..* Room removething(:thing) Thing User Bottle Treasure Player coins:int points:int addtolifepoints(:int) addtocoins(:int) abstract class Thing { private Room currentroom; abstract void giveto(player p); class Bottle extends Thing { final private int points =?; void giveto(player p) { p.addtolifepoints(points); currentroom.removething(this); class Treasure extends Thing { final private int coins =?; void giveto(player p) { p.addtocoins(coins); currentroom.removething(this); class Player { private int coins, points; public void addtolifepoints(int p) { this.points = this.points + p; public void addtocoins(int c) { this.coins = this.coins + c; class Room { public void removething(thing t) {