Interaktions- och klassdiagram, kap 12-16 F4 ht -10 Viktigt i kapitel 13 är bild 13.5 och avsnitten 13.7 och 13.8: De meddelanden som sänds från gränssnittssiktet till domänskiktet är de meddelanden som illustreras i SSD, som t.ex. enteritem. Lite om interaktionsdiagram Det finns olika sätt att rita sekvensdiagram. Här kommer två varianter där man går igenom alla element i en samling. Först ett något modifierarat sekvensdiagram från OO Systems A&D using UML av Bennett, McRobb & Farmer sid 360 2:a uppl. :Kampanj :Annonssamling :Annons listaannonser() annons=findfirst() annonstitel=gettitel() loop annons=getnext() annonstitel=gettitel() Larman har följande enklare variant: t := gettotal() :Sale linesitem[i]: SalesLineItem loop st := getsubtotal()
Mängden objekt som är involverade i en interaktion kan förändras; objekt kan skapas eller förstöras. I UML2 (till skillnad från UML1.x) finns det bara i sekvensdiagram möjlighet att explicit visa skapande och borttagande av objekt. Detta kan kanske ses som hint att kommunikationsdiagram bara skall användas för enkla interaktioner. :Univ.lektor prefekten n=getnamn() new Studierektor(n) :Studierektor destroy() Här blir en lektor befordrad till studierektor! Nu skall vi jämföra två personers ålder. new Person() p1:person new Person() jfrålder(p2) getålder() p2:person Person p1 = new Person(); Person p2 = new Person(); p1.jfrålder(p2); getålder() De interaktionsdiagram vi tittar på nu använder bara synkrona meddelanden. Vi utgår ifrån att bara ett meddelande skickas åt gången och att avsändaren väntar på svaret innan den fortsätter sina egna aktioner.
Vi diskuterar svaren på följande frågor på nästa föreläsning (F5) Övning: Rita om fig 18.7 och 18.20 som sekvensdiagram. Sekvensdiagram och kommunikationsdiagram kan beskriva liknande interaktioner, men när är det en fördel med det ena eller det andra? Vilka påståenden stämmer? I ett sekvensdiagram fås en snabb överblick över i vilken ordning meddelandena skickas. I ett kommunikationsdiagram är det lättare att få en snabb överblick över vilka objekt som samarbetar. I ett kommunikationsdiagram är det svårare att få en överblick över i vilken ordning meddelandena skickas. Sekvensdiagram är överlägset bäst att använda för uppritning på tavla, eftersom det går att expandera i alla riktningar. Semantiken och notationen i UML är mer utvecklat för att skapa kommunikationsdiagram. Vid skissning på papper eller tavla föredras sekvensdiagram eftersom det blir mycket lättare både att lägga till och ta bort objekt. Det spelar ingen som helst roll vilken sort man använder, de är precis likvärdiga. Det finns bara ett korrekt val och det är sekvensdiagram. Det är inte ovanligt att både sekvensdiagram och kommunikationsdiagram används, beroende på vad som ska visas. Numrera i vilken ordning (1, 2,..., 9) följande meddelanden skickas om de finns med i ett kommunikationsdiagram. 1: msgb 1.1: msgi 1.2: msgk 4.1: msg G 2: msgh 2.1: msgf msgz 3: msga 4: msgu Vilket eller vilka påståenden/n stämmer? Interaktionsdiagram och klassdiagram utvecklas ofta parallellt. I domänmodellen handlar det om verkliga begrepp medan designklassdiagrammet hanterar programvarubegrepp. Klassdiagram illustrerar klasser, gränssnitt och deras associationer.
Fig 15.28 som sekvensdiagram :A :B :C :D msg1 msg2 msg3 msg4 msg5 msg6 De streckade partierna visar när kod i en metod i klassen exekverar. Det innebär att när ett anrop till msg2 i klassen B sker från metoden msg1 i klassen A så går en pil till ovankanten av "lådan" på B. Numrering i kommunikationsdiagram. Titta på figur 15.28 i boken. Det första meddelandet är (normalt) onumrerat. Från A kommer två meddelanden, de numreras 1 och 2. Meddelande 1 går till B, och därifrån skickas 1.1 till C. Efter att meddelade 2:msg4 skickats till C, skickas därifrån 2.1 och 2.2.
public class Fig15_28 { public A a = new A(); public B b = new B(); public C c = new C(); public D d = new D(); public Fig15_28() { a.msg1(); public static void main (String args[]) { System.out.println( In i main ); Fig15_28 m = new Fig15_28(); class A { public void msg1() { System.out.println( In i msg1 ); System.out.println( msg2 anropas i msg1 ); b.msg2(); System.out.println( msg4 anropas i msg1 ); c.msg4(); System.out.println( Ut ur msg1 ); class B { public void msg2() { System.out.println( In i msg2 ); System.out.println( msg3 anropas i msg2 ); c.msg3(); System.out.println( Ut ur msg2 ); public void msg5() { System.out.println( In i msg5 ); System.out.println( Ut ur msg5 ); class C { public void msg3() { System.out.println( In i msg3 ); System.out.println( Ut ur msg3 ); public void msg4() { System.out.println( In i msg4 ); System.out.println( msg5 anropas i msg4 ); b.msg5(); System.out.println( msg6 anropas i msg4 ); d.msg6(); System.out.println( Ut ur msg4 ); class D { public void msg6() { System.out.println( In i msg6 ); System.out.println( Ut ur msg6 );
/*ida> java Fig15_28 In i main In i msg1 msg2 anropas i msg1 In i msg2 msg3 anropas i msg2 In i msg3 Ut ur msg3 Ut ur msg2 msg4 anropas i msg1 In i msg4 msg5 anropas i msg4 In i msg5 Ut ur msg5 msg6 anropas i msg4 In i msg6 Ut ur msg6 Ut ur msg4 Ut ur msg1 */