olio-ohjelmoinnin perusteet luento 1: oliopohjaisuus ja oliopohjainen suunnittelu
DESCRIPTION
Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu. Jani Rönkkönen [email protected] Luennot muokattu Sami Jantusen ja Kari Smolanderin aikaisempien vuosien luennoista. Käytännön asiat. Käytännön asiat. - PowerPoint PPT PresentationTRANSCRIPT
Olio-ohjelmoinnin perusteetluento 1: Oliopohjaisuus ja oliopohjainen suunnittelu
Jani Rönkkö[email protected]
Luennot muokattu Sami Jantusen ja Kari Smolanderin aikaisempien vuosien luennoista
Käytännön asiat
Luennoitsija: Jani Rönkkönen ([email protected])
Luennot: 7kpl (3h/vko) yhteensä 21 tuntia.
Ajat ja paikat: Maanantai 14-17 (4301-4302)
Vastaanotto: Tiistai 15-16, huone 6538
Harjoitukset ja harjoitystyöt:
Jani Rönkkönen
Harjoitusajat: Kolme ryhmää, tiistai 16-18, keskiviikko 10-12 ja torstai 12-14 (6303)
Käytännön asiat
Kurssin kotisivu toimii ensisijaisena tiedostuskanavana
Harjoitustyö julkaistaan tammikuun aikana
Harjoitukset alkavat jo tällä viikolla!
Kurssi pidetään nyt viimeistä kertaa! Harjoitustyön deadline on nyt lopullinen,
eikä töitä voi enää lykätä ensi vuodeksi Tenttejä tulee olemaan 3 kappaletta,
näiden jälkeen ei ole enää lisämahdollisuuksia
Vanhat osasuoritukset (tentti tai harjoitustyö), joista löytyy merkintä opintotoimistosta kelpaavat lukuvuodesta 02-03 eteenpäin
Kurssin tavoitteista
TavoiteTavoiteOppia ymmärtämään oliopohjainen
ajattelutapa ja sen käsitteet ja soveltaa näitä käytännössä (esim. C++ avulla)
Ei!Ei!Oppia sujuvaksi C++:n syntaksissa, jotta
voin jatkaa vanhaan tyyliin ohjelmoimista uudella kielellä.
Sisältö Johdanto oliomaailmaan
Historiaa Oliopohjaisia käsitteitä
Olio Luokka Perintä Toiminnan korvaaminen Abstraktio (Abstraction) Tiedon piilottaminen (Information hiding) Kapselointi (Encapsulation)
Lyhyesti oliopohjaisesta suunnittelusta
Historiaa….
Ohjelmointitekniikoiden evoluutio:
jäsentelemätön ohjelmointiproseduraalinen ohjelmointi
modulaarinen ohjelmointiolio-ohjelmointi
Jäsentelemätön ohjelmointi
Sarja komentoja, jotka manipuloivat globaalia tietoa
- Esim. Assemblerilla tehty ohjelmointi
Ongelmia(?): Ei skaalaudu Sotkuista koodia
Proseduraalinen ohjelmointi
Tehtävät, joita tarvitaan toistuvasti eriytetään omiksi aliohjelmiksi (procedures)
Tietty toiminnallisuus kirjoitetaan vain yhteen paikkaan ylläpidettävyys helpottuu
Aliohjelmat tarjoavat mahdollisuuden tiedon piilottamiseen (information hiding)
Riittää kun käyttää hyväksi aliohjelman funktiokutsua. Ei tarvetta ymmärtää aliohjelman sisälmyksiä
Proseduraalinen ohjelmointi
Ohjelma voidaan nyt käsittää sarjana aliohjelmakutsuja. Pääohjelma välittää aina tarvittavan tiedon aliohjelmille
- Esim: C ja Pascal tukevat proseduraalista ohjelmointia
Ongelmia (?): Aliohjelmien uudelleenkäyttö
vaikeaa muissa ohjelmissa Kaikki tieto
pääohjelmassanimikonfliktit Muuttujia pääsee
käsittelemään suoraan mistä tahansa
Modulaarinen ohjelmointi
Yleiskäyttöinen toiminnallisuus ryhmitelty omiin moduuleihin ja Ohjelma koostuu nyt useasta moduulista
Kukin moduuli voi ylläpitää omia tietoja ja tarjoaa rajapinnat näiden käsittelyyn.
Esimerkiksi C:n funktiokirjastot ovat moduleita.
Perinteinen ohjelmointi Perinteisessä ohjelmoinnissa ihminen pyrkii muokkaamaan
ajatuksensa sellaiseksi käskysarjaksi, jonka kone osaa suorittaa.
Program PaintScene { while (exists()) { draw_this(); draw_that(); }}
läählääh
Olio-ohjelmointi Voidaan myös lähteä liikkeelle siitä, miten ihminen hahmottaa
ongelman, ja antaa jotain tämän hahmotelman kaltaista koneen käsiteltäväksi.
class Bee { Coordinates location; Wing[] wings; flyAbout() { ... }}
Plant
grow()
Treeleaves
Flowerblossompollen
Beewingssting
flyAbout()
Käytetään siis kieltä, joka on koneen käsiteltävissä, mutta muistuttaa ainakin osin ihmisen tapaa jäsentää maailmaa.
Missä mennään? Johdanto oliomaailmaan
Historiaa Oliopohjaisia käsitteitä
Olio Luokka Perintä Toiminnon korvaaminen Abstraktio (Abstraction) Tiedon piilottaminen (Information hiding) Kapselointi (Encapsulation)
Lyhyesti oliopohjaisesta suunnittelusta Kertaus
Olio-ohjelmointi
Kukkakauppaesimerkki
Haluan lähettää kukkia ystävälleni (Miss Wang) Pekingiin
Miten toimia? Ratkaisutapa 1: Kerään kukat ja vien ne
itse (huomaavaista, mutta epäkäytännöllistä)
Ratkaisutapa 2: Menen paikalliseen kukkakauppaan, kerron kukkien tyypit ja lukumäärät ja pyydän toimittamaan Ms. Wangin osoitteeseen
Kukkakauppaesimerkki jatkuu…
Ratkaisin ongelman löytämällä asiamiehen (paikallinen kukkakauppias) ja välitin hänelle pyynnön
Kukkakauppiaan tehtävä on suorittaa pyytöni
Pyynnön suorittamiseen liittyy joku toimintatapa (algoritmi).
Kukkakauppaesimerkki jatkuu… Minun ei tarvitse tietää miten
kukkakauppias suorittaa tehtävänsä. Tiedon piilotus (Information hiding)
Jos tutkisin kukkakauppiaan suoriutumista tehtävästään, huomaisin, että hän lähettää hieman erilaisen viestin toiselle kukkakauppiaalle Ms. Wangin kotikaupunkiin Pekingiin.
Pekingin kukkakauppias puolestaan ottaa yhteyttä lähettiin, joka suorittaa varsinaisen kukkien toimituksen
Ms. Wangin kukkakauppias on saanut kukkansa tukkumyyjältä, joka puolestaan on asioinut kasvattajien kanssa.
Kukkakauppaesimerkki jatkuu…
Kukkakauppaesimerkki jatkuu…
Ongelmani siis ratkaistiin usean asiamiehen avulla. Ilman heidän apuaan ongelma ei olisi ratkennut helposti
Minä
Lappeenrannan kukkakauppias
PekinginKukkakauppias
Kukkakimpun kokoaja
Puutarhuri
Juoksupoika
Tukkumyyjä
Kukkien kasvattaja
Ms. Wang
Viestejä välittävät oliot Lappeenrannan kukkakauppiaalle
esittämäni pyyntöni aiheutti ketjureaktion viestejä. Tämän lopputuloksena Ms. Wang sai lopulta kukat
Näemme siis, että tämän yhteisön jäsenet kommunikoivat keskenään lähettämällä pyyntöjä toisilleen
Toiminto aloitettiin lähettämällä viesti sille asiamiehelle joka on vastuussa halutusta toiminnallisuudesta
Olioista Oliopohjainen tietokoneohjelma
rakentuu vuorovaikutteisten olioiden varaan Oliot “tietävät” kuinka selviytyä tehtävistään Oliot suorittavat tehtäviään vain jos joku
toinen olio pyytää sitä Kullakin oliolla on oma roolinsa. Kukin
olio tarjoaa palveluja, suorittaa toimenpiteitä
Olioiden väliset viestit Lähetettävään viestiin sisältyy pyydettävä
toiminnallisuus ja sen suorittamiseen tarvittava tieto (argumentit)
Jos viestin vastaanottava olio hyväksyy viestin, se myös hyväksyy vastuun suoriutua kyseisestä tehtävästä
Viestin seurauksena, vastaanottaja suorittaa toiminnallisuutta, mikä toteuttaa viestin mukana tulleen pyynnön
Olioiden väliset viestit jatkuu…
Viestillä on nimetty vastaanottaja Viestin tulkinta saattaa olla erilainen
riippuen viestin vastaanottajastaMonimuotoisuus (Polymorphism) Jos pyytäisin hammaslääkäriäni
lähettämään kukkia Ms. Wangille, hänellä ei luultavasti ole keinoa ratkaista ongelmaa ja luultavasti kieltäytyisi tehtävästä
Esimerkki: Viestivät oliot
T. Teekkari, ilmoittaudu kurssille X-123.456.
1.
X-123.456, ilmoita T. Teekkari (itseesi).
2.
Sali A23, kerro paikkojesi määrä.
4.
50.
5.
OK, onnistui.
7.
Hmm, 31<50, joten mahtuu. Lisätään listaan.
6.
OK, onnistuin.
9.Hyvä, lisäänpä kurssilistaani.8.
object opiskelijaolio#1 { String nimi = ”T. Teekkari”; String ammatti = ”opiskelija”; String koulutusohjelma = ”S”; int opiskelijanumero = 12345; Kurssi[] kurssit = ...; ilmoittaudu { ... } }
object kurssiolio#1 { String koodi = ”X-123.456”; int opintoviikot = 3; Opiskelija[] ilmoittautuneet = ...; Sali opetuspaikka = saliolio#1; ilmoitaOpiskelija { ... } }
object saliolio#1 { String nimi = ”Sali A23”; int paikkojenMaara = 50; kerroPaikkojenMaara { ... }}
Mahtuukohan se opetuspaikkaani? 3.
Olioiden rakenne
Oliot sisältävät Tilatietoja, joita olio käyttää
toiminnallisuudessaan hyväksi Toiminnallisuutta, joka toteuttaa
oliolle annetut vastuut/tehtävät
Olioiden toiminnallisuudesta
Olion toiminnallisuutta on yleensä: konstruktiot: -olioiden luonti käskyt: -olion tilan muutos kyselyt: -vastauksen antaminen olion
tilatietojen perusteella
Esimerkki olion toiminnallisuudesta
Mitä toiminnallisuutta roskakori voisi sisältää?
Konstruktio:
Käskyt:
Kyselyt:
Roskakorin luonti
Lisää roskia, tyhjennä roskakori
Onko kansi auki? Onko roskakori täynnä?
Olion sisältämistä tiedoista
Olion sisältämät tiedot voivat olla: attribuutteja: asioita, jotka kuvaavat
oliota komponentteja: asioita, jotka ovat osa
oliota assosiaatioita: asioita, joista olio on
tietoinen, mutta jotka eivät ole osa oliota
Esimerkki olion tiedoista
Mitä tietoa roskakori voisi sisältää?
Attribuutit:
Komponentit:
Assosiaatiot:
väri, materiaali, haju
kansi, roskapussi, roskat
roskakori voi olla assosioitu huoneeseen missä se sijaitsee
Luokat ja oliot Ymmärrän minkälaista toiminnallisuutta voin
odottaa kun kävelen kukkakauppaan esittämään pyyntöni
Pystyn tekemään oletuksia, sillä tiedän kukkakauppiaista yleisellä tasolla ja oletan että Lappeenrannan kukkakauppias toimii samalla tavalla
Voimme käyttää “Kukkakauppias” –luokkaa kuvaamaan kaikkia kukkakauppiaita.
Lappeenrannan kukkakauppias on yksi ilmentymä (olio) kukkakauppias-luokasta
Luokat ja oliot
IHMINEN
NIMI: __________
IKÄ: __v.
SILMÄT:________
KOTI: asunto #___
ASUNTOKATUOS.: ______
POSTIOS.: _____
KOKO: ___m 2
ASUKKAAT:
IHMINEN
#A01
NIMI: Kasper
IKÄ: 21v.
SILMÄT: siniset
KOTI: asunto #B02
ASUNTO #B02
KATUOS.: Kaitapolku 7
POSTIOS.: 012 KDM
KOKO: 25 m 2
ASUKKAAT:
ihminen #A01
IHMINEN #A02
NIMI: Jesper
IKÄ: 19v.
SILMÄT: vihreät
KOTI: asunto #B01
IHMINEN
#A03
NIMI: Joonatan
IKÄ: 17v.
SILMÄT: ruskeat
KOTI: asunto #B01
ASUNTO #B01
KATUOS.: Rosvokuja 1
POSTIOS.: 010 KDM
KOKO: 70 m 2
ASUKKAAT:
ihminen #A02,
ihminen #A03
Periytyminen (Inheritance) Kukkakauppias on myös kauppias Tiedän siis, että hän todennäköiseti
pyytää rahaa pyyntöni toteutuksesta ja että rahan vastaanoton yhteydessä hän todennäköisesti antaa minulle kuitin. Näin toimivat myös muunkin alan kauppiaat
Kukkakauppias on siis erikoistuneempi muoto kauppiaasta. Kukkakauppiaalla pitää olla kaikki ne toiminnat mitä kauppiaalla yleisesti ottaen kuuluu olla.
Periytyminen jatkuu…
Eräs tapa ajatella periytymistä on organisoida tietoni kukkakauppiaasta hierarkiseksi rakenteeksi: Kukkakauppias on erikoistunut
kauppias Kauppias on ihminen
Periytyminen jatkuu…. Periytyminen tarkoittaa
periaatetta siitä, että yleisempi määrittely on myös voimassa erikoistuneissa olioissa
Sanomme, että kukkakauppias perii myös kauppiaan ja ihmisen toiminnallisuuden
Ihminen
Kauppias
Kukkakauppias
Periytyminen jatkuu….
Periytymisen idea: Luokat voidaan organisoida
hierarkkisiin perintäpuihin Lapsiluokka perii vanhempiensa
tiedon ja toiminnallisuuden Abstrakti isäluokka on sellainen,
mistä ei voida tehdä omaa oliota, mutta mitä käytetään lapsiluokkien määrittelyssä
Periytyminen Periytymisen määrittely on ihmisajattelulle luontevaa
ja tekee malleista selkeämpiä ja vähemmän toisteisia. Periytyminen on luokkien välinen suhde, mutta ei
olioiden: aliluokan ilmentymä on samaan aikaan myös yliluokan ilmentymä.
Esim. opiskelija on myös henkilö. Toisin sanoen: periytyminen on ns. is-a -relaatio.
Piirteiden yleistämisen lisäksi periytymistä voidaan käyttää käänteisesti luokan tarkentamiseen.
Esim. opiskelijaluokasta voidaan johtaa jatko-opiskelijaluokka.
Käytännön etuja periytymisestä Periytymisen mielekkyys voidaan perustella luontevuudella ja
luokkamallien selkeytymisellä. Se myös helpottaa ohjelmien kirjoittamista. Miten luokat
ohjelmoitaisiin, jos käytössä ei olisi perintää? Jouduttaisiin joko: Määrittelemään samoja asioita moneen kertaan eri luokkiin. Näistä
luokista ei voisi myöskään kätevästi puhua ”yleisesti”. Tai laatimaan suuria luokkia, jotka edustavat kaikenlaisia
mahdollisia ”aliluokkiaan” samaan aikaan. Tämä johtaisi hyvin monimutkaisiin ja hankalasti ymmärrettäviin ja ylläpidettäviin luokkiin.
Periytyminen helpottaa yleiskäyttöisten luokkien laatimista ja ohjelman osien uudelleenkäyttöä muissa yhteyksissä.
Eliöiden luokittelu
PeriytyminenEläin
...Niveljalkainen Selkäjänteinen
Hämähäkkieläin Hyönteinen Matelija Nisäkäs Lintu
...
......
... ......
Leppäkerttu Kissa Ihminen
...
Toiminnallisuuden korvaaminen
Eläin
Nisäkäs Lintu
Selkäjänteinen
Nisäkkäät synnyttävät eläviä poikasia
Linnut munivat munia Entäs vesinokkaeläin,
joka on nisäkäs, mutta luo munia?
Synnytä()
Synnytä() Synnytä()
Synnytä elävä
poikanen
Luo munia
Toiminnallisuuden korvaaminen jatkuu….
On mahdollista korvata (override) isäluokassa määritelty toiminnallisuus toteuttamalla lapsiluokkaan saman niminen toiminnallisuus
Sopivan metodin etsintä aloitetaan aina lapsiluokasta. Jos lapsiluokassa ei ole toteutettuna haluttua toiminnallisuutta, siirrytään etsimään sitä isäluokasta
Eläin
Nisäkäs Lintu
Selkäjänteinen
Synnytä()
Synnytä() Synnytä()
Synnytä elävä
poikanen
Luo munia
VesinokkaeläinSynnytä()
Luo munia
Abstraktio
Abstraktio jatkuu….
Ihminen voi käsittellä 7±2 yksityiskohtaa kerrallaan
Yleensä ei ole mahdollista, eikä järkevää esitää kokonaisuutta kaikkine yksityiskohtineen.
Abstraktioon liittyviä määritelmiä Abstraktio on tarkoituksellista
yksityiskohtien piilottamista, jotta muut suunnittelutyön kannalta oleellisemmat piirteet tulevat paremmin esille
Tiedon piilottaminen (Information hiding) kapseloimalla (Encapsulation) käytön kannalta turha tieto olion sisälle on abstrahoinnin tärkeimpiä työkaluja ohjelmoinnissa
“is-a” ja “has-a” abstraktiot
Asian pilkkominen osiin käyttää hyväkseen “has-a” abstraktiota. Esimerkki: Auto koostuu moottorista, renkaista, korista,…. Aggregaatio/kompositio
Erikoistuminen kuvaa “is-a” abstraktiota. Esimerkki: Polkupyörä on pyörällinen kulkuneuvo Periytyminen
Esimerkki koostumuksesta ja kapseloinnista
Auto voidaan pilkkoa useisiin aliyksiköihin
Aliyksiköiden välille määritetään selkeä rajapinta, jotta eri ryhmät voivat kehittää itsenäisesti eri aliyksiköitäKapselointi (Encapsulation)
Missä mennään? Johdanto oliomaailmaan
Historiaa Oliopohjaisia käsitteitä
Olio Luokka Perintä Toiminnon korvaaminen Abstraktio (Abstraction) Tiedon piilottaminen (Information hiding) Kapselointi (Encapsulation)
Lyhyesti oliopohjaisesta suunnittelusta Kertaus
Mallintamisesta Malli on todellisuuden yksinkertaistus Mallinnamme, jotta ymmärrämme
paremmin järjestelmän mitä kehitämme
Ongelman ratkaisuun tarvitaan yleensä useita eri malleja
Mallintaminen voi tapahtua usealla tarkkuustasolla 7±2 sääntö
Mistä hyvä malli muodostuu? Hyvän mallin tulee:
käyttää standardia kuvauskieltä olla helposti ymmärrettävissä asiakkaille ja käyttäjille
auttaa ohjelmiston kehittäjiä ymmärtäämään järjestelmän piirteitä
tarjota mahdollisuus abstrahointiin
UML määrittely UML (The Unified Modelling Language) on oliopohjaisen ohjelmiston mallintamiseen käytettävä graafinen kieli. Sitä käytetään:
suunnittelutyön apuna suunnittelutyön analysoinnissa ja hyväksynnässä
järjestelmän perusdokumentaationa
UML:n Keskeisiä suunnittelukaavioita
Järjestelmän staattinen kuvaus: Luokkakaavio (Class diagram)
Järjestelmän toiminnallinen kuvaus: Sekvenssikaavio (Sequence diagram)
Näiden lisäksi on noin kymmenen muuta kaaviotyyppiä, joita ei käsitellä tässä
Luokkakaavio (Class diagram)
CourseOffering
ddaysOfferedtimeOfDaylocation
addStudent()addProfessor()isFull()
(from UniversityArtifacts)RegistrationUser
namephoneaddressIDNumber
3..10 43..10 4
registersFor
41 41
teaches
StudentInfomajorgradYear
StudentMaintenanceForm(from Interfaces)
1
1..n
1
1..nProfessorMaintenanceForm
(from Interfaces)
ProfessorInfotenureStaus
1..n
1
1..n
1
Luokat (tiedon tyyppi) Attribuutit (luokan
sisältämä tieto) Operaatiot (luokan
tarjoama toiminnallisuus) Assosiaatiot (luokkien
väliset yhteydet) Yleistys (luokkien
hierarkkisuus)
Kuvaa luokat ja niiden väliset suhteet
Peruselementit:
Notaatio luokkien kuvaukseen
Luokka kuvataan yksinkertaisimmillaan laatikkona, missä on luokan nimi sisällä
Laatikossa voidaan kuvata myös attribuutit ja operaatiot
Operaation täydellinen kuvaus on: operationName(parameterName: parameterType …): returnType
Rectangle
height: intwidth: int
getArea(): intresize(int,int)
Rectangle
heightwidth
getArearesize
Rectangle
heightwidth
Rectangle
getArearesize
Rectangle
Luokkakaavion kehitysprosessi:
1. Identifioi kandidaattiluokat2. Lisää assosiaatiot ja attribuutit3. Löydä yleistettävät asiat4. Määrittele luokkien vastuut5. Määrittele operaatiot6. Iteroi prosessia kunnes mallista tulee
hyväksyttävä Lisää tai poista luokkia, assosiaatioita,
attribuutteja, yleistyksiä, vastuita tai operaatioita
Menetelmä luokkien etsimiseen Tarkastele annettua materiaalia (esim.
vaatimusmäärittely) Poimi substantiivit Eliminoi substantiivit jotka:
Tarkoittavat samaa asiaa Kuvaavat instansseja (yksittäistä oliota) Ovat liian epämääräisiä Ovat kehitettävän järjestelmän kannalta
tarpeettomia Mieti mitkä jäljellä olevista substantiiveista
ovat sopivia luokiksi ja mitä muita luokkia mahdollisesti tarvitset
Prosessi assosiaatioiden ja attribuuttien tunnistukseen
Aloita luokista mitkä ovat mielestäsi keskeisimmät ja tärkeimmät
Päätä mitä itsestään selvää tietoa kukin luokka sisältää ja mihin muihin luokkiin sillä on assosiaatioita
Suunnittele luokat tärkeysjärjestyksessä Vältä suurta assosiaatioiden ja attribuuttien
määrää Järjestelmä on yksinkertaisempi jos se manipuloi
pienempää tietomäärää
Ohjeita hyvien assosiaatioiden määrittelyyn
Assosiaatio tulisi määritellä jos luokka: omistaa kontrolloi on kytketty liittyy on osa omistaa osina on jäsen, tai omistaa jäseninä
muita luokkia mallissasi Muista määritellä olioiden mahdollinen lukumäärä
assosiaation kumpaankin päähän Kuvaa assosiaatiot selkeästi
Notaatio assosiaation suunnan kuvaukseen
Assosiaatiot ovat oletusarvoisesti kaksisuuntaisia
On mahdollista rajoittaa assosiaatio yksisuuntaiseksi lisäämällä nuoli assosiaation päähän
Controller ohjaa hissiä, mutta hissin ei tarvitse tietää mitään controllerista
**ElevatorController
Notaatio assosioitujen luokkien lukumäärän määrittelyyn
0,3..8 ******
Employee
*
* *****1..*
*0..1
Secretary
Office
Person
Company
Employee Company
Manager
BoardOfDirectors
BoardOfDirectors
Notaatio assosiaatioiden tarkempaan kuvaukseen
*
supervisor
*****1..*
* worksFor
*allocatedTo0..1
boardMember
0,3..8 ******
Employee
Secretary
Office
Person
Company
Employee Company
Manager
BoardOfDirectors
BoardOfDirectors
Assosiaatioiden analysointi ja validointi
One-to-oneMiten tulkitaan?:
Company BoardOfDirectors
Jokaista yritystä kohden on olemassa vain yksi johtoryhmä
Johtoryhmä johtaa vain yhtä yritystä Yrityksellä täytyy aina olla johtoryhmä Johtoryhmä kuuluu aina tiettyyn yritykseen
Assosiaatioiden analysointi ja validointi
Many-to-manyMiten tulkitaan?:
*
supervisor
*****1..*Secretary Manager
Sihteeri voi työskennellä usealle johtajalle Jokaisella sihteerillä pitää olla vähintään
yksi johtaja Johtajalla voi olla useita sihteerejä Joillakin johtajilla ei ole yhtään sihteeriä
Monimutkaisempi esimerkki
Varaus tehdään aina täsmälleen yhdelle matkustajalle
Ei varausta jos ei matkustajaa varaus tehdään matkustajakohtaisesti
Matkustajalla voi olla useita varauksia Voi olla, että matkustajalla ei ole varausta
ollenkaan
************Passenger SpecificFlightBooking
Miten tulkitaan?:
Aggregaatio (Aggregation)Aggregaatiot ovat erikoistuneita assosiaatioita kuvaamaan luokan koostumista muista luokista
Kokonaisuutta kuvaavaa puolta kutsutaan aggregaatiksi (aggregate)
Aggregaatio kuvataan assosiaation päässä olevalla timantilla.
****
****** Region
VehiclePart
Country
Vehicle
Milloin aggregaatiota käytetään? Nyrkkisääntö: Käytä aggregaatiota jos jokin seuraavista toteutuu:
Luokat ovat osia aggregaatista Aggregaatti koostuu eri luokista
Jos joku kontrolloi aggregaattia, se kontrolloi myös aggregaatin osiaAggregaatio on assosiaation erikoistapaus – ei ole koskaan virhe käyttää assosiaatiota
Aggregaatiohierarkia
* *
*
WheelTransmissionEngineFrame
DoorBodyPanelChassis
Vehicle
Kooste on vahva aggregaatio Jos aggregaatti tuhotaan niin kaikki osatkin
tuhotaan
Kaksi vaihtoehtoista tapaa kuvata postiosoite:
Kooste (Composition)
***** RoomBuilding
EmployeeEmployeeaddress: Address
AddressstreetmunicipalityregioncountrypostalCode
Assosiaatioluokat (Association classes)
Joskus attribuutti joka liittyy kahteen eri luokkaan ei sijoitu hyvin kumpaakaan luokista
Luokka voidaan liittää myös assosiaatioon Kumpikin alla olevista malleista kuvaa samaa asiaa:
Registration
grade
Student CourseSection* ******
Registration
grade
Student CourseSection* *
Rekursiivinen assosiaatio(Recursive associations)
On mahdollista, että luokalla on assosiaatio itsensä kanssa
Course *isMutuallyExclusiveWith
*
*
prerequisite
successor *
Vältä turhia one-to-one assosiaatioita
Vältä tätä: Ennemmin näin
Person
nameaddressemailbirthdate
Person
name
PersonInfo
addressemailbirthdate
Attribuuttien identifiointi Etsi tietoa, mitä kunkin luokan on pakko ylläpitää
Useat ongelmankuvauksen substantiiveistä, joita ei hyväksytty luokiksi ovat potentiaalisia attribuutteja
Attribuutin tulisi yleensä sisältää yksinkertainen arvo
Esim. merkkijono, numero
Ohjeita atribuuttien määrittelyyn Vältä duplikaatteja Jos osa luokan attribuuteista muodostaa kiintän
ryhmän, muodosta näistä attribuuteista oma luokkansa.
****
*
Person
nameaddresses
addressesPerson
namestreet1 municipality1 provOrState1 country1 postalCode1street2 municipality2 provOrState2 country2 postalCode2
Person
name
Address
street municipality provOrState country postalcode type
Monikossa oleva attribuutti on huono
Huono. Liian montaattribuuttia. Ei mahdollistalisätä osoitteita
Hyvä ratkaisu. Voidaanmääritellä erikseen onko kyseessä koti-, työ, … osoite
Yleistyksen notaatio
Animal Animal
habitat typeOfFood
HerbivoreCarnivoreLandAnimalAquaticAnimal
Yleistyksellä (generalization) kuvataan periytymistä.
Rajapinnat (Interfaces)
Rajapinta kuvaa olioiden ulospäin näkyvän toiminnallisuuden.
Rajapinta muistuttaa luokkaa sillä poikkeuksella, että sillä ei ole omia muuttujia eikä toteutettuja metodeja.
«interface»Cashier
withdrawdeposit
Machine
ATMEmployee
Person Machine
ATMEmployee
Person
Cashier Cashier
Luokkien vastuut Vastuu on jotain, mitä järjestelmän kuuluu tehdä.
Kukin toiminnallinen vaatimus pitää pystyä kytkemään yhteen luokista
Kaikki luokalle annetut vastuut pitäisi selkeästi liittyä toisiinsa.
Pilko luokka jos sille tulee liikaa vastuita. Luokka on todennäköisesti käyttökelvoton jos sille ei
ole määritelty yhtään vastuita. Uusi luokka pitää todennäköisesti luoda jos jotain
vastuuta ei voi määrittää olemassa olevalle luokalle.
Vastuiden kategorioita
Attribuuttien luku ja kirjoitus Uusien instanssien luonti ja alustus Tietokannasta luku ja tietokantaan talletus Instanssien tuhoaminen Assosiaatiolinkkien luonti ja tuhoaminen Kopiointi, konvertointi, muuntaminen,
lähettäminen,… Numeerisen tuloksen laskenta Navigointi ja etsintä Muu erikoistunut työ
Operaatioiden määrittely Operaatioita tarvitaan kunkin luokan vastuiden toteutukseen
Yhtä vastuuta kohden saattaa olla useita operaatioita
Ne metodit jotka vain auttavat vastuun toteutuksessa tulisi piilottaa muilta luokilta
Viestit (Note)
Viestit: Viesti kuvataan UML-kaavioon upotettavana
pienenä tekstilaatikkona. Viesteillä voi selventää muuten mahdollisesti
epäselviä kohtia kaaviosta Toimii samoin kuin kommentointi koodatessa
Viesti tulee tähän
NewClass
Sekvenssikaavios1:
StockQuoteSubscriberp:StockquoteP
ublishers2:
StockQuoteSubscriber
attach(s1)
attach(s2)
notify()
update()
getState()
update()
getState()
• Kuvaa olioiden välistä vuorovaikutusta eli olioiden toisilleen lähettämiä viestejä
• Aika kuluu ylhäältä alaspäin
• Kannattaa näyttää vain ne tiedot, jotka auttavat ymmärtämään mallinnettavaa vuorovaikutusta
Missä mennään? Johdanto oliomaailmaan
Historiaa Oliopohjaisia käsitteitä
Olio Luokka Perintä Toiminnon korvaaminen Abstraktio (Abstraction) Tiedon piilottaminen (Information hiding) Kapselointi (Encapsulation)
Lyhyesti oliopohjaisesta suunnittelusta Kertaus
Kertausta Olio-ohjelmointi ei tarkoita muutaman uuden
ominaisuuden lisäystä olemassa oleviin ohjelmointikieliin. Olio-ohjelmointi on uusi tapa ratkaista annettu
ohjelmointitehtävä Oliopohjainen sovellus voidaan nähdä
ryhmänä olioita. Kukin olio on vastuussa tietyistä tehtävistä.
Sovelluksen tehtävät toteutuvat olioiden välisen vuorovaikutuksen avulla
Tietyssä mielessä olio-ohjelmointi on vain todellisen maailman mallinnusta/simulointia
Kertausta… Olio koostuu tilatiedoista ja
toiminnallisuudesta Olion toiminnallisuus on määritelty olioon
liittyvässä luokassa. Jokainen olio on ilmentymä jostain luokasta
Olio suorittaa tehtävänsä saamansa viestin perusteella. Viestin tulkinta voi olla erilainen riippuen siitä
mikä olio viestin vastaanottaa (polymorphism)
Kertausta… Luokat voidaan organisoida hierarkisesti
periytymisen avulla Lapsiluokat voivat käyttää hyväksi ylemmän
tason luokan tietoa ja toiminnallisuutta Oliopohjaisen sovelluksen suunnittelu
muistuttaa itsenäisten yksiköiden organisointia toimivaksi kokonaisuudeksi Kukin yksikkö on vastuussa tietynlaisista
tehtävistä Kokonaisongelma ratkaistaan useamman yksikön
ja niiden välisen vuorovaikutuksen avulla
Periytymishierarkia
Shape
ColorCenter PositionPen ThicknessPen Type
Move()Select()Rotate()Draw()
Non-Dimensional
name : type = initval 1-Dimensional
Angle
Scale()
2-Dimensional
AngleFill Type
Scale()Fill()
Point
Draw()
Line
Endpoints
Draw()
Arc
Radius
Draw()
Polygon
Vertices
Draw()Rotate()
Circle
Diameter
Draw()
Mitä attribuutteja ja suhteita on Rekka-luokalla? Entä Henkilöautolla?
Mitä Perävaunu perii? Entä Vene?
Henkilöautopaikkaluku
Kori
Moottori
Hallintalaitteet
Pyörä
AutoRekisterinumeroKäyttöönottopvm
Poista käytöstä()Vaihda omistajaa()
11
11
11
44
HenkilöNimiOsoite
0..*
1
0..*
+omistaja1
Perävaunusallittu kuorma
Rekkatelipaino
11
KulkuneuvoKokonaispaino
VeneSyväys
Milloin mitäkin suhdetta käytetään
Väliaikainen käyttösuhde
”käyttää”, ”riippuu jostakin”
Riippuvuus
Luokkien välillä, ei liity suoraan olioihin
”on”,”on kaltainen”
Yleistys
Vahvempi kuin aggregaatio
”on osa”, ”koostuu”
Kompositio
Assosiaation erikoistapaus
”on osa”, ”koostuu”
Aggregaatio
Yleinen suhde.”liittyy”Assosiaatio
ErityistäLukutapaSymboliSuhde
Termejä Polymorfismi (polymorphism) mahdollistaa
metodien uudelleenmäärittelyn periytetyille luokille
Abstraktointi (abstraction): turhan tiedon karsinta, jotta oleelliset asiat pääsevät esille
Tiedon piilotus (information hiding): piilotetaan käytön kannalta tarpeettomat yksityiskohdat
Kapselointi (encapsulation): kootaan toisiinsa liittyvät osat yhdeksi kokonaisuudeksi
What is polymorphism?(http://www.webopedia.com/TERM/p/polymorphism.html )
Generally, the ability to appear in many forms. In object-oriented programming, polymorphism refers to a programming language's ability to process objects differently depending on their data type or class. More specifically, it is the ability to redefine methods for derived classes. For example, given a base class shape, polymorphism enables the programmer to define different area methods for any number of derived classes, such as circles, rectangles and triangles. No matter what shape an object is, applying the area method to it will return the correct results. Polymorphism is considered to be a requirement of any true object-oriented programming language (OOPL).
What is information hiding?(http://www.webopedia.com/TERM/I/information_hiding.html )
In programming, the process of hiding details of an object or function. Information hiding is a powerful programming technique because it reduces complexity. One of the chief mechanisms for hiding information is encapsulation -- combining elements to create a larger entity. The programmer can then focus on the new object without worrying about the hidden details. In a sense, the entire hierarchy of programming languages -- from machine languages to high-level languages -- can be seen as a form of information hiding. Information hiding is also used to prevent programmers from changing --- intentionally or unintentionally -- parts of a program.
What is abstraction?(http://www.webopedia.com/TERM/A/abstraction.html )
The process of picking out (abstracting) common features of objects and procedures. A programmer would use abstraction, for example, to note that two functions perform almost the same task and can be combined into a single function. Abstraction is one of the most important techniques in software engineering and is closely related to two other important techniques -- encapsulation and information hiding. All three techniques are used to reduce complexity
What is encapsulation?(http://www.webopedia.com/TERM/e/encapsulation.html )
In programming, the process of combining elements to create a new entity. For example, a procedure is a type of encapsulation because it combines a series of computer instructions. Likewise, a complex data type, such as a record or class, relies on encapsulation. Object-oriented programming languages rely heavily on encapsulation to create high-level objects. Encapsulation is closely related to abstraction and information hiding.