olio-ohjelmoinnin perusteet luento 1: oliopohjaisuus ja oliopohjainen suunnittelu

93
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

Upload: slade

Post on 27-Jan-2016

77 views

Category:

Documents


0 download

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 Presentation

TRANSCRIPT

Page 1: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Olio-ohjelmoinnin perusteetluento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Jani Rönkkö[email protected]

Luennot muokattu Sami Jantusen ja Kari Smolanderin aikaisempien vuosien luennoista

Page 2: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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)

Page 3: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Käytännön asiat

Kurssin kotisivu toimii ensisijaisena tiedostuskanavana

Harjoitustyö julkaistaan tammikuun aikana

Harjoitukset alkavat jo tällä viikolla!

Page 4: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 5: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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ä.

Page 6: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Sisältö Johdanto oliomaailmaan

Historiaa Oliopohjaisia käsitteitä

Olio Luokka Perintä Toiminnan korvaaminen Abstraktio (Abstraction) Tiedon piilottaminen (Information hiding) Kapselointi (Encapsulation)

Lyhyesti oliopohjaisesta suunnittelusta

Page 7: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Historiaa….

Ohjelmointitekniikoiden evoluutio:

jäsentelemätön ohjelmointiproseduraalinen ohjelmointi

modulaarinen ohjelmointiolio-ohjelmointi

Page 8: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Jäsentelemätön ohjelmointi

Sarja komentoja, jotka manipuloivat globaalia tietoa

- Esim. Assemblerilla tehty ohjelmointi

Ongelmia(?): Ei skaalaudu Sotkuista koodia

Page 9: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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ä

Page 10: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 11: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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.

Page 12: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 13: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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.

Page 14: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 15: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Olio-ohjelmointi

Page 16: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 17: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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).

Page 18: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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.

Page 19: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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…

Page 20: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 21: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 22: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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ä

Page 23: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 24: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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ä

Page 25: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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.

Page 26: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Olioiden rakenne

Oliot sisältävät Tilatietoja, joita olio käyttää

toiminnallisuudessaan hyväksi Toiminnallisuutta, joka toteuttaa

oliolle annetut vastuut/tehtävät

Page 27: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Olioiden toiminnallisuudesta

Olion toiminnallisuutta on yleensä: konstruktiot: -olioiden luonti käskyt: -olion tilan muutos kyselyt: -vastauksen antaminen olion

tilatietojen perusteella

Page 28: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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ä?

Page 29: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 30: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 31: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 32: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 33: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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.

Page 34: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Periytyminen jatkuu…

Eräs tapa ajatella periytymistä on organisoida tietoni kukkakauppiaasta hierarkiseksi rakenteeksi: Kukkakauppias on erikoistunut

kauppias Kauppias on ihminen

Page 35: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 36: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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ä

Page 37: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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.

Page 38: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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ä.

Page 39: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Eliöiden luokittelu

Page 40: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

PeriytyminenEläin

...Niveljalkainen Selkäjänteinen

Hämähäkkieläin Hyönteinen Matelija Nisäkäs Lintu

...

......

... ......

Leppäkerttu Kissa Ihminen

...

Page 41: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 42: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 43: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Abstraktio

Page 44: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Abstraktio jatkuu….

Ihminen voi käsittellä 7±2 yksityiskohtaa kerrallaan

Yleensä ei ole mahdollista, eikä järkevää esitää kokonaisuutta kaikkine yksityiskohtineen.

Page 45: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 46: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

“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

Page 47: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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)

Page 48: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 49: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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ö

Page 50: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 51: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 52: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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ä

Page 53: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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:

Page 54: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 55: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 56: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 57: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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ää

Page 58: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 59: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 60: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Notaatio assosioitujen luokkien lukumäärän määrittelyyn

0,3..8 ******

Employee

*

* *****1..*

*0..1

Secretary

Office

Person

Company

Employee Company

Manager

BoardOfDirectors

BoardOfDirectors

Page 61: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Notaatio assosiaatioiden tarkempaan kuvaukseen

*

supervisor

*****1..*

* worksFor

*allocatedTo0..1

boardMember

0,3..8 ******

Employee

Secretary

Office

Person

Company

Employee Company

Manager

BoardOfDirectors

BoardOfDirectors

Page 62: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 63: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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ä

Page 64: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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?:

Page 65: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 66: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 67: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Aggregaatiohierarkia

* *

*

WheelTransmissionEngineFrame

DoorBodyPanelChassis

Vehicle

Page 68: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Kooste on vahva aggregaatio Jos aggregaatti tuhotaan niin kaikki osatkin

tuhotaan

Kaksi vaihtoehtoista tapaa kuvata postiosoite:

Kooste (Composition)

***** RoomBuilding

EmployeeEmployeeaddress: Address

AddressstreetmunicipalityregioncountrypostalCode

Page 69: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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* *

Page 70: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Rekursiivinen assosiaatio(Recursive associations)

On mahdollista, että luokalla on assosiaatio itsensä kanssa

Course *isMutuallyExclusiveWith

*

*

prerequisite

successor *

Page 71: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Vältä turhia one-to-one assosiaatioita

Vältä tätä: Ennemmin näin

Person

nameaddressemailbirthdate

Person

name

PersonInfo

addressemailbirthdate

Page 72: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 73: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 74: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Yleistyksen notaatio

Animal Animal

habitat typeOfFood

HerbivoreCarnivoreLandAnimalAquaticAnimal

Yleistyksellä (generalization) kuvataan periytymistä.

Page 75: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 76: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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.

Page 77: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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ö

Page 78: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 79: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 80: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 81: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 82: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 83: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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)

Page 84: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 85: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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()

Page 86: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 87: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 88: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu
Page 89: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 90: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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).

Page 91: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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.

Page 92: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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

Page 93: Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

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.