Ohjelmistojen mallintaminen Olioiden yhteistyö 18.11.2008 Harri Laine 1
Olioiden yhteistyö Oliokeskeisen ohjelmistonäkemyksen mukaan ohjelmiston palvelut tuotetaan olioiden yhteistyön tuloksena. Ohjelmisto voidaan hahmottaa olioina eri tasoilla. Tähän mennessä on tarkasteltu liiketoimintaolioita, joiden varassa on ohjelmiston keskeinen tietosisältö. Näitä määrittelevät luokat muodostavat kuitenkin vain pienen osan ohjelmiston toteutuksessa tarvittavista luokista. Lisäksi tarvitaan luokkia, esim. Tiedon esittämiseen käyttöliittymässä Käyttäjän syötteiden vastaanottamiseen Tietojen tallentamiseen ja hakuun tietokannasta Tiedonkäsittelyalgoritmien hoitamiseen, jne 18.11.2008 Harri Laine 2
Olioiden yhteistyö Oliojärjestelmän toiminta perustuu olioiden yhteistyöhön. Olioiden yhteistyön (vuorovaikutuksen) selvittäminen on kiinteästi sidoksissa olioiden palveluiden määrittelyyn, sillä yhteistyö toteutuu palvelujen kautta. Yhteistoimintakuvauksilla kuvataan, miten palveluja käytetään. Olioiden yhteistoiminnan kuvaaminen on ohjelmiston suunnitteluvaiheen tehtävä. 18.11.2008 Harri Laine 3
Olioiden yhteistyö UML esittelee kaksi perustekniikkaa yhteistoiminnan kuvaamiseen. sekvenssikaavion (sequence diagram), jossa keskitytään erityisesti kuvaamaan operaatioiden tapahtumajärjestystä ja toimintaan liittyvien viestien kulkua. Sekvenssikaavion toinen ulottuvuus on aika. kommunikontikaavion (communication diagram, aiemmassa UML-versiossa collaboration diagram), jossa keskitytään kuvaamaan, miten yhteistyö hyödyntää olioiden välisiä kytkentöjä 18.11.2008 Harri Laine 4
Sekvenssikaavio kuvaa: Jonkin tehtävän (käyttötapaus, palvelu) suoritukseen liittyvän olioiden yhteistyön Mitkä oliot osallistuvat tehtävän suoritukseen Mikä olio kontrolloi suoritusta Mitä avustavia olioita palvelun suoritukseen osallistuu ja mitä näiden palveluja käytetään Missä järjestyksessä avustavien olioiden palveluita käytetään 18.11.2008 Harri Laine 5
olio1:luokka olio2:luokka operaatio / palvelu [nro] viesti nimeää käytettävän palvelun palkin pituus kuvaa palvelun kestoa aika 18.11.2008 Harri Laine 6
Tehtävän suoritukseen osallistuvat oliot kuvataan elämänpolkuna (lifeline) olio:luokka [lkm] Oliolle ei tarvitse antaa nimeä Luokan nimi yleensä mukana Lukumäärä (lkm) on oletusarvoisesti 1 Aika etenee alaspäin Elinkaaren päättyminen (kuvataan jos olio poistetaan tehtävässä) (destruction event) 18.11.2008 Harri Laine 7
Palvelun suoritus kuvataan elämänpolun päälle sijoitettavalla suorakaiteella. Suorakaiteen korkeus kuvaa palvelun kestoa. Suorakaiteet kerrostuvat, jos palvelun suorituksessa käytetään avuksi jotain suorittavan olion omaa palvelua oma_apu 18.11.2008 Harri Laine 8
Kerrostumista esiintyy myös, jos avustava palvelu tekee ns. paluukutsun (callback) :A :B avusta hoida_itse_tämä (paluukutsu) Tässä viestit ovat synkronisia palvelupyyntöjä = pyytäjä odottaa kunnes pyyntö on hoidettu ja paluuarvot palautettu synkronisissa umpinainen nuolenpää 18.11.2008 Harri Laine 9
:A :B avusta hoida_itse_tämä (paluukutsu) Tässä viestit ovat synkronisia palvelupyyntöjä = pyytäjä odottaa kunnes pyyntö on hoidettu ja paluuarvot palautettu odotusta 18.11.2008 Harri Laine 10
Oliot ovat vuorovaikutuksessa viestien (message) avulla Viesti voi olla synkroninen (esim. metodikutsu) kontrolli palaa kun palvelu päättyy (paluuviestiä ei yleensä esitetä) asynkroninen (lähettäjä jatkaa toimintaansa, jos lähettäjää informoidaan valmistumisesta tarvitaan erillinen paluuviesti) Viesti voi toteutua metodikutsuna, etäkutsuna, sanomanlähetyksenä, tapahtuman generointina 18.11.2008 Harri Laine 11
hoida_homma Asynkroninen palvelu avonainen nuolenpää valmis paluuviesti 18.11.2008 Harri Laine 12
Viestit voivat tulla ja mennä ulkopuolelle porttien kautta Vuorovaikutus gate (portti) tee_se avusta 18.11.2008 Harri Laine 13
Esimerkki class A { B oliob; C olioc; D oliod; public int doit() { oliob.assist1(); olioc.assist2(oliod); } } class B { E olioe; public void assist1() { olioe.dosomething(); } } class C { public void assist2(d od) { od.serviced()} } 18.11.2008 Harri Laine 14
A.doit olioa:a oliob:b olioe:e olioc:c oliod:d doit assist1() dosomething() assist2(oliod) serviced() 18.11.2008 Harri Laine 15
Luonti ja tuhoaminen create :Apuluokka use delete 18.11.2008 Harri Laine 16
Sekvensseistä voidaan eristää alisekvenssejä (combined fragments) Alisekvenssiin voidaan liittää tyyppi, joka kuvaa alisekvenssin toteutumista, esim. alt (+ ehto) else ehdon voimassaollessa suoritettava opt (+ ehto) ehdon voimassaollessa suoritettava loop (+ ehto) toistetaan niin kauan kuin ehto voimassa 18.11.2008 Harri Laine 17
:Pankki :Ostos :Tili annasumma annasaldo alt [saldo>=summa] tililtäotto(summa) else tilinylitys 18.11.2008 Harri Laine 18
tee_ryhmälista :Kurssi :Ryhmä :Varaukset loop näytäryhmä annavaraustilanne(ryhmätunnus) 18.11.2008 Harri Laine 19
Sekvenssikaaviota käytetään havainnollistamaan oliorakenteen toimintaa. Ei kannata laatia jokaiselle toiminnolle. Laaditaan keskeisille palveluille ja tilanteisiin, joissa kaavioiden käyttö edistää rakenteiden ymmärtämistä. Ei ole sääntöjä, kuinka pitkä yhteistyöketju kaaviossa tulisi esittää, mutta 3-4 viestiä pidemmät ketjut pikemminkin sotkevat kuin havainnollistavat mitään. 18.11.2008 Harri Laine 20
Kaavioita voidaan laatia erillisinä pienemmille toiminnoille ja käyttää osana isommissa Ei kaikkea samaan kaavioon Käytettävää palvelua kuvaava erillinen kaavio 18.11.2008 Harri Laine 21
18.11.2008 Harri Laine 22
18.11.2008 Harri Laine 23
Sekvenssikaavion ohjelmakoodin perusteella laadittaessa suoritusjärjestys on tärkeä a.do {b.doit(c.function);...} a c b do function doit 18.11.2008 Harri Laine 24
Olioiden yhteistyö/kommunikointikaavio Kommunikointikaaviossa (communication/ collaboration diagram) näkyy miten, yhteistyö perustuu olioiden välisiin kytkentöihin 1: palvelu1 olio1 yhteys1 olio2 Järjestysnumero kuvaa suoritusjärjestyksen. Numerointi: palvelun I sisällä i.1, i.2, 1.1: palvelu2 olio3 yhteys2 Käytettävä palvelu (viesti) 18.11.2008 Harri Laine 25
Olioiden yhteistyö/kommunikointikaavio Kommunikointikaavion informaatiosisältö periaatteessa sama kuin sekvenssikaavion Yhteyksien nimiä ei standardin mukaan anneta, kuitenkin useissa työkaluissa näin voi tehdä 18.11.2008 Harri Laine 26
Olioiden yhteistyö/kommunikointikaavio doit OlioA:A 1:assist1() OlioB:B 2.1:serviceD 2:assist2(olioD) 1.1:doSomething OlioD:D OlioC:C OlioE:E 18.11.2008 Harri Laine 27