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 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 (6) Lag klassediagram som tilsvarer sekvensdiagrammene (7) Lag til slutt klassediagram på systemnivå INF050-klasser- INF050-klasser-2 Delegering av ansvar i en trelagsarkitektur Hovedflyt for Meld på kurs Forretningsobjekter ( entity objects ) Kontrollobjekter ( control objects ) objekter ( boundary objects ) ok:=meldpaa(studentid, emnekode, semester) <<create>> meldpaa: MeldPaa ok:=meldpaa(studentid, emnekode, semester) Objektet som returneres av finn Objektet som returneres av ::finn Objektet som returneres av finn Hvor mye ansvar bør kontrollobjektene ha, og i hvilken grad bør vi bevisstgjøre forretningsobjektene våre?? 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 =finn(studentid) =finn(emnekode) forutsetter:=forutsetterr() =finn(semester) erledigplass:=ledigplass() paameldingok:=meldpaa(studenten) ermeldtpaa(kurset) INF050-klasser-3 INF050-klasser-4
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); emnet = universitetet.finn(emnekode); boolean forutsetter = emnet.forutsetterr(); kurset = emnet.finn(semester); boolean erledigplass = kurset.ledigplass(); boolean paameldingok = kurset.meldpaa(studenten); studenten.ermeldtpaa(kurset); return paameldingok; Hovedflyt for Meld på kurs (delegert kontrollstil: og har overtatt mye av ansvaret fra kontrollobjektet) ok:=meldpaa(studentid, emnekode, semester) <<create>> meldpaa: MeldPaa ok:=meldpaa(studentid, emnekode, semester) =finn(studentid) =finn(emnekode) ok:=meldpaa(studenten, semester) forutsetter:=forutsetterr() =finn(semester) ok:=meldpaa(studenten) erledig:=ledigplass() ermeldtpaa(kurset) INF050-klasser-5 INF050-klasser-6 Hovedflyt for Meld på kurs (Eksempel på Java kode for metoden meldpaa i en delegert kontrollstil) Resultater fra et kontrollert eksperiment (*) 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; Mean Effort (minutes) 0 00 90 80 70 Undergraduate Graduate Junior Intermediate Senior Design DC CC 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 % Correct Solutions 00 50 0 Design DC CC * 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-7 INF050-klasser-8
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 Klasse -attributt -attributt2 +metode() #metode2( ) UML Klasser og objekter + betyr public - betyr private # betyr protected Objekt:Klasse -attributt aggregering = verdi -attributt2 = verdi sammensetning 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) En klasse beskriver hva objektene vet (tilstand/attributter) og hvilke meldinger de forstår (metoder). Objektene er forekomster av klassebeskrivelsen. INF050-klasser-9 INF050-klasser-0 Assosiasjoner mellom to klasser Roller 0.. er tildelt 0.. undervises i Parkeringsplass (maks en til en) (en til mange, hvor emne vet om kurs) -navn +finn (fødselsnr): Person +finn (fødselsnr): Person 0.. arbeidsgiver ansatt 0.. studieplass student Person -navn - fødselsnr er meldt på (mange til mange, hvor kurs vet om sine studenter, student vet om sine kurs ) En person kan ha rollen som ansatt på maks ett universitet En person kan ha rollen som student på maks ett universitet (men Per kan godt være student på UiO og ansatt ved NTNU) Indikator Antall forekomster 0.. Null eller rapporterer til nøyaktig n nøyaktig n 0 eller flere En ansatt rapporterer til maks en annen ansatt, som er sjef * 0 eller flere..* eller flere..n eller flere (<= n) 0.. sjef INF050-klasser- INF050-klasser-2
Arv Attributter eller klasser? -navn +finnperson(fødselsnr): Person Person -navn - fødselsnr - ansattid - stillingskode -ansattid - stillingskode -studentid - ansattid Stilling - 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 INF050-klasser-3 INF050-klasser-4 Klassediagram vs objektdiagram - <andre attributter> + finn (semester): Inf000 : emnekode = 'Inf000' Inf050 : emnekode = 'Inf050' undervises i emnets + ledigplass(): boolean Multiplisitetene i klassediagrammet forteller oss at vi kan ha emner uten kurs, men ikke kurs uten emne 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' Infostoff: Eks. på realisering i Java - <andre attributter> + finn (semester): Inf050: emnets:hashmap 'v05' 'v06' 'v07' 'v08' undervises i emnets + ledigplass(): boolean Inf050v05: Inf050v06: Inf050v07: Inf050v08: INF050-klasser-5 INF050-klasser-6
Infostoff: Eks. på realisering i Java -emnekode: String - <andre attributter> + finn (semester): public class { private String emnekode; <andre attributter>; private HashMap emnets = new HashMap(); finn(string semester) { kurset; kurset = () emnets.get(semester); return kurset; <andre metoder> undervises i emnets + ledigplass(): boolean 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. INF050-klasser-7 INF050-klasser-8 registrering bruksmønstermodell Meld på kurs Lag Tekstlig spesifikasjon av Meld på kurs Navn: Meld på kurs Aktør: Meld av kurs Lag administrator Prebetingelse: har betalt semesteravgift Betal semesteravgift Registrer eksamensresultat Postbetingelse: er meldt på kurset eller er satt på venteliste Hovedflyt: 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 andre emner: en 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. 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 registrerer studenten på kurset INF050-klasser-9 INF050-klasser-20
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: A.3. Bruksmønsteret avsluttes 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 <<boundary>> Kommuniserer med aktøren og kontrollobjektet MeldPaa <<control>> Kontrollerer hendelsesforløpet i bruksmønsteret Meld på kurs CRC-kort for bruksmønsteret Meld på kurs MeldPaa <<entity>> Oppslagsobjekt som vet hvilke emner og studenter som finnes i systemet <<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 min emnekode Vet hvilke emner som forutsettes Vet hvordan man finner kurs i emnet <<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 INF050-klasser-2 INF050-klasser-22 Normal hendelsesflyt for Meld på kurs Klasser involvert i hovedflyt ok:=meldpaa(studentid, emnekode, semester) <<create>> meldpaa: MeldPaa ok:=meldpaa(studentid, emnekode, semester) =finn(studentid) MeldPaa =finn(emnekode) forutsetter:=forutsetterr() =finn(semester) erledigplass:=ledigplass() paameldingok:=meldpaa(studenten) ermeldtpaa(kurset) ) Inkluder klassene du finner i sekvensdiagrammet INF050-klasser-23 INF050-klasser-24
Metoder og attributter for hovedflyt Komplett klassediagram for hovedflyt MeldPaa - antallrforutsettes; int +finn: + forutsetterr: boolean + finn: + finn: MeldPaa - antallrforutsettes; int + finn: + forutsetterr: boolean + finn: + finn: + meldpaa:boolean + meldpaa:boolean + meldpaa:boolean + meldpaa:boolean + meldpaa: boolean - studentid: String + meldpaa: boolean kursdeltaker - studentid: String 2) Inkluder metodene som ble brukt i sekvensdiagrammet 3) Inkluder attributter som metodene trenger INF050-klasser-25 4) Inkluder assosiasjoner som metodene trenger (bruker eller oppretter) 5) Inkluder avhengighetspiler mellom klassene som utveksler meldinger INF050-klasser-26 Alternativ flyt, steg 4 (kurset er fullt og studenten ønsker å sette seg på venteliste) Klassediagram for hovedflyt og alternativ flyt (steg 4) ok:=meldpaa(studentid, emnekode, semester) <<create>> [erledig==false] vilvente:=oenskerventeliste() meldpaa: MeldPaa ok:=meldpaa(studentid, emnekode, semester) =finn(studentid) =finn(emnekode) forutsetter:=forutsetterr() =finn(semester) erledig:=ledigplass() [vilvente==true] okvent:=settventeliste(studenten) [okvent==true] erpaaventeliste(kurset) + meldpaa:boolean + oenskerventeliste: boolean MeldPaa + meldpaa:boolean -emnekode: String - antallrforutsettes; int +finn: + forutsetterr: boolean + finn: +finn: kursdeltaker - studentid: String venteliste + erpaaventeliste: void + meldpaa: boolean + settventeliste:boolean Legger til nye metoder og assosiasjoner for alternativ flyt INF050-klasser-27 INF050-klasser-28
Alternativ flyt, steg 2 (t forutsetter andre emner som studenten har bestått) Klassediagram for normal hendelsesflyt + alternativ flyt steg 2 og 4 ok:=meldpaa(studentid, emnekode, semester) <<create>> meldpaa: MeldPaa ok:=meldpaa(studentid, emnekode, semester) =finn(studentid) =finn(emnekode) forutsetter:=forutsetterr() [forutsetter==true] emnene:=forutsettes() harbestaatt:=harbestaattefor(emnene) [harbestaatt==true] =finn(semester) erledigplass:=ledigplass() paameldingok:=meldpaa(studenten) ermeldtpaa(kurset) + meldpaa:boolean + oenskerventeliste: boolean emne som forutsettes - antallrforutsettes; int +finn: + finn: MeldPaa + forutsetterr: boolean +finn: + forutsettes: [] + meldpaa:boolean kursdeltaker - studentid: String venteliste + meldpaa: boolean + erpaaventeliste: void + settventeliste:boolean bestått kurs + harbeståttefor:boolean INF050-klasser-29 Legger til nye metoder og assosiasjoner for alternativ flyt steg 2 INF050-klasser-30 Klassediagram på systemnivå Lag emne som forutsettes Lag -emnekode: String - antallrforutsettes; int +finn: + finn: + forutsetterr: boolean +finn: MeldPaa + forutsettes: [] + meldpaa:boolean + meldpaa:boolean + oenskerventeliste: boolean MeldAv kursdeltaker - studentid: String BetalSemesteravgift venteliste + meldpaa: boolean + erpaaventeliste: void + settventeliste:boolean bestått kurs + harbeståttefor:boolean RegistrerEksamensResultat 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-3