Olio-ohjelmoinnin perusteet luento 1: Oliopohjaisuus ja oliopohjainen suunnittelu Jani Rönkkönen jani.ronkkonen@lut.fi Luennot muokattu Sami Jantusen ja.

Slides:



Advertisements
Samankaltaiset esitykset
Tuloksellinen Java-ohjelmointi Luku 3 Luokkien käyttäminen
Advertisements

18. Abstraktit tietotyypit
Rajapintaluokat Rajapintaluokka luettelee metodit, joille tulee löytyä toteutus asianomaisen rajapinnan toteuttavista luokista. Rajapintaluokka on siis.
– Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä.
Koostumussuhde Jukka Juslin © Jukka Juslin.
Ohjelmiston tekninen suunnittelu
Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
Muutamia käsitteitätMyn1 Muutamia käsitteitä •Perintä (inheritance) on luokkien välinen suhde, jossa johdettu luokka (subclass, derived class) perii kantaluokan,
Luokkakaaviot Luokkakaaviot Tekninen suunnittelu.
Tietokanta.
Olio-ohjelmointi. Mitä olio-ohjelmointi on ?  Pyritään mallintamaan jotain reaalimaailman kohdetta tietokoneohjelman avulla  Olio on luokan ilmentymä.
Tekninen suunnit-telu
Johdetun luokan määrittely tMyn1 Johdetun luokan määrittely •Kun johdettu luokka periytetään kantaluokasta, saadaan kantaluokan jäsenet enemmän tai vähemmän.
1. Olio-ohjelmointi.
Olio-mallinnus Tietojärjestelmien suunnittelu KYAMK, Liiketalous, Kouvola Jarkko Ansamäki, 2002.
Perintä. Yleistä Olio-ohjelmoinnin menetelmä muodostaa uusia luokkia aiemmin määriteltyjen luokkien avulla Luokka saa automaattisesti käyttöönsä kaikki.
Antti-Jussi Lakanen Nuorten peliohjelmointi 2009 / Jyväskylän yliopisto.
OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT. LUOKKA JAVA ohjelma koostuu luokista LUOKKA sisältää metodeja molemmat sisältävät attribuutteja eli muuttujia.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
@ Leena Lahtinen Helia OHJELMOINTITAITO ICT02D 12 OP.
OHJELMOINTITAITO ICT02D 12 ECTS. OPINTOJAKSON TOTEUTUS  KESTO: –  PÄIVÄOPISKELIJAT: – KAKSI LUOKAA (SUOMI) –YKSI LUOKKA (ENGLANTI)
Olio-ohjelmoinnin perusteet luento 3
2. Vuokaaviot.
Sami Jantunen LTY/Tietotekniikan osasto
13. Hyvä ohjelmointitapa (osa 1)
© Jukka Harju, Jukka Juslin
1 Kertaus koetta varten oleellisista asioista Jukka Juslin.
Johdatus ohjelmointiin Ohjelmistosuunnittelu Jaana Holvikivi.
Kuinka tehdä blogi o365:ssä
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
5. Kapselointi Yleistä Kapseloinnilla (encapsulation) tarkoitetaan luokan tietojen ja toimintojen pakkaamista yhdeksi suojatuksi kokonaisuudeksi.
10. Abstrakti luokka Johdanto Abstrakti luokka (abstract class) poikkeaa konkreettisesta luokasta (ei-abstrakti luokka) siten, että siitä ei.
Johdanto Teppo Räisänen, Principal Lecturer Oulu University of Applied Sciences, School of Business and Information Management
C 1. Testaus on ”sarja toimintoja” Itse asiassa, testaus on vuorovaikutusta, jota rytmittää ohjelmiston arviointi. Vaikka on hyödyllistä tunnistaa sarja.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
OHJELMOINTITAITO ICT02D 12 ECTS. OPINTOJAKSON TOTEUTUS  KESTO: –  AVOIMEN OPISKELIJAT: – YKSI LUOKA (SUOMI) – LUOKKA ICT02O-1.
Komponenttipohjainen ohjelmistotekniikka (TJTSS56) Osa 4 Kevätlukukausi 2010 Jyväskylän yliopisto Tietojenkäsittelytieteiden laitos Markku Sakkinen.
@ Leena Lahtinen Toistorakenne Ohjelmassa toistetaan tiettyjä toimenpiteitä monta kertaa peräkkäin Toisto noudattaa sille kuuluvia tarkkoja standardoituja.
– Ohjelmistojen mallintaminen, mallintaminen ja UML.
Mallinnustavat.
Rinnakkaisuus Järjestelmässä, jossa voi olla useita prosesseja rinnakkain suorituksessa voi tulla tilanteita, joissa prosessien suoritusta täytyy kontrolloida.
Jouni Juntunen Oulun seudun ammattikorkeakoulu Liiketalouden yksikkö
Johdetun luokan olion esittely... tMyn1 Johdetun luokan olion esittely ja määrittely Esittelyluokka tarkoittaa olion tunnuksen luokkaa. Määrittelyluokka.
Oliot ja luokat Oliot ja luokat Oliot (object) ja luokat (class) ovat keskeisiä olio- ohjelmoinnin käsitteitä. Olio-ohjelmointi on ohjelmointiparadigma,
Vesa Ollikainen & Outi Grotenfelt
11. Rajapinnat Sisällys Mitä rajapinnat ovat? Kuinka ne määritellään ja otetaan käyttöön? Moniperiytyminen rajapintojen avulla. Varoituksen.
Monimuotoinen luokka tMyn1 Monimuotoinen luokka Monimuotoinen luokka mahdollistaa saman jäsenfunktion toteutuksen monella tavalla. Tällöin puhutaan virtuaalisesta.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
1 © Jukka Juslin Luokat, attribuutit ja metodit Yleistietoa: seuraavalla koulutusviikolla tarkempi käsittely.
8. Periytyminen Sisällys Mitä on periytyminen? Yksittäis- ja moniperiytyminen. Oliot ja perityt luokat. Periytymisen käyttö.
LTY/Tietotekniikan osasto
Ohjelmistotuotannon menetelmät Syksy 2003 Oliopohjainen suunnittelu (Sami Jantunen, LTY/TITE)
LTY/Tietotekniikan osasto
UML-luokkakaavio ● Luokkakaavio (class diagram) kuvaa järjestelmän luokkarakennetta ● Mitä luokkia on olemassa ● Minkälaisia luokat ovat ● Luokkien suhteet.
5. Kapselointi.
1. Olio-ohjelmointi.
OHJELMOINTITAITO ICT02D 12 Leena Lahtinen Helia
Rajapintaluokat Rajapintaluokka luettelee metodit, joille tulee löytyä toteutus asianomaisen rajapinnan toteuttavista luokista. Rajapintaluokka on siis.
Muutamia käsitteitä Perintä (inheritance) on luokkien välinen suhde, jossa johdettu luokka (subclass, derived class) perii kantaluokan, perusluokan (superclass,
14. Hyvä ohjelmointitapa.
OHJELMOINTITAITO ICT02D 12 Leena Lahtinen Helia
8. Periytyminen.
OHJELMOINTITAITO ICT02D 12 ECTS.
OHJELMOINTITAITO ICT02D 12 ECTS.
3. Attribuutit.
8. Periytyminen.
4. Luokan testaus ja käyttö olion kautta
2. Olio-ohjelmoinnin perusteita
1. Olio-ohjelmointi.
OHJELMOINTITAITO ICT02D 12 ECTS.
Esityksen transkriptio:

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 Luennoitsija: Jani Rönkkönen (jani.ronkkonen@lut.fi) 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  Tavoite  Ei! 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ä.

Sisältö Johdanto oliomaailmaan Oliopohjaisia käsitteitä 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 ohjelmointi proseduraalinen ohjelmointi modulaarinen ohjelmointi olio-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ääohjelmassanimikonfliktit 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ääh lää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. Käytetään siis kieltä, joka on koneen käsiteltävissä, mutta muistuttaa ainakin osin ihmisen tapaa jäsentää maailmaa. Bee wings sting flyAbout() Plant grow() Tree leaves Flower blossom pollen class Bee { Coordinates location; Wing[] wings; flyAbout() { ... }

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.

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.

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

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

Esimerkki: Viestivät oliot object opiskelijaolio#1 { String nimi = ”T. Teekkari”; String ammatti = ”opiskelija”; String koulutusohjelma = ”S”; int opiskelijanumero = 12345; Kurssi[] kurssit = ...; ilmoittaudu { ... } } OK, onnistuin. 9. T. Teekkari, ilmoittaudu kurssille X-123.456. 1. Hyvä, lisäänpä kurssilistaani. 8. X-123.456, ilmoita T. Teekkari (itseesi). 2. OK, onnistui. 7. Mahtuukohan se opetuspaikkaani? 3. object kurssiolio#1 { String koodi = ”X-123.456”; int opintoviikot = 3; Opiskelija[] ilmoittautuneet = ...; Sali opetuspaikka = saliolio#1; ilmoitaOpiskelija { ... } } Sali A23, kerro paikkojesi määrä. 4. Hmm, 31<50, joten mahtuu. Lisätään listaan. 6. object saliolio#1 { String nimi = ”Sali A23”; int paikkojenMaara = 50; kerroPaikkojenMaara { ... } } 50. 5.

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: Roskakorin luonti Käskyt: Lisää roskia, tyhjennä roskakori Onko kansi auki? Onko roskakori täynnä? Kyselyt:

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: väri, materiaali, haju Komponentit: kansi, roskapussi, roskat Assosiaatiot: 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 ASUNTO KATUOS.: ______ NIMI: __________ IHMINEN #A03 NIMI: Joonatan SILMÄT: ruskeat IKÄ: 17v. KOTI: asunto #B01 ASUNTO KATUOS.: ______ POSTIOS.: _____ KOKO: ___m2 ASUKKAAT: NIMI: __________ IHMINEN SILMÄT:________ IKÄ: __v. 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 SILMÄT: siniset IKÄ: 21v. KOTI: asunto #B02 IHMINEN #A02 NIMI: Jesper IKÄ: 19v. SILMÄT: vihreät KOTI: asunto #B01

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

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

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ä() Selkäjänteinen Luo munia Synnytä elävä poikanen Nisäkäs Lintu Synnytä() Synnytä()

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ä() Selkäjänteinen Luo munia Nisäkäs Lintu Synnytä() Synnytä() Luo munia Vesinokkaeläin Synnytä()

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) Kuvaa luokat ja niiden väliset suhteet Peruselementit: Luokat (tiedon tyyppi) Attribuutit (luokan sisältämä tieto) Operaatiot (luokan tarjoama toiminnallisuus) Assosiaatiot (luokkien väliset yhteydet) Yleistys (luokkien hierarkkisuus)

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

Luokkakaavion kehitysprosessi: Identifioi kandidaattiluokat Lisää assosiaatiot ja attribuutit Löydä yleistettävät asiat Määrittele luokkien vastuut Määrittele operaatiot 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 * * Elevator Controller

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

Notaatio assosiaatioiden tarkempaan kuvaukseen

Assosiaatioiden analysointi ja validointi One-to-one Miten tulkitaan?: 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-many Miten tulkitaan?: 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 Miten tulkitaan?: 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

Aggregaatio (Aggregation) Aggregaatiot ovat erikoistuneita assosiaatioita kuvaamaan luokan koostumista muista luokista Kokonaisuutta kuvaavaa puolta kutsutaan aggregaatiksi (aggregate) Aggregaatio kuvataan assosiaation päässä olevalla timantilla. Vehicle * * * * VehiclePart Country * * * * * * Region

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 osia Aggregaatio on assosiaation erikoistapaus – ei ole koskaan virhe käyttää assosiaatiota

Aggregaatiohierarkia Vehicle * * Chassis BodyPanel Door * Frame Engine Transmission Wheel

Kooste (Composition) Kooste on vahva aggregaatio Jos aggregaatti tuhotaan niin kaikki osatkin tuhotaan Kaksi vaihtoehtoista tapaa kuvata postiosoite: * * * * * Building Room

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 successor * Course isMutuallyExclusiveWith * * * prerequisite

Vältä turhia one-to-one assosiaatioita Vältä tätä: Ennemmin näin

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 name addresses street1 municipality1 provOrState1 country1 postalCode1 street2 municipality2 provOrState2 country2 postalCode2 Address street municipality provOrState country postalcode type Monikossa oleva attribuutti on huono Huono. Liian monta attribuuttia. Ei mahdollista lisätä osoitteita Hyvä ratkaisu. Voidaan määritellä erikseen onko kyseessä koti-, työ, … osoite

Yleistyksen notaatio 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» Person Machine Person Machine Cashier withdraw Cashier Cashier deposit Employee ATM Employee ATM

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

Sekvenssikaavio Aika kuluu ylhäältä alaspäin 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

Mitä attribuutteja ja suhteita on Rekka-luokalla? Entä Henkilöautolla? Mitä Perävaunu perii? Entä Vene?

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 Aggregaatio Yleinen suhde. ”liittyy” Assosiaatio Erityistä Lukutapa Symboli Suhde

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