Dagens forelesning o Kort repetisjon av kravspesifikasjon med UML Fra krav til objekter Hva skal systemet gjøre? UML: Bruksmønstermodeller (Use Cases) o Objektdesign Ansvarsdrevet OO: CRC og UML Sekvensdiagrammer Hvordan skal systemet fungere? Tre typer objekter CRC: Hvordan finne gode objekter? UML: Sekvensdiagrammer INF1050-ansvar-1 INF1050-ansvar-2 registrering g bruksmønstermodell Spesifikasjon av Lag emne Meld på kurs Meld av kurs Betal semesteravgift Lag Lag Registrer eksamensresultat Skiller mellom "" (f.eks. Inf1050) og "" i emnet (Inf1050 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 administrator Navn: Lag emne Aktør: administrator Hovedflyt: 1. administrator velger emnekode 2. Systemet finner emnet 3. administratoren oppdaterer beskrivelsen av emnet (her kan det være mange underpunkter og variasjoner, for eksempel registrering av hvilke andre emner som forutsettes) 4. Systemet registrerer den nye informasjonen Alternativ flyt, steg 2: koden eksisterer ikke: A.1.1. Systemet spør om nytt emne skal opprettes og oppretter i så fall nytt emne med gitt emnekode (dvs, Nytt emne er en variasjon over Lag emne ) Relatert informasjon: Pga behov for historikk og avhengighet til kurs kan man ikke slette emner, men det bør være mulig å definere at et nytt emne erstatter et gammelt emne under punkt 3. INF1050-ansvar-3 INF1050-ansvar-4
Tekstlig spesifikasjon av Meld på kurs Navn: Meld på kurs Aktør: Prebetingelse: har betalt semesteravgift Postbetingelse: kurset eller er satt på venteliste Hovedflyt: 1. en t 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 Meld på kurs (forts.) Alternativ flyt, steg 1: t finnes ikke: A.1.1 Bruksmønsteret avsluttes Alternativ flyt, steg 2: t 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 ti flyt, steg 3: Det holdes ikke kurs i emnet dette semesteret: t A.3.1 Bruksmønsteret avsluttes 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-ansvar-5 INF1050-ansvar-6 Metode for ansvarsdrevet OO Inf1050 metoden (Iterativ): Analyse av krav (1) Identifiser aktører og deres mål (2) Lag et høynivå bruksmønsterdiagram (3)S Spesifiser hvert tbruksmønster tekstlig tli med hovedflyt og alternativ flyt Objektdesign For hvert bruksmønster: Hva er et objekt Et objekt er en representasjon av en virkelig ting. Et objekt har en entydig identitet, en indre tilstand, og evnen til å reagere på meldinger utenfra. Et objekt har altså liv. I modeller er alt mulig - også å bevisstgjøre i utgangspunktet døde ting som innsjøer, veier, kommuner, firmaer, lån... (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-ansvar-7 INF1050-ansvar-8
Det bevisste lån Utfordringen i å lage OO-modeller Et låneobjekt kan f.eks. o kjenne til sin egen saldo, rentefot, forfallsdatoer osv. o forrente seg selv o purre på avdrag o akseptere innbetalinger lån Hei, du har glemt å betale avdraget! Gitt et sett bruksmønstre: Hvordan finne de riktige objektene og fordele ansvar mellom dem slik at bruksmønstrene blir realisert! INF1050-ansvar-9 INF1050-ansvar-10 Hvordan finne objekter? Tre typer objekter Forretningsobjekter ( entity objects ) Ta først utgangspunkt i språket til domenet (problemområdet): Kontrollobjekter ( control objects ) o F.eks. produkt, ingrediens, kunde, student, konto, innskudd, reservasjon o Finn begreper i bruksmønsterspesifikasjonene! Lag CRC-kort for objektene du tror du trenger Lag sekvensdiagrammer for bruksmønstrene objekter ( boundary objects ) Litt forenklet kan man si at denne tredelingen skiller mellom 1) objekter som skal lagres i en database, 2) objekter som koordinerer handlingene i et bruksmønster og 3) objekter som kommuniserer med aktørene. INF1050-ansvar-11 INF1050-ansvar-12
Forretningsobjekter ( entity objects ) Kontrollobjekter ( control objects ) Representerer de tingene virksomheten håndterer, som for eksempel vare, tilbud, ordre, kunde osv. En forekomst av et forretningsobjekt kan leve lenge - kanskje like lenge som virksomheten! I motsetning til kantobjekter og kontrollobjekter lagres forretningsobjektene i en database (de er persistente ) Representerer noe som gjøres i virksomheten Et kontrollobjekt lever vanligvis ikke lenger enn det handlingsforløpet det inngår i. Inf1050: ett kontrollobjekt pr. bruksmønster. Inf1050: Navnet på kontrollobjektet kt t = navnet på bruksmønsteret! INF1050-ansvar-13 INF1050-ansvar-14 objekter (boundary objects) objekter aktiveres av handlinger fra aktører via brukergrensesnittet o for eksempel når aktøren ønsker å starte et bruksmønster ved å trykke på Meld på kurs -knappen i brukergrensesnittet. objektet oppretter deretter en forekomst av kontrollobjektet som kontrollerer selve handlingsforløpet i bruksmønsteret CRC-kort (Class-Responsibility-Collaboration) Navn på objektet <<type objekt>> Ansvar: Hva objektet må vite Hva objektet skal gjøre Liste over samarbeidende objekter (objekter som jeg utveksler meldinger med) Vi kan godt tenke på kantobjekter som bindeleddet mellom et uspesifisert brukergrensesnitt og et kontrollobjekt. objekter kommuniserer kun med aktører (via brukergrensesnittet) og kontrollobjekter. INF1050-ansvar-15 INF1050-ansvar-16
Eks: CRC-kort for Vet min studentid Vet hvilke kurs jeg har bestått Vet hvilke kurs jeg er meldt opp til Vet hvilke kurs jeg står på venteliste på + andre ansvarsområder: Vil bli tydeligere etter hvert som man designer bruksmønstre ved hjelp av sekvensdiagrammer Eks: CRC-kort for Objektorienterte systemer inneholder ofte et slikt oppslagsobjekt Oppslagsobjekt som er tilgjengelig for alle andre objekter: Vet hvilke r og er som finnes på universitetet it t t Har metode for å finne en gitt student Har metode for å finne et gitt emne t INF1050-ansvar-17 INF1050-ansvar-18 Eks: CRC-kort for bruksmønsteret Meld på kurs MeldPaa <<boundary>> Kommuniserer med aktøren og kontrollobjektet MeldPaa <<control>> Kontrollerer hendelsesforløpet i bruksmønsteret Meld på kurs Oppslagsobjekt som vet hvilke emner og studenter som finnes i systemet Vet min studentid Vet hvilke kurs jeg har bestått Vet hvilke kurs jeg er meldt opp til Vet hvilke kurs jeg står på venteliste på Vet min emnekode Vet hvilke emner som forutsettes Vet hvilke kurs som holdes i emnet 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 Objektdesign med UML sekvensdiagrammer Et UML sekvensdiagram viser en interaksjon mellom aktører og objekter i systemet for et bestemt bruksmønster o Fokuserer på hvordan objektene samarbeider for å løse en bestemt oppgave (bruksmønster) o Er ofte nyttig for å identifisere (og spesifisere bruken av) metodene til objektene i systemet INF1050-ansvar-19 INF1050-ansvar-20
Syntaks for UML sekvensdiagram Meldingen sendes bare dersom betingelser er oppfylt Java: if (betingelser) { returverdi = objekt1.metode(parametere) objekt1:klasse1 objekt2:klasse2 Klassen til objektet må ha en metode som kan ta hånd om meldingen [betingelser] returverdi := metode (parametere) Meldingens aktive periode Sammenheng mellom bruksmønster og sekvensdiagram For hvert bruksmønster lager du (i de aller fleste tilfeller) et sekvensdiagram for hovedflyt For hver alternative flyt kan du velge å lage et nytt sekvensdiagram. o Det er viktig å lage sekvensdiagram for variasjoner som har stor innvirkning på designet Returmelding. Vises vanligvis ikke i diagrammet Objektet fjernes det trengs ikke lenger Introduserer variasjonen nye objekter? Introduserer variasjonen nye metoder? INF1050-ansvar-21 INF1050-ansvar-22 Hovedflyt for Meld på kurs (iterasjon #1, uten forretningsobjektene) (infostoff) Eksempel i Java: metoden meldpaa til kantobjektet ok:=meldpaa(studentid, emnekode, semester) <<create>> Lager en instans av meldpaa: kontrollobjektet MeldPaa ok:=meldpaa(studentid, emnekode, semester) ok:=meldpaa(studentid, emnekode, semester) boolean meldpaa(string studentid, String emnekode, String semester) { MeldPaa meldpaa; boolean ok; Kontrollobjektet sørger for at studenten blir meldt på kurset // kantobjektet lager et nytt kontrollobjekt: meldpaa = new MeldPaa(this); Kontrollobjektet slettes // så overtar kontrollobjektet handlingsforløpet i bruksmønsteret: ok = meldpaa.meldpaa(studentid, emnekode, semester); return ok; INF1050-ansvar-23 INF1050-ansvar-24
Hovedflyt for Meld på kurs (infostoff - NB! Ikke komplett kode) Eksempel i Java: metoden meldpaa til kontrollobjektet Objektet som returneres av finn Objektet som returneres av ::finn Objektet som returneres av finn public class MeldPaa { ok:=meldpaa(studentid, emnekode, semester) <<create>> meldpaa: MeldPaa universitetet: emnet: kurset: studenten: public boolean meldpaa(string studentid, String emnekode, String semester) { // antar at objektet universitetet er globalt tilgjengelig: studenten = universitetet.finn(studentid); ok:=meldpaa(studentid, emnekode, semester) emnet = universitetet.finn(emnekode); Hovedflyt: 1. en velger emne 2. Systemet sjekker at studenten er kvalifisert til å ta emnet 3. Systemet finner kurset for emnet studenten:=finn(studentid) t d t( t d tid) emnet:=finn(emnekode) forutsetter:=forutsetterr() 4. Systemet sjekker om det er ledig plass på kurset kurset:=finn(semester) 5. Systemet registrerer studenten på kurset erledigplass:=ledigplass() paameldingok:=meldpaa(studenten) CRC-kortene forteller deg hvilket objekt som skal motta en bestemt melding ermeldtpaa(kurset) boolean forutsetteremner tt = emnet.forutsetterr(); t tt kurset = emnet.finn(semester); boolean erledigplass = kurset.ledigplass(); boolean paameldingok = kurset.meldpaa(studenten); studenten.ermeldtpaa(kurset); return paameldingok; INF1050-ansvar-25 INF1050-ansvar-26 Objektdiagram, før Per melder seg på Inf1050 og så registrerer Per seg på Inf1050 v08 UiO: har har har har kt t UiO: Inf1050 : Inf1050v08: 08 Per: ok:=meldpaa('12345', 'Inf1050', 'v08') navn = "Per" Per : studentid = "12345" navn = 'Kari' Kari : studentid = '44456' Inf1050 : emnekode = 'Inf1050' er undervis isning i er unde ervisning i Inf1000 : emnekode = 'Inf1000' <<create>> meldpaa: MeldPaa ok:=meldpaa('12345', 'Inf1050', 'v08') studenten:=finn('12345') emnet:=finn('inf1050') forutsetter:=forutsetterr() Inf1050v08 : antallpaameldt = 299 semester = 'v08' Inf1050v07 : antallpaameldt = 278 semester = 'v07' kurset:=finn('v08') erledigplass:=ledigplass() paameldingok:=meldpaa(studenten) ermeldtpaa(kurset) 299 andre studenter: 278 studenter: INF1050-ansvar-27 INF1050-ansvar-28
Objektdiagram, etter at Per har meldt seg på Inf1050 v08 Alternativ flyt, steg 4 (kurset er fullt og studenten ønsker å sette seg på venteliste) UiO: universitetet: emnet: kurset: studenten: har har har har ok:=meldpaa(studentid, emnekode, semester) <<create>> meldpaa: MeldPaa navn = "Per" Per : studentid = "12345" navn = 'Kari' Kari : studentid = '44456' Inf1050 : emnekode = 'Inf1050' Inf1000 : emnekode = 'Inf1000' ok:=meldpaa(studentid, emnekode, semester) studenten:=finn(studentid) er undervis isning i er unde dervisning i emnet:=finn(emnekode) forutsetter:=forutsetterr() kurset:=finn(semester) erledig:=ledigplass() Inf1050v08 : antallpaameldt = 300 semester = 'v08' Inf1050v07 : antallpaameldt = 278 semester = 'v07' [erledig==false] vilvente:=oenskerventeliste() [vilvente==true] okvent:=settventeliste(studenten) [okvent==true] erpaaventeliste(kurset) 299 andre studenter: 278 studenter: INF1050-ansvar-29 INF1050-ansvar-30 (infostoff - NB! Ikke komplett kode) Java tilsvarende steg 1-3 + alternativ flyt, steg 4 (kurset er fullt og studenten ønsker å sette seg på venteliste) public class MeldPaa { private kantobjektet; public boolean meldpaa(string studentid, tid String emnekode, String semester) { studenten = universitetet.finn(studentid); emnet = universitetet.finn(emnekode); boolean forutsetteremner = emnet.forutsetterr(); kurset = emnet.finn(semester); boolean erledigplass = kurset.ledigplass(); if (erledigplass == false) { boolean vilvente = kantobjektet.oenskerventeliste(); if (vilvente == true) { boolean okvent= kurset.settventeliste(studenten); if (okvent == true) { studenten.erpaaventeliste(kurset); return true; INF1050-ansvar-31 Objektdiagram, etter at Kari ble satt på venteliste har Per : t Kari : t navn = "Per" studentid = "12345" navn = 'Kari' studentid = '44456' UiO: har t er på venteliste har Inf1050v08 : antallpaameldt ldt = 300 semester = 'v08' har Inf1050 : Inf1000 : emnekode = 'Inf1050' er underv visning i er under rvisning i Inf1050v07 : antallpaameldt ldt = 278 semester = 'v07' emnekode = 'Inf1000' 299 andre studenter: 278 studenter: INF1050-ansvar-32