UML klassediagrammer Erik Arisholm INF050-klasser- INF050-klasser-2 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 INF050-klasser-3 INF050-klasser-4
Metode for ansvarsdrevet OO med UML Inf050 metoden (Iterativ): Analyse av krav () 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 Delegering av ansvar i en trelagsarkitektur Forretningsobjekter ( entity objects ) Kontrollobjekter ( control objects ) objekter ( boundary objects ) Hvor mye ansvar bør kontrollobjektene ha, og i hvilken grad bør vi bevisstgjøre forretningsobjektene våre?? (6) Lag klassediagram som tilsvarer sekvensdiagrammene (7) Lag til slutt klassediagram på systemnivå INF050-klasser-5 INF050-klasser-6 Hovedflyt for Meld på kurs Hovedflyt for Meld på kurs (Eksempel på Java kode for metoden meldpaa i en sentralisert kontrollstil) Objektet som returneres av finn Objektet som returneres av ::finn Objektet som returneres av finn public class MeldPaa { ok:=meldpaa(studentid, emnekode, semester) MeldPaa emnet: kurset: studenten: public boolean meldpaa(string studentid, String emnekode, String semester) { // antar at objektet universitetet er tilgjengelig: studenten = universitetet.finn(studentid); ok:=meldpaa(studentid, emnekode, semester) emnet = universitetet.finn(emnekode); Hovedflyt:. 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:=finn(emnekode) forutsetter:=forutsetterr() kurset:=finn(semester) erledigplass:=ledigplass() paameldingok:=meldpaa(studenten) ermeldtpaa(kurset) boolean forutsetter = emnet.forutsetterr(); kurset = emnet.finn(semester); t boolean erledigplass = kurset.ledigplass(); boolean paameldingok = kurset.meldpaa(studenten); studenten.ermeldtpaa(kurset); return paameldingok; INF050-klasser-7 INF050-klasser-8
Hovedflyt for Meld på kurs (delegert kontrollstil: til og har overtatt tt mye av ansvaret fra kontrollobjektet) kt t) ok:=meldpaa(studentid, emnekode, semester) MeldPaa Ui itt ok:=meldpaa(studentid, emnekode, semester) studenten:=finn(studentid) emnet:=finn(emnekode) ok:=meldpaa(studenten, semester) emnet: kurset: studenten: t forutsetter:=forutsetterr() kurset:=finn(semester) ok:=meldpaa(studenten) erledig:=ledigplass() 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); emnet = universitetet.finn(emnekode); boolean ok = emnet.meldpaa(studenten, semester); return ok; ermeldtpaa(kurset) INF050-klasser-9 INF050-klasser-0 (minutes) Mean Effort 0 00 90 80 70 Resultater fra et kontrollert eksperiment (*) Undergraduate Graduate Junior Intermediate Senior Design DC CC olutions % Correct S 00 50 0 Undergraduate Graduate Junior Intermediate Senior DC = Delegated Control Style CC = Centralized Control Style Totalt 58 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 Design DC CC 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) * 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 INF050-klasser- INF050-klasser-2
UML Klasser og objekter Assosiasjoner mellom to klasser Klasse -attributt -attributt2 +metode() #metode2( ) + betyr public - betyr private #b betyr protected t Objekt:Klasse -attributt aggregering = verdi -attributt2 = verdi sammensetning 0.. er tildelt 0.. undervises i Parkeringsplass (maks en til en) (en til mange, g, hvor emne vet om kurs) En klasse beskriver hva objektene vet (tilstand/attributter) og hvilke meldinger de forstår (metoder). 0* er meldt på 0* Indikator Antall forekomster (mange til mange, hvor kurs vet om sine studenter, student vet om sine kurs ) Objektene er forekomster av klassebeskrivelsen. 0.. Null eller nøyaktig n nøyaktig n 0 eller flere * 0 eller flere..* eller flere..n eller flere (<= n) INF050-klasser-3 INF050-klasser-4 Roller Arv -navn +finn (fødselsnr): Person +finn (fødselsnr): Person 0.. arbeidsgiver ansatt 0.. studieplass student Person -navn - fødselsnr -navn +finnperson(fødselsnr): Person 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 En ansatt rapporterer til maks en annen ansatt, som er sjef -ansattid - stillingskode -studentid 0.. sjef INF050-klasser-5 INF050-klasser-6
Attributter eller klasser? - ansattid - stillingskode Klassediagram vs objektdiagram - <andre attributter> + finn (semester): undervises i emnets + ledigplass(): boolean Multiplisitetene i klassediagrammet forteller oss at vi kan ha emner uten kurs, men ikke kurs uten emne Stilling - 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 Inf000 : emnekode = 'Inf000' Inf050 : emnekode = 'Inf050' Inf900 : emnekode = 'Inf900' undervises i undervises i undervises i Inf000h07 : antallpaameldt = 3 antallplasser = 400 semester = 'v07' Inf050v07 : antallpaameldt = 278 antallplasser = 300 semester = 'v07' Inf050v08 : antallpaameldt = 299 antallplasser = 300 semester = 'v08' INF050-klasser-7 INF050-klasser-8 Infostoff: Eks. på realisering i Java - <andre attributter> + finn (semester): undervises i emnets + ledigplass(): boolean Infostoff: Eks. på realisering i Java - <andre attributter> + finn (semester): undervises i emnets tk + ledigplass(): boolean public class { emnets:hashmap Inf050v05: private String emnekode; <andre attributter>; Inf050: 'v05' 'v06' 'v07' 'v08' Inf050v06: Inf050v07: private HashMap emnets = new HashMap(); finn(string semester) { kurset; kurset = () emnets.get(semester); return kurset; Inf050v08: <andre metoder> INF050-klasser-9 INF050-klasser-20
Sammenhengen mellom sekvensdiagram og klassediagram Start med sekvensdiagrammet for hovedflyt: registrering bruksmønstermodell Meld på kurs Lag 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 Meld av kurs Betal semesteravgift Lag Registrer eksamensresultat administrator 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. Skiller mellom "" (f.eks. Inf050) og "" i emnet (Inf050 v08) Variasjon for "Lag ": 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 INF050-klasser-2 INF050-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:. 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 Meld på kurs (forts.) Alternativ flyt, steg : t finnes ikke: A.. Bruksmønsteret avsluttes Alternativ flyt, steg 2: t forutsetter andre emner: A.2. Systemet sjekker at studenten har bestått kurs for emner som forutsettes Alternativ flyt, steg A.2.: en har bestått kurs for emner som forutsettes: A.2... Bruksmønsteret fortsetter fra steg 3 Alternativ flyt, steg A.2.: en har ikke bestått kurs for emner som forutsettes: A.2..2. Bruksmønsteret avsluttes Alternativ flyt, steg 3: Det holdes ikke kurs i emnet dette semesteret: A3B A.3. Bruksmønsteret tavsluttes Alternativ flyt, steg 4: et er fullt: A.4. Systemet spør om studenten ønsker å bli satt på venteliste Alternativ flyt, steg A.4.: en ønsker å bli satt på venteliste: A.4... Systemet setter studenten på venteliste. A.4.2 Bruksmønsteret avsluttes INF050-klasser-23 INF050-klasser-24
CRC-kort for bruksmønsteret Meld på kurs Normal hendelsesflyt for Meld på kurs <<boundary>> Kommuniserer med aktøren og kontrollobjektet MeldPaa <<entity>> Oppslagsobjekt som vet hvilke emner og studenter som finnes i systemet t <<entity>> Vet min emnekode Vet hvilke emner som forutsettes Vet hvordan man finner kurs i emnet ok:=meldpaa(studentid, emnekode, semester) MeldPaa emnet: kurset: studenten: MeldPaa <<control>> Kontrollerer hendelses- forløpet i bruksmønsteret Meld på kurs <<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 ok:=meldpaa(studentid, d tid emnekode, semester) studenten:=finn(studentid) emnet:=finn(emnekode) e e(e e forutsetter:=forutsetterr() kurset:=finn(semester) erledigplass:=ledigplass() paameldingok:=meldpaa(studenten) ermeldtpaa(kurset) INF050-klasser-25 INF050-klasser-26 Klasser involvert i hovedflyt Metoder og attributter for hovedflyt MeldPaa MeldPaa + boolean + boolean -emnekode: String - antallrforutsettes; int +finn: + forutsetterr: boolean + finn: t t + finn: t - studentid: String + ledigplass: boolean + boolean ) Inkluder klassene du finner i sekvensdiagrammet 2) Inkluder metodene som ble brukt i sekvensdiagrammet 3) Inkluder attributter som metodene trenger INF050-klasser-27 INF050-klasser-28
Komplett klassediagram for hovedflyt Alternativ flyt, steg 4 (kurset er fullt og studenten ønsker å sette seg på venteliste) emnet: kurset: studenten: MeldPaa + boolean + boolean -emnekode: String - antallrforutsettes; int + finn: + forutsetterr: boolean +ledigplass: boolean + boolean + finn: + finn: 0.. * kursdeltaker - studentid: String ok:=meldpaa(studentid, emnekode, semester) [erledig==false] vilvente:=oenskerventeliste() MldP MeldPaa ok:=meldpaa(studentid, emnekode, semester) studenten:=finn(studentid) emnet:=finn(emnekode) forutsetter:=forutsetterr() kurset:=finn(semester) erledig:=ledigplass() [vilvente==true] okvent:=settventeliste(studenten) [okvent==true] erpaaventeliste(kurset) 4) Inkluder assosiasjoner som metodene trenger (bruker eller oppretter) 5) Inkluder avhengighetspiler mellom klassene som utveksler meldinger INF050-klasser-29 INF050-klasser-30 Klassediagram for hovedflyt og alternativ flyt (steg 4) Alternativ flyt, steg 2 (t forutsetter andre emner som studenten har bestått) emnet: kurset: studenten: ok:=meldpaa(studentid, emnekode, semester) + boolean + oenskerventeliste: boolean MeldPaa + boolean -emnekode: Kd String - antallrforutsettes; int +finn: + forutsetterr: boolean + finn: + finn: kursdeltaker - studentid: String venteliste + ledigplass: boolean + erpaaventeliste: void + boolean + settventeliste:boolean MeldPaa ok:=meldpaa(studentid, emnekode, semester) studenten:=finn(studentid) emnet:=finn(emnekode) forutsetter:=forutsetterr() [forutsetter==true] emnene:=forutsettes() harbestaatt:=harbestaattefor(emnene) [harbestaatt==true] kurset:=finn(semester) erledigplass:=ledigplass() paameldingok:=meldpaa(studenten) ermeldtpaa(kurset) Legger til nye metoder og assosiasjoner for alternativ flyt INF050-klasser-3 INF050-klasser-32
Klassediagram for normal hendelsesflyt + alternativ flyt steg 2 og 4 Klassediagram på systemnivå Lag + boolean + oenskerventeliste: boolean emne som forutsettes - antallrforutsettes; int +finn: + finn: MeldPaa + forutsetterr: boolean +finn: + forutsettes: [] + boolean kursdeltaker - studentid: String venteliste + ldipl ledigplass: boolean + boolean + erpaaventeliste: void + settventeliste:boolean bestått kurs + harbeståttefor:boolean emne som forutsettes tt Lag - antallrforutsettes; int +finn: + finn: + forutsetterr: boolean + finn: MeldPaa + forutsettes: [] + boolean + boolean +oenskerventeliste: boolean MeldAv kursdeltaker - studentid: String BetalSemesteravgift venteliste + ledigplass: boolean + boolean + erpaaventeliste: void + settventeliste:boolean t t l bestått kurs + harbeståttefor:boolean RegistrerEksamensResultat Legger til nye metoder og assosiasjoner for alternativ flyt steg 2 INF050-klasser-33 De andre bruksmønstrene vil introdusere nye kontrollobjekter og evt. nye forretningsobjekter, samt nye assosiasjoner, metoder og attributter på eksisterende forretningsobjekter. objektet vil få flere metoder (antar ett kantobjekt i systemet) INF050-klasser-34