UML klassediagrammer Erik Arisholm INF1050-klasser-1
INF1050-klasser-2
INF1050-klasser-3
Dagens forelesning o Litt mer om design med UML sekvensdiagrammer Sentralisert og delegert kontrollstil Resultater fra et eksperiment o UML klassediagrammer Notasjon: UML klassediagram og objektdiagram Metode: Fra sekvensdiagram til klassediagram INF1050-klasser-4
Metode for ansvarsdrevet OO med UML Inf1050 metoden (Iterativ): Analyse av krav (1) Identifiser aktører og deres mål (2) Lag et høynivå bruksmønsterdiagram (3) Spesifiser hvert bruksmønster tekstlig med hovedflyt og alternativ flyt Objektdesign For hvert bruksmønster: (4) Identifiser objekter og fordel ansvar mellom dem (CRC) (5) Lag sekvensdiagram for hovedflyt og viktige variasjoner (6) Lag klassediagram som tilsvarer sekvensdiagrammene (7) Lag til slutt klassediagram på systemnivå INF1050-klasser-5
Delegering av ansvar i en trelagsarkitektur Forretningsobjekter ( entity objects ) Kontrollobjekter ( control objects ) Kantobjekter ( boundary objects ) Hvor mye ansvar bør kontrollobjektene ha, og i hvilken grad bør vi bevisstgjøre forretningsobjektene våre?? INF1050-klasser-6
Hovedflyt for Meld på kurs Objektet som returneres av finnemne Objektet som returneres av Emne::finn Objektet som returneres av finn kantobjektet: Kant universitetet: Universitet emnet: Emne kurset: studenten: ok:=meldpaa(studentid, emnekode, semester) <<create>> meldpaa: MeldPaa ok:=meldpaa(studentid, emnekode, semester) Hovedflyt: 1. en velger emne 2. Systemet sjekker at studenten er kvalifisert til å ta emnet 3. Systemet finner kurset for emnet 4. Systemet sjekker om det er ledig plass på kurset 5. Systemet registrerer studenten på kurset CRC-kortene forteller deg hvilket objekt som skal motta en bestemt melding studenten:=finn(studentid) emnet:=finnemne(emnekode) forutsetter:=forutsetteremner() kurset:=finn(semester) erledigplass:=ledigplass() paameldingok:=meldpaa(studenten) ermeldtpaa(kurset) INF1050-klasser-7
Hovedflyt for Meld på kurs (Eksempel på Java kode for metoden meldpaa i en sentralisert kontrollstil) public class MeldPaa { public boolean meldpaa(string studentid, String emnekode, String semester) { } // antar at objektet universitetet er tilgjengelig: studenten = universitetet.finn(studentid); Emne emnet = universitetet.finnemne(emnekode); boolean forutsetter = emnet.forutsetteremner(); kurset = emnet.finn(semester); t boolean erledigplass = kurset.ledigplass(); boolean paameldingok = kurset.meldpaa(studenten); studenten.ermeldtpaa(kurset); return paameldingok; } INF1050-klasser-8
Hovedflyt for Meld på kurs (delegert kontrollstil: til Emne og har overtatt tt mye av ansvaret fra kontrollobjektet) kt t) kantobjektet: Kant universitetet: Ui Universitet itt emnet: kurset: studenten: Emne t ok:=meldpaa(studentid, emnekode, semester) <<create>> meldpaa: MeldPaa ok:=meldpaa(studentid, emnekode, semester) studenten:=finn(studentid) emnet:=finnemne(emnekode) ok:=meldpaa(studenten, semester) forutsetter:=forutsetteremner() kurset:=finn(semester) ok:=meldpaa(studenten) erledig:=ledigplass() ermeldtpaa(kurset) INF1050-klasser-9
Hovedflyt for Meld på kurs (Eksempel på Java kode for metoden meldpaa i en delegert kontrollstil) public class MeldPaa { } public boolean meldpaa(string studentid, String emnekode, String semester) { } // antar at objektet universitetet er tilgjengelig: studenten = universitetet.finn(studentid); Emne emnet = universitetet.finnemne(emnekode); boolean ok = emnet.meldpaa(studenten, semester); return ok; INF1050-klasser-10
Resultater fra et kontrollert eksperiment (*) Design Design 110 DC CC 100 DC CC (minutes) Mean Effort 100 90 80 70 olutions % Correct S 50 0 Undergraduate Graduate Junior Intermediate Senior Undergraduate Graduate Junior Intermediate Senior DC = Delegated Control Style CC = Centralized Control Style Totalt 158 Java-utviklere deltok, og skulle gjøre endringer på enten et DC eller et CC design alternativ for det samme systemet. Vi målte tid ( Mean Effort ) og kvalitet ( % correct solutions ) Kun seniorkonsulentene hadde klare fordeler av et delegert (DC) design * Erik Arisholm and Dag Sjøberg, Evaluating the Effect of a Delegated versus Centralized Control Style on the Maintainability of Object-Oriented Software, IEEE Transactions on Software Engineering, 2004 INF1050-klasser-11
Delegert vs sentralisert kontrollstil Sentralisert kontrollstil: o Lett å få oversikt over hva som skjer i et bruksmønster o Feilsituasjoner/variasjoner som krever tilbakemeldinger fra en aktør (via kantobjektene) kan enkelt håndteres av kontrollobjektet o Introduserer flere avhengigheter mellom kontrollobjekt og forretningsobjekter. Potensielt mindre gjenbrukbar/vedlikeholdbar kode Delegert kontrollstil: o Mer elegant objektorientert design, men: o Overdreven bruk av delegering gjør det vanskelig å få oversikt (spesielt dersom sekvensdiagrammer ikke er tilgjengelige!) o Litt mer komplisert å håndtere feilsituasjoner/variasjoner som krever tilbakemeldinger fra en aktør (siden all kommunikasjon med kantobjektene må gå via kontrollobjektene) INF1050-klasser-12
UML Klasser og objekter Klasse -attributt1 -attributt2 +metode1() #metode2( ) + betyr public - betyr private #b betyr protected t Objekt:Klasse -attributt1 aggregering = verdi -attributt2 = verdi sammensetning En klasse beskriver hva objektene vet (tilstand/attributter) og hvilke meldinger de forstår (metoder). Objektene er forekomster av klassebeskrivelsen. INF1050-klasser-13
Assosiasjoner mellom to klasser Ansatt 0..1 er tildelt 0..1 Parkeringsplass (maks en til en) Emne 1 undervises i 0..* (en til mange, g, hvor emne vet om kurs) 0* 0..* er meldt på 0* 0..* (mange til mange, hvor kurs vet om sine studenter, student vet om sine kurs ) Indikator Antall forekomster 0..1 Null eller 1 1 nøyaktig 1 n nøyaktig n 0..* 0 eller flere * 0 eller flere 1..* 1 eller flere 1..n 1 eller flere (<= n) INF1050-klasser-14
Universitet -navn +finnansatt (fødselsnr): Person +finn (fødselsnr): Person Roller 0..1 0..* arbeidsgiver ansatt 0..1 0..* studieplass student Person -navn - fødselsnr +... En person kan ha rollen som ansatt på maks ett universitet it t En person kan ha rollen som student på maks ett universitet (men Per kan godt være student på UiO og ansatt ved NTNU) rapporterer til 0..* Ansatt En ansatt rapporterer til maks en annen ansatt, som er sjef 0..1 sjef INF1050-klasser-15
Arv -navn Universitet +finnperson(fødselsnr): Person 1 0..* Person - navn - fødselsnr +... Ansatt -ansattid - stillingskode +... -studentid +... INF1050-klasser-16
Attributter eller klasser? Ansatt - ansattid - stillingskode +... Ansatt Stilling 0..* 1 - ansattid - stillingskode +... +... Ved å utvide stillingskode-attributtet til å bli en egen klasse (Stilling) kan man definere andre attributter og metoder som har spesielt med stillinger å gjøre INF1050-klasser-17
Klassediagram vs objektdiagram Emne - emnekode: String - <andre attributter> + finn (semester): + <andre metoder> 1 undervises i 0..* emnets - antallplasser: int - antallpaameldt: int - semester: String + ledigplass(): boolean + <andre metoder> Multiplisitetene i klassediagrammet forteller oss at vi kan ha emner uten kurs, men ikke kurs uten emne Inf1000 : Emne emnekode = 'Inf1000' undervises i Inf1000h07 : antallpaameldt = 311 antallplasser = 400 semester = 'v07' Inf1050 : Emne emnekode = 'Inf1050' Inf9001 : Emne emnekode = 'Inf9001' undervises i undervises i Inf1050v07 : antallpaameldt = 278 antallplasser = 300 semester = 'v07' Inf1050v08 : antallpaameldt = 299 antallplasser = 300 semester = 'v08' INF1050-klasser-18
Infostoff: Eks. på realisering i Java Emne - emnekode: String - <andre attributter> + finn (semester): + <andre metoder> 1 undervises i 0..* emnets - antallplasser: int - antallpaameldt: int - semester: String + ledigplass(): boolean + <andre metoder> emnets:hashmap Inf1050v05: Inf1050: Emne 'v05' 'v06' 'v07' 'v08' Inf1050v06: Inf1050v07: Inf1050v08: INF1050-klasser-19
Infostoff: Eks. på realisering i Java Emne - emnekode: String - <andre attributter> + finn (semester): + <andre metoder> 1 undervises i 0..* emnets tk - antallplasser: int - antallpaameldt: int - semester: String + ledigplass(): boolean + <andre metoder> public class Emne { } private String emnekode; <andre attributter>; private HashMap emnets = new HashMap(); finn(string semester) { } kurset; kurset = () emnets.get(semester); return kurset; <andre metoder> INF1050-klasser-20
Sammenhengen mellom sekvensdiagram og klassediagram Start med sekvensdiagrammet for hovedflyt: o Lag klasser for alle objektene i sekvensdiagrammet. o For hver melding til et bestemt objekt i sekvensdiagrammet: Legg til en tilsvarende metode for klassen til dette objektet. o Legg til de attributtene som hver av disse metodene trenger o Lag nødvendige assosiasjoner for at klassene skal kunne utføre sine metoder (f.eks. sende meldinger til andre objekter) For hvert sekvensdiagram for en variasjon: o Utvid klassediagrammet med nye klasser, metoder, attributter og assosiasjoner i klassediagrammet basert på meldingene i sekvensdiagrammet for variasjonen. INF1050-klasser-21
registrering bruksmønstermodell Meld på kurs Lag Emne Meld av kurs Lag administrator Betal semesteravgift Registrer eksamensresultat Skiller mellom "Emne" (f.eks. Inf1050) og "" i emnet (Inf1050 v08) Variasjon for "Lag Emne": Opprett nytt emne Variasjon for "Lag ": Opprett nytt kurs Variasjoner for "Meld på kurs": et forutsetter tt andre emner: en t må ha bestått kurs for emnene Dersom et kurs er fullt: en kan bli satt på venteliste Variasjon for "Meld av kurs": Dersom kurset var fullt: Første student på venteliste blir meldt på kurset INF1050-klasser-22
Tekstlig spesifikasjon av Meld på kurs Navn: Meld på kurs Aktør: Prebetingelse: har betalt semesteravgift Postbetingelse: er meldt på kurset eller er satt på venteliste Hovedflyt: 1. en velger emne 2. Systemet sjekker at studenten er kvalifisert til å ta emnet 3. Systemet finner kurs for emnet 4. Systemet sjekker om det er ledig plass på kurset 5. Systemet t registrerer studenten t på kurset INF1050-klasser-23
Alternativ flyt, steg 1: Emnet finnes ikke: A.1.1 Bruksmønsteret avsluttes Meld på kurs (forts.) Alternativ flyt, steg 2: Emnet forutsetter andre emner: A.2.1 Systemet sjekker at studenten har bestått kurs for emner som forutsettes Alternativ flyt, steg A.2.1: en har bestått kurs for emner som forutsettes: A.2.1.1.1 Bruksmønsteret fortsetter fra steg 3 Alternativ flyt, steg A.2.1: en har ikke bestått kurs for emner som forutsettes: A.2.1.2.1 Bruksmønsteret avsluttes Alternativ flyt, steg 3: Det holdes ikke kurs i emnet dette semesteret: A31B A.3.1 Bruksmønsteret tavsluttes Alternativ flyt, steg 4: et er fullt: A.4.1 Systemet spør om studenten ønsker å bli satt på venteliste Alternativ flyt, steg A.4.1: en ønsker å bli satt på venteliste: A.4.1.1.1 Systemet setter studenten på venteliste. A.4.2 Bruksmønsteret avsluttes INF1050-klasser-24
CRC-kort for bruksmønsteret Meld på kurs Kant <<boundary>> Kommuniserer med aktøren og kontrollobjektet MeldPaa Universitet <<entity>> Oppslagsobjekt som vet hvilke emner og studenter som finnes i systemet t Emne Emne <<entity>> Vet min emnekode Vet hvilke emner som forutsettes Vet hvordan man finner kurs i emnet Emne MeldPaa <<control>> Kontrollerer hendelses- forløpet i bruksmønsteret Meld på kurs Universitet Emne Kant <<entity>> Vet min studentid Vet hvilke kurs jeg har tatt Vet hvilke kurs jeg er meldt opp til Vet hvilke kurs jeg står på venteliste på <<entity>> Vet semesteret som (et kurs i) et bestemt emne holdes Vet antall plasser Vet hvilke studenter som er påmeldt Vet hvilke studenter som står på venteliste INF1050-klasser-25
Normal hendelsesflyt for Meld på kurs kantobjektet: Kant universitetet: Universitet emnet: Emne kurset: studenten: ok:=meldpaa(studentid, emnekode, semester) <<create>> meldpaa: MeldPaa ok:=meldpaa(studentid, d tid emnekode, semester) studenten:=finn(studentid) emnet:=finnemne(emnekode) e e(e e forutsetter:=forutsetteremner() kurset:=finn(semester) erledigplass:=ledigplass() paameldingok:=meldpaa(studenten) ermeldtpaa(kurset) INF1050-klasser-26
Klasser involvert i hovedflyt Emne Universitet Kant MeldPaa 1) Inkluder klassene du finner i sekvensdiagrammet INF1050-klasser-27
Metoder og attributter for hovedflyt Kant MeldPaa Emne - emnekode: String - antallemnerforutsettes; int +finn: + forutsetteremner: boolean Universitet + finn: t t + finnemne: Emne + meldpaa:boolean + meldpaa:boolean - antallplasser: int t - antallpaameldt: int - studentid: String - semester: String + ermeldtpaa: void + ledigplass: boolean + meldpaa: boolean 2) Inkluder metodene som ble brukt i sekvensdiagrammet 3) Inkluder attributter som metodene trenger INF1050-klasser-28
Komplett klassediagram for hovedflyt Kant MeldPaa Emne - emnekode: String - antallemnerforutsettes; int + finn: + forutsetteremner: boolean 1 0..* 1 Universitet + finn: + finnemne: Emne 1 + meldpaa:boolean + meldpaa:boolean 0..* - antallplasser: int - antallpaameldt: int - semester: String +ledigplass: boolean + meldpaa: boolean 0.. * 0..* kursdeltaker 0..* - studentid: String + ermeldtpaa: void 4) Inkluder assosiasjoner som metodene trenger (bruker eller oppretter) 5) Inkluder avhengighetspiler mellom klassene som utveksler meldinger INF1050-klasser-29
Alternativ flyt, steg 4 (kurset er fullt og studenten ønsker å sette seg på venteliste) kantobjektet: Kant universitetet: Universitet emnet: kurset: studenten: Emne ok:=meldpaa(studentid, emnekode, semester) <<create>> meldpaa: MldP MeldPaa ok:=meldpaa(studentid, emnekode, semester) studenten:=finn(studentid) emnet:=finnemne(emnekode) forutsetter:=forutsetteremner() kurset:=finn(semester) erledig:=ledigplass() [erledig==false] vilvente:=oenskerventeliste() [vilvente==true] okvent:=settventeliste(studenten) [okvent==true] erpaaventeliste(kurset) INF1050-klasser-30
Klassediagram for hovedflyt og alternativ flyt (steg 4) Kant + meldpaa:boolean + oenskerventeliste: boolean MeldPaa + meldpaa:boolean Emne -emnekode: Kd String - antallemnerforutsettes; int +finn: + forutsetteremner: boolean 1 0..* - antallplasser: int - antallpaameldt: int - semester: String + ledigplass: boolean + meldpaa: boolean + settventeliste:boolean 0..* 1 Universitet + finn: + finnemne: Emne 1 0..* 0..* 0..* kursdeltaker - studentid: String venteliste + ermeldtpaa: void + erpaaventeliste: void 0..* 0..* Legger til nye metoder og assosiasjoner for alternativ flyt INF1050-klasser-31
Alternativ flyt, steg 2 (Emnet forutsetter andre emner som studenten har bestått) kantobjektet: Kant universitetet: Universitet emnet: Emne kurset: studenten: ok:=meldpaa(studentid, emnekode, semester) <<create>> meldpaa: MeldPaa ok:=meldpaa(studentid, emnekode, semester) studenten:=finn(studentid) emnet:=finnemne(emnekode) forutsetter:=forutsetteremner() [forutsetter==true] emnene:=forutsettes() harbestaatt:=harbestaattefor(emnene) [harbestaatt==true] kurset:=finn(semester) erledigplass:=ledigplass() paameldingok:=meldpaa(studenten) ermeldtpaa(kurset) INF1050-klasser-32
Klassediagram for normal hendelsesflyt + alternativ flyt steg 2 og 4 Kant + meldpaa:boolean + oenskerventeliste: boolean MeldPaa emne som forutsettes 0..* + meldpaa:boolean Emne 0..* - emnekode: String Universitet 0..* 1 - antallemnerforutsettes; int +finn: + finn: + forutsetteremner: boolean +finnemne:emne + forutsettes: Emne[] 1 1 0..* 0..* 0..* 0..* - antallplasser: int - antallpaameldt: int 0..* kursdeltaker - studentid: String - semester: String venteliste 0..* + ldipl ledigplass: boolean + ermeldtpaa: void + meldpaa: boolean + erpaaventeliste: void 0..* 0..* + settventeliste:boolean bestått kurs + harbeståttefor:boolean Legger til nye metoder og assosiasjoner for alternativ flyt steg 2 INF1050-klasser-33
Klassediagram på systemnivå Lag Kant + meldpaa:boolean +oenskerventeliste: boolean LagEmne MeldPaa emne som forutsettes tt 0..* + meldpaa:boolean MeldAv BetalSemesteravgift RegistrerEksamensResultat Emne - emnekode: String - antallemnerforutsettes; int +finn: + forutsetteremner: boolean + forutsettes: Emne[] 1 0..* 0..* 1 Universitet + finn: + finnemne: Emne 1 0..* 0..* 0..* 0..* - antallplasser: int - antallpaameldt: int 0..* kursdeltaker - studentid: String - semester: String venteliste 0..* + ledigplass: boolean + ermeldtpaa: void + meldpaa: boolean + erpaaventeliste: void 0..* 0..* + settventeliste:boolean t t l bestått kurs + harbeståttefor:boolean De andre bruksmønstrene vil introdusere nye kontrollobjekter og evt. nye forretningsobjekter, samt nye assosiasjoner, metoder og attributter på eksisterende forretningsobjekter. Kantobjektet vil få flere metoder (antar ett kantobjekt i systemet) INF1050-klasser-34