812347A Olio-ohjelmointi, 2015 syksy 2. vsk II Johdanto olio-ohjelmointiin
Sisältö 1. Abstraktiosta 2. Olio-ohjelmoinnin historiaa 3. Olioparadigmasta 4. Peruskäsitteiden esittely 2
II.1 Abstraktiosta Yleensä kohdejärjestelmä monimutkainen: tarvitaan abstraktio Prosessiabstraktio Jaetaan ohjelma erilaisiin proseduureihin Varhaisin abstraktion muoto Data-abstraktio Yhdistetään data sitä käsitteleviin operaatioihin Johti abstrakin tietotyypin syntyyn 3
II.1 Abstraktiosta (2) Abstrakti tietotyyppi (abstract data type, ADT) on tietotyyppi, joka toteuttaa ehdot: Tiedon kapselointi: Määrittely ja tietotyypin operaatiot määritelty yhdessä syntaktisessa yksikössä. Muut ohjelmayksiköt voivat muodostaa tämän tyypin muuttujia. Tiedon kätkentä: Määrittelyn ja operaatioiden yksityiskohdat eivät näy ulkopuoliselle käyttäjälle. ADT + periytyminen + monimuotoisuus = Olioohjelmointi 4
I.1 Abstraktiosta (3) Kapseloinnin hyödyt Data ja sitä käsittelevät operaatiot yhdessä -> Ohjelman tekninen ja looginen hallinta helpompaa Mentaalinen hahmottaminen on helpompaa Ohjelman osien välinen riippuvuus vähenee Kätkennän hyödyt Tietotyypin luotettavuus paranee Ylläpidettävyys helpottuu (ulospäin näkyvä rajapinta säilyy muuttumattomana) 5
II.2 Olio-ohjelmoinnin historiaa 1960-1970-lukujen vaihteessa havaittiin ongelmia Projektit eivät valmistuneet ajoissa tai ollenkaan Projektien budjetit ylittyivät Ohjelmat usein huonolaatuisia Tilanne nimettiin ohjelmistokriisiksi Otettiin käyttöön uusia tuotantoprosesseja Kehiteltiin uusia kieliä Esiteltiin uusia ohjelmointiparadigmoja mm. olioohjelmointi 6
I.2.1. 1960-luku: Simula67 Olio-ohjelmoinnin isät norjalaiset Kristen Nygaard (27.8.1926-10.8.2002) ja Ole-Johan Dahl (12.10.1931-29.6.2002) 1961 Simula I ohjelmointikieli simulointiin Pohjautui Algol60-kieleen Sisälsi luokan ja olion käsitteet 1967 Simula67 Täysimittainen ja yleiskäyttöinen ohjelmointikieli Myös periytyminen Ei juuri levinnyt akateemisen maailman ulkopuolelle 7
II.2.2 1980-luku Olio-ohjelmoinnin läpimurto Oliotekniikoiden käyttöönotto laajeni ohjelmointikielestä ja koodauksesta muihin kehitysvaiheisiin. Grady Booch 1980: Oliosuuntautuneen suunnittelun käsite Ensimmäinen kaupallinen oliotietokanta julkaistiin 1985. 8
I.2.2 1980-luku: Smalltalk Kehittäjä Alan Kay Xeroxin Palo Alton tutkimuskeskuksessa Julkistettiin 1980 Ohjelmointijärjestelmä Kayn kehittämälle Dynabook-tietokoneelle Puhdas oliokieli Kaikkien olioiden kantaluokka Object Sisälsi kattavan luokkakirjaston Ei merkittävää asemaa ohjelmistotuotannossa, vaikuttanut suuresti myöhempiin kieliin 9
II.2.2 1980-luku: C++ Kehittäjä Bjarne Stroustrup AT&T Bellin laboratoriossa http://www.research.att.com/~bs/homepage.html Työnimi C with classes C:hen lisätty oliotuki 1983 nimeksi C++ ja yleiseen käyttöön Voimakasta kehitystä 1980-luvulla, mm. Moniperintä Parametrisoidut tyypit Poikkeusten käsittely Standardisoitu 1997 Kieli + standardikirjasto Ei puhdas oliokieli vaan hybridi Melko vaikea käyttää, C-kielen perintö rasittaa 10
I.2.3 1990-luku: Java Pääasiallinen kehittäjä James Gosling Sun Microsystemsillä 1990-luvun puolivälissä Alun perin pienlaitteiden sulautetuksi ohjelmointikieleksi C++:aa pidettiin liian epäluotettavana Pohjautuu C++:aan, muutoksia: Ei moniperintää Kaikilla luokilla yhteinen kantaluokka Varatun muistin automaattinen vapautus Osoitintyyppi poistettu Lisäominaisuus rinnakkaisen ohjelmoinnin tuki Puhtaampi oliokieli kuin C++ Perustietotyypit eivät kuitenkaan olioita 11
II.3 Olioparadigmasta: paradigman tavoitteet Ongelman parempi mallintaminen Ohjelmistokomponenttien uudelleenkäytettävyys Lisää luotettavuutta Ohjelmistojen helppo laajennettavuus ja ylläpito Toivotaan auttavan tuottavuuden ja laadun ristiriidassa Parantaa sisäistä laatua: ohjelma modulaarinen, luettava, rakenteellinen Parantaa ulkoista laatua: loppukäyttäjän, kehittäjätiimin toisen jäsenen, jne näkökulmasta 12
II.3 Olioparadigmasta: Uudelleenkäyttö, laatu ja ohjelmoinnin tehokkuus Uudelleenkäyttö vs uudelleenkäytettävyys Käytetäänkö olemassa olevaa komponenttia uudelleen vai luodaanko komponentti uudelleenkäytettäväksi? Koodia ei ole varaa kirjoittaa moneen kertaan Ratkaisu voi soveltua sellaisenaan tai vain vähän räätälöitynä johonkin toiseenkin ongelmaan Laadittaessa uudelleenkäytettävää koodia myös laatu oletettavasti paranee Komponentin testaus useassa kontekstissa Ratkaisu suunniteltava yleiskäyttöiseksi ja laajennettavaksi Uudelleenkäytettävyyden merkitys kasvaa 13
II.3 Olioparadigmasta: paradigman haasteet Oliotekniikoiden täysi hyödyntäminen edellyttää erityistä olioajattelua Olioajattelun tulee kantaa koko kehitysprosessin läpi Miten soveltuu erilaisiin kehitysmenetelmiin? Ei sovi kaikkiin tilanteisiin 14
II.4 Peruskäsitteistön esittely: Luokka Ohjelmoijan määrittelemä tietotyyppi, joka toteuttaa tiedon kapseloinnin ja kätkennän Yhdistää siis tiedot ja niitä käsittelevät operaatiot Luokan jäsenet Jäsenmuuttujat (tietojäsenet) määrittelevät datan Metodit määrittelevät luokan operaatiot 15
II.4 Peruskäsitteistön esittely: Tiedon kätkentä Toteutetaan näkyvyysmääreillä Säätelevät miten jäsen näkyy luokan ulkopuolelle C++:ssa private, protected ja public Javassa lisäksi oletusnäkyvyys Private-tyyppiset jäsenet käytettävissä vain luokan sisällä Protected-tyyppiset myös luokan aliluokissa Public-tyyppiset kaikkialla Public-tyyppiset jäsenet = luokan ulospäin näkyvä rajapinta 16
II.4 Peruskäsitteistön esittely: Olio Luokasta tehty ilmentymä, instanssi Muuttuja, jonka tietotyyppi on luokka Yhdistelmä tilasta ja käyttäytymisestä Olion tila = sen jäsenmuuttujien kulloisetkin arvot Olion käyttäytymisen määräävät metodit 17
II.4 Peruskäsitteistön esittely: Periytyminen ja kooste Periytyminen: Luokan aliluokka perii kantaluokan piirteet Käytetään, kun aliluokan oliot ovat erikoistapauksia kantaluokan olioista ( is-a-relationship ) Kooste: Luokka (pääluokka) sisältää jäsenenään toisen luokan olion (komponentin) has-a-relationship Erikoistapaus aito kooste (kompositio) Komponentti voi olla olemassa ainoastaan pääluokan olion osana Komponentti voi olla osana ainoastaan yhdessä pääluokan oliossa 18
II.4 Peruskäsitteistön esittely: Luokkakaaviot Näkyvyydet: + julkinen - Yksityinen # suojattu ~ pakkaus (ei C++:ssa) Luokan nimi Luokan jäsenmuuttuja Luokan metodit Huomautus 19
II.4 Peruskäsitteistön esittely: Luokkakaaviot (2) Kooste. Strategy on Context-olion komponentti Periytyminen. ConcreteStrategy perii luokan Strategy 20
II.4 Peruskäsitteistön esittely: Luokkakaaviot (3) Assosiaatio. Client kutsuu Componentin metodia operation() Aito kooste (kompositio) 21