1 / 93

Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu. Jani Rönkkönen jani.ronkkonen@lut.fi Luennot muokattu Sami Jantusen ja Kari Smolanderin aikaisempien vuosien luennoista. Käytännön asiat. Käytännön asiat.

slade
Download Presentation

Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Olio-ohjelmoinnin perusteetluento 1: Oliopohjaisuus ja oliopohjainen suunnittelu Jani Rönkkönen jani.ronkkonen@lut.fi Luennot muokattu Sami Jantusen ja Kari Smolanderin aikaisempien vuosien luennoista

  2. Käytännön asiat

  3. Käytännön asiat • Kurssin kotisivu toimii ensisijaisena tiedostuskanavana • Harjoitustyö julkaistaan tammikuun aikana • Harjoitukset alkavat jo tällä viikolla!

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

  5. Kurssin tavoitteista  Tavoite Oppia ymmärtämään oliopohjainen ajattelutapa ja sen käsitteet ja soveltaa näitä käytännössä (esim. C++ avulla) Ei! Oppia sujuvaksi C++:n syntaksissa, jotta voin jatkaa vanhaan tyyliin ohjelmoimista uudella kielellä.

  6. Sisältö • Johdanto oliomaailmaan • Historiaa • Oliopohjaisia käsitteitä • Olio • Luokka • Perintä • Toiminnan korvaaminen • Abstraktio (Abstraction) • Tiedon piilottaminen (Information hiding) • Kapselointi (Encapsulation) • Lyhyesti oliopohjaisesta suunnittelusta

  7. Historiaa…. Ohjelmointitekniikoiden evoluutio: jäsentelemätön ohjelmointi proseduraalinen ohjelmointi modulaarinen ohjelmointi olio-ohjelmointi

  8. Jäsentelemätön ohjelmointi Sarja komentoja, jotka manipuloivat globaalia tietoa - Esim. Assemblerilla tehty ohjelmointi Ongelmia(?): • Ei skaalaudu • Sotkuista koodia

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

  10. 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ääohjelmassanimikonfliktit • Muuttujia pääsee käsittelemään suoraan mistä tahansa

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

  12. Perinteinen ohjelmointi • Perinteisessä ohjelmoinnissa ihminen pyrkii muokkaamaan ajatuksensa sellaiseksi käskysarjaksi, jonka kone osaa suorittaa. Program PaintScene { while (exists()) { draw_this(); draw_that(); } } lääh lääh

  13. Plant grow() Bee wings sting Flower Tree flyAbout() blossom pollen leaves 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. • Käytetään siis kieltä, joka on koneen käsiteltävissä, mutta muistuttaa ainakin osin ihmisen tapaa jäsentää maailmaa. class Bee { Coordinates location; Wing[] wings; flyAbout() { ... } }

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

  15. Olio-ohjelmointi

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

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

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

  19. Kukkakauppaesimerkki jatkuu… • 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.

  20. Kukkakauppaesimerkki jatkuu… • Ongelmani siis ratkaistiin usean asiamiehen avulla. Ilman heidän apuaan ongelma ei olisi ratkennut helposti Puutarhuri Minä Ms. Wang Kukkakimpun kokoaja Kukkien kasvattaja Lappeenrannan kukkakauppias Juoksupoika Tukkumyyjä Pekingin Kukkakauppias

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

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

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

  24. Olioiden väliset viestit jatkuu… • Viestillä on nimetty vastaanottaja • Viestin tulkinta saattaa olla erilainen riippuen viestin vastaanottajastaMonimuotoisuus (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ä

  25. 1. OK, onnistuin. T. Teekkari, ilmoittaudu kurssille X-123.456. 9. Hyvä, lisäänpä kurssilistaani. 8. 2. X-123.456, ilmoita T. Teekkari (itseesi). OK, onnistui. 7. Mahtuukohan se opetuspaikkaani? 3. 4. Sali A23, kerro paikkojesi määrä. 50. 5. 6. Hmm, 31<50, joten mahtuu. Lisätään listaan. Esimerkki: Viestivät oliot 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 { ... } }

  26. Olioiden rakenne • Oliot sisältävät • Tilatietoja, joita olio käyttää toiminnallisuudessaan hyväksi • Toiminnallisuutta, joka toteuttaa oliolle annetut vastuut/tehtävät

  27. Olioiden toiminnallisuudesta • Olion toiminnallisuutta on yleensä: • konstruktiot: -olioiden luonti • käskyt: -olion tilan muutos • kyselyt: -vastauksen antaminen olion tilatietojen perusteella

  28. Esimerkki olion toiminnallisuudesta Mitä toiminnallisuutta roskakori voisi sisältää? Konstruktio: Roskakorin luonti Käskyt: Lisää roskia, tyhjennä roskakori Onko kansi auki? Onko roskakori täynnä? Kyselyt:

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

  30. Esimerkki olion tiedoista Mitä tietoa roskakori voisi sisältää? Attribuutit: väri, materiaali, haju Komponentit: kansi, roskapussi, roskat roskakori voi olla assosioitu huoneeseen missä se sijaitsee Assosiaatiot:

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

  32. Luokat ja oliot IHMINEN #A03 NIMI: Joonatan IKÄ: 17v. SILMÄT:ruskeat KOTI: asunto #B01 ASUNTO KATUOS.: ______ POSTIOS.: _____ KOKO: ___m2 ASUKKAAT: IHMINEN NIMI: __________ IKÄ: __v. SILMÄT:________ KOTI: asunto #___ ASUNTO #B01 KATUOS.: Rosvokuja 1 POSTIOS.: 010 KDM KOKO: 70 m2 ASUKKAAT: ihminen #A02, ihminen #A03 ASUNTO #B02 KATUOS.: Kaitapolku 7 POSTIOS.: 012 KDM KOKO: 25 m2 ASUKKAAT: ihminen #A01 IHMINEN #A01 NIMI: Kasper IKÄ: 21v. SILMÄT:siniset KOTI: asunto #B02 IHMINEN #A02 NIMI: Jesper IKÄ: 19v. SILMÄT:vihreät KOTI: asunto #B01

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

  34. Periytyminen jatkuu… • Eräs tapa ajatella periytymistä on organisoida tietoni kukkakauppiaasta hierarkiseksi rakenteeksi: • Kukkakauppias on erikoistunut kauppias • Kauppias on ihminen

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

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

  37. 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 onmyö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.

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

  39. Eliöiden luokittelu

  40. Eläin ... Niveljalkainen Selkäjänteinen ... ... Hämähäkkieläin Hyönteinen Matelija Nisäkäs Lintu ... ... ... ... ... Leppäkerttu Kissa Ihminen Periytyminen

  41. Selkäjänteinen Toiminnallisuuden korvaaminen • Nisäkkäät synnyttävät eläviä poikasia • Linnut munivat munia • Entäs vesinokkaeläin, joka on nisäkäs, mutta luo munia? Eläin Synnytä() Luo munia Synnytä elävä poikanen Nisäkäs Lintu Synnytä() Synnytä()

  42. Selkäjänteinen Toiminnallisuuden korvaaminen jatkuu…. Eläin • 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 Synnytä elävä poikanen Synnytä() Luo munia Nisäkäs Lintu Synnytä() Synnytä() Luo munia Vesinokkaeläin Synnytä()

  43. Abstraktio

  44. Abstraktio jatkuu…. • Ihminen voi käsittellä 7±2 yksityiskohtaa kerrallaan • Yleensä ei ole mahdollista, eikä järkevää esitää kokonaisuutta kaikkine yksityiskohtineen.

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

  46. “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

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

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

  49. 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ö

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

More Related