Olio-ohjelmointi Johdanto olio-ohjelmointiin



Samankaltaiset tiedostot
812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin

812341A Olio-ohjelmointi, I Johdanto

1. Olio-ohjelmointi 1.1

815338A Ohjelmointikielten periaatteet

Muutamia peruskäsitteitä

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Tenttikysymykset. + UML- kaavioiden mallintamistehtävät

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

UML Luokkakaavio 14:41

Abstraktit tietotyypit ja olio-ohjelmointi

P e d a c o d e ohjelmointikoulutus verkossa

TIE Samuel Lahtinen. Lyhyt UML-opas. UML -pikaesittely

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

19/20: Ikkuna olio-ohjelmoinnin maailmaan

Sisällys. 19. Unified Modeling Language (UML) Johdanto. Johdanto. Johdanto. Luokkakaavio:

Ohjelmistojen mallintaminen, mallintaminen ja UML

Ohjelmistojen mallintaminen Luokkakaaviot Harri Laine 1

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Mitä on periytyminen?

Kertaus: yleistys-erikoistus ja perintä

TIE Ohjelmistojen suunnittelu. Luento 8..9: moniperintä

9. Periytyminen Javassa 9.1

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

Sisällys. Mitä on periytyminen? Yksittäis- ja moniperiytyminen. Oliot ja perityt luokat. Periytymisen käyttö. 8.2

9. Periytyminen Javassa 9.1

UML -mallinnus LUOKKAKAAVIO EERO NOUSIAINEN

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

2. Olio-ohjelmoinista lyhyesti 2.1

Paikkatiedon mallinnus Dokumentoinnin ymmärtäminen. Lassi Lehto

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

TIE Principles of Programming Languages CEYLON

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Yhteydelle voi antaa nimen kumpaankin suuntaan Sille ei tarvise antaa lainkaan nimeä Yhteysnimen asemasta tai lisäksi voidaan käyttää roolinimiä

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

815338A Ohjelmointikielten periaatteet

15. Ohjelmoinnin tekniikkaa 15.1

P e d a c o d e ohjelmointikoulutus verkossa

Ohjelmistojen mallintaminen

Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen

815338A Ohjelmointikielten periaatteet

Ohjelmistojen mallintaminen, kesä 2010

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Objective-C. Ryhmä 35: Ilpo Kärki Aleksi Pälä

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

HELIA 1 (14) Outi Virkki Käyttöliittymät ja ohjlmiston suunnittelu

15. Ohjelmoinnin tekniikkaa 15.1

Johdatus sovellussuunnitteluun, s99, osa3 Helsingin yliopisto;/tktl Harri Laine 1. Olioiden väliset yhteydet. Olioiden väliset yhteydet

Ohjelmistotekniikan menetelmät, luokkamallin laatiminen

2. Olio-ohjelmoinnin perusteita 2.1

Luokkakaavion laatiminen

Johdatus sovellussuunnitteluun, s99, osa3 Helsingin yliopisto;/tktl Harri Laine 1. Olioiden väliset yhteydet. Olioiden väliset yhteydet

4. Olio-ohjelmoinista lyhyesti 4.1

Vastuuopettaja. Kurssiesite Olio-ohjelmoinnin perusteet Kevät Olio-ohjelmoinnin perusteet (5 op) Tavoitteena

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

UML-kielen formalisointi Object-Z:lla

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla.

Joskus yleistäminen voi tapahtua monen ominaisuuden pohjalta. Myös tällöin voi tulla moniperintätilanteita.

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

Luokkamalli LUOKKAKAAVIO. Tämän osan sisältö. Luokkamalli. Luokka ja olio. Luokkakaavio (class diagram)

UML - unified modeling language

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Common Lisp Object System

Tämän lisäksi listataan ranskalaisin viivoin järjestelmän tarjoama toiminnallisuus:

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Ohjelmistojen mallintaminen, kesä 2009

Ohjelmistotekniikan menetelmät, luokkamallin laatiminen

Suunnittelumallit. OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Oliosuuntautunut analyysi ja -suunnittelu 27. joulukuuta 2003

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Olio-ohjelmointi Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton. 1. Proxy (Edustaja)

Olio-ohjelmointi Johdanto suunnittelumalleihin. 1. Yleistä

Rajapinta (interface)

1. Omat operaatiot 1.1

Johdatus sovellussuunnitteluun, s99, osa2 Helsingin yliopisto;/tktl Harri Laine 1. Olioperustaisuus (object oriented)

Oliot viestivät metodeja kutsuen

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

Johdatus sovellussuunnitteluun, s99, osa2 Helsingin yliopisto;/tktl Harri Laine 1. Olioperustainen ohjelmistokehitys

KOHDELUOKAN MÄÄRITTELY

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VIII Suunnittelumallit Observer ja State

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Ohjelmoinnin peruskurssien laaja oppimäärä

Olioperustaisuus (object oriented)

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Johdanto. Olio (Object) Luokka (Class) Olion kuvaaminen

2. Olio-ohjelmoinnin perusteita 2.1

Hakemistojen sisällöt säilötään linkitetyille listalle.

Ohjelmistojen mallintaminen kertausta Harri Laine 1

Transkriptio:

Olio-ohjelmointi Johdanto olio-ohjelmointiin Ohjelmistoa kehitettäessä voidaan tunnistaa ainakin kaksi abstraktiota: prosessiabstraktio ja dataabstraktio. Prosessiabstraktio huomattiin jo varhain, koska algoritmien ja operaatioiden abstrahointi on välttämätöntä hallittaessa hiemankaan laajempia ohjelmakokonaisuuksia. Dataabstraktio keksittiin, kun havaittiin tarve yhdistää tietotyyppeihin operaatioita, joiden yksityiskohtia tietotyypin käyttäjän ei tarvitse tuntea. Data-abstraktio toteutetaan abstraktien tietotyyppien avulla; nämä tietotyypit puolestaan johtivat olio-ohjelmoinnin syntyyn. 1. Abstraktit tietotyypit Abstrakti tietotyyppi (abstract data type, ADT) on tietotyyppi, joka toteuttaa seuraavat ehdot ([Seb, s. 437]): 1. Tiedon kapselointi: Tyypin määrittely samoin kuin tietotyyppiin liittyvät operaatiot on määritelty yhdessä syntaktisessa yksikössä. Muut ohjelmayksiköt voivat muodostaa tämän tyypin muuttujia. 2. Tiedon kätkentä: Tyypin määrittelyn ja operaatioiden yksityiskohdat eivät näy tietotyypin ulkopuoliselle käyttäjälle. Kapselointi helpottaa laajan ohjelman teknistä ja loogista hallintaa, kun kootaan data ja sitä käsittelevät operaatiot yhteen. Tällöin ohjelman mentaalinen hahmottaminen on helpompaa. Lisäksi ohjelma voidaan jakaa yksiköihin, jotka ovat suhteellisen riippumattomia toisistaan. Tällöin muutos yhdessä osassa ei välttämättä edellytä muiden osien muuttamista tai kääntämistä. Tiedon kätkentä lisää tietotyypin luotettavuutta. Kun vain tietotyypin sisäiset operaatiot voivat väliaikaisesti rikkoa tietotyypin ilmentymän, ohjelmointivirheiden mahdollisuus pienenee. Koodin ylläpidettävyys helpottuu, koska tietotyypin sisäisten operaatioiden muuttuessa sen ulospäin näkyvä rajapinta säilyy muuttumattomana. Kun lisätään abstrakteihin tietotyyppeihin periytyminen ja monimuotoisuus, päädytäänkin olioohjelmointiin. 2. Historiaa Kun ohjelmistotuotanto laajeni 1960- ja 1970-lukujen vaihteessa, havaittiin myös monia ongelmia ohjelmointiprojekteissa. Oli tavallista, että projektit eivät valmistuneet ajoissa tai ollenkaan ja niiden budjetit ylittyivät. Lisäksi tuotetut ohjelmat olivat usein huonolaatuisia. Tätä tilannetta alettiin kutsua ohjelmistokriisiksi (the software crisis). Siitä lähtien on kehitetty monia ohjelmistotuotannon prosesseja ja ohjelmointiparadigmoja ongelman ratkaisuksi. Olioparadigma ja siihen liittyvät prosessit ovat nykyään varsin suosittu menetelmä. Paradigman käyttö suosii erityisesti koodin uudelleenkäytettävyyttä. Toimiviksi havaittujen ohjelmistokomponenttien uudelleenkäytön uskotaan myös lisäävän ohjelmien luotettavuutta. Kristen Nygaard ja Ole-Johan Dahl kehittivät Simula-kielen Norjan laskentakeskuksessa simulointitarkoituksiin vuonna 1961. Aluksi esiprosessori käänsi Simula-ohjelmat Algolkielisiksi. Kuitenkin Simula I:ssä käytettiin jo luokkia ja niistä luotuja olioita. Vuonna 1967 Simula I sai seuraajan, ensimmäisen varsinaisen olio-ohjelmointikielen, Simula67:n.

Simula67:ssä luokat ja niistä luodut oliot olivat peruskäsitteitä. Luokkia voitiin myös periä uusiin luokkiin. Kieli ei kuitenkaan levinnyt yleiseen käyttöön. Olio-ohjelmointikielet yleistyivät vasta 1980-luvulla. Suuri vaikutus myöhempiin oliokieliin on ollut Alan Kayn kehittämällä Smalltalkilla. Alan Kay työskenteli 1970-luvulla Xeroxin Palo Alton tutkimuskeskuksessa. Hän kehitti graafiseen käyttöliittymään pohjautuvaa henkilökohtaista tietokonetta, Dynabookia. Tämä oli erittäin radikaali ajatus 1970-luvun alussa, jolloin tietokoneet olivat suuria ja käyttöliittymät merkkipohjaisia. Smalltalk oli puhdas olioohjelmointikieli, jonka avulla Dynabookia hallittiin. Smalltalk ei ollut pelkästään kieli, vaan täydellinen ohjelmointijärjestelmä, ts. kielen ja ohjelmointiympäristön muodostama kokonaisuus. Smalltalk-kieliset ohjelmat koostuvat olioista, jotka kommunikoivat lähettämällä toisilleen viestejä. Kaikki luokat periytyvät viime kädessä yhteisestä Object-luokasta. Xerox aloitti Smalltalk-kielen jakelun vuonna 1980, mutta tämäkään kieli ei saavuttanut merkittävää asemaa ohjelmistotuotannossa. Alan Kay siirtyi Applelle, jossa hän vastasi Apple Macintoshin moniikkunaisesta hiirellä ohjattavasta käyttöliittymästä. Olio-ohjelmointi tukevoitti 1980-luvulla asemaansa ohjelmistotuotannossa sikäli, että silloin kehiteltiin myös olioparadigmaan sopivia tuotantoprosesseja suunnittelun ja ohjelmoinnin lisäksi. Vuosikymmenen alkupuolella syntyi ensimmäinen tuotantokäytössä yleistynyt olioohjelmointiin suunniteltu kieli: C++. Bjarne Stroustrup kehitti sen vuonna 1980 AT&T Bellin laboratoriossa nimellä C with classes lisäämällä C-kielen päälle oliotuen. Vuonna 1983 kieli otettiin käyttöön myös Bellin laboratorioiden ulkopuolella ja Rick Mascitti keksi nimen C++. Kieltä kehitettiin voimakkaasti 1980-luvulla; siihen lisättiin mm. moniperintä, parametrisoidut tyypit ja poikkeusten käsittely. C++ on standardisoitu vuonna 1997; standardi sisältää itse kielen ja C++:n standardikirjaston. C++ ei ole puhdas oliokieli vaan hybridi: sitä voidaan käyttää usean eri paradigman mukaiseen ohjelmointiin. C++-kieleen tehtiin laaja standardimuutos vuonna 2011: määriteltyä standardia kutsutaan nimellä C++11. Se on aiempien versioiden kanssa yhteensopiva, mutta se sisältää merkittäviä uudistuksia kieleen, mm. monisäieohjelmoinnin ja säännöllisten ilmausten tuki lisättiin. C++-kielen uusin standardi on joulukuussa 2014 hyväksytty C++14, joka oli huomattavasti maltillisempi uudistus. Suurempi muutos on tulossa vuonna 2017. Tällä kurssilla kehitettävät ohjelmat noudattavat kuitenkin enimmäkseen vuoden 1997 standardia. Java ilmestyi 1990-luvun puolivälissä. Sen pääasiallinen kehittäjä oli Sun Microsystemsillä työskennellyt James Gosling. Kieli kehitettiin alun perin elektronisten pienlaitteiden sulautetuksi ohjelmointikieleksi, koska C++:aa pidettiin liian epäluotettavana mm. siksi, että C++-ohjelmissa esiintyy yleisesti ohjelmoijan virheestä aiheutuvia muistivuotoja. Java pohjautuu C++-kieleen, mutta siitä on karsittu pois ohjelmointivirheitä aiheuttavia piirteitä. Kieli ei salli moniperintää ja kaikilla luokilla on yhteinen kantaluokka Object. Toisin kuin C++-kielessä, Javassa ohjelmoijan varaama käyttämätön muisti vapautetaan automaattisesti. Lisäksi osoitintyypistä on Javassa luovuttu. Lisäominaisuutena aiempiin C++-versioihin on rinnakkaisen ohjelmoinnin tuki. Java on myös puhtaampi oliokieli kuin C++, perustietotyypit eivät Javassa kuitenkaan ole olioita. Javasta ei tullut suosittua sulautettujen järjestelmien ohjelmointikielenä vaan siksi, että se soveltui ominaisuuksiensa vuoksi www-ohjelmointiin. 2000-luvulla on syntynyt ainakin yksi suosittu oliokieli, Microsoftin vuonna 2002 lanseeraama C#, joka on.net-alustassa käytettävä kieli. C# muistuttaa varsin paljon Javaa; James Gosling

onkin arvostellut kieltä Java-imitaationa. Myös oliosuuntautunut skriptikieli Python on saavuttanut 2000-luvulla suurta suosiota; sen oliotuki on kuitenkin hieman rajoittunut. Lisätietoa olio-ohjelmointikielistä löytää esimerkiksi lähteistä [Har] ja [Seb]. 3. Peruskäsitteistön esittelyä ja merkintöjä Luokka on olio-ohjelmoinnin peruskäsite. Se on ohjelmoijan määrittelemä tietotyyppi, joka toteuttaa tiedon kapseloinnin ja kätkennän. Olio on luokasta tehty ilmentymä, oliot ovat siis ohjelmassa luokan tietotyyppisiä muuttujia. Luokan jäsenet voivat olla jäsenmuuttujia tai metodeja. Jäsenmuuttujat eli attribuutit määräävät luokan sisältämän datan, ne muistuttavat ohjelmointikielen muuttujia. Metodit taas muistuttavat funktioita ja ne määräävät luokan operaatiot. Näihin kuuluvat sekä palvelut, jotka luokka tarjoaa sen käyttäjille että luokan sisäiset operaatiot. Tiedon kätkentä toteutetaan antamalla luokan jäsenille näkyvyysmääreitä, jotka säätelevät miten jäsen näkyy luokan ulkopuolelle. Näkyvyys koskee sekä jäsenmuuttujia että metodeja. C++-kielessä näkyvyysmääreet ovat private, protected ja public. Näiden määreiden merkitystä käsitellään tarkemmin osassa Olioperusteinen ohjelmointi C++-kielellä. Private-tyyppiset jäsenet ovat käytettävissä ainoastaan luokan sisällä mutta public-tyyppiset kaikkialla. Protectedtyyppiset attribuutit näkyvät luokassa ja sen aliluokissa eli luokan perivissä luokissa. Javakielessä on lisäksi ns. oletusnäkyvyys, jota käytetään, mikäli näkyvyysmäärettä ei anneta lainkaan. Itse asiassa näkyvyys on sekä C++:ssa että Javassa hieman monimutkaisempaa, mutta siihen ei puututa tässä. Public-tyyppiset attribuutit muodostavat luokan ulospäin näkyvän rajapinnan. Yleensä tämä koostuu julkisista metodeista, jotka määräävät luokan käyttäjilleen tarjoamat palvelut. Luokan palveluja käytetään siten kutsumalla sen olioiden julkisia metodeja. Yleensä jäsenmuuttujia ei sisällytetä luokan julkiseen rajapintaan vaan jäsenmuuttujia manipuloidaan ainoastaan tähän tarkoitukseen laadittujen metodien avulla. Tällöin voidaan nimittäin varmemmin valvoa, ettei olion sisäinen tila rikkoudu. Ohjelmien kuvaamiseen ja niiden mallintamiseen käytetään nykyisin useimmiten UMLkuvauskieltä (Unified Modeling Language). Se on käytössä myös tällä kurssilla ja rinnakkaisella kurssilla Oliosuuntautunut analyysi ja suunnittelu. Viimeksi mainitulla kurssilla perehdytään kielen mahdollisuuksiin tarkemmin. Ohjelman luokkarakenne esitetään UML:ssä luokkakaaviolla. Alla on esitetty UML-merkinnällä luokka TMBaseClass, jolla on yksi yksityinen jäsenmuuttuja, yksi julkinen metodi ja kaksi suojattua metodia. Muuttujat ja metodit erotetaan vaakaviivalla. Kuvioon on myös lisätty huomautus, joka kertoo metodin templatemethod() toiminnan. Javan oletusnäkyvyystyypin (pakkausnäkyvyyden) symbolina käytetään merkkiä ~. Esimerkki luokkakaaviosta.

Usein olemassa olevaa luokkaa halutaan erikoistaa ja muodostaa uusi luokka. Tällöin olemassa oleva luokka peritään uuteen luokkaan eli aliluokkaan, joka perii kantaluokkansa ominaisuudet. Joissakin kielissä (esimerkiksi C++:ssa) luokka voi periä useammankin luokan; toisissa (kuten Javassa) periytyminen on rajoitettu yhteen luokkaan. Seuraavassa on UML-merkinnällä esitetty tilanne, jossa ConcreteStrategy-luokka perii Strategy-luokan. Periytyminen UML-merkinnällä. Periytymistä käytetään yleensä, kun uuden luokan oliot ovat erikoistapauksia kantaluokan olioista. Esimerkiksi yllä olevassa kaaviossa voidaan olettaa, että luokan ConcreteStrategy oliot ovat eräänlaisia Strategy-olioita. Mikäli luokka perii (toteuttaa) rajapinnan, voidaan nuolessa käyttää katkoviivaa. Periytymistä käsitellään tarkemmin osassa Periytyminen ja monimuotoisuus. Monesti näkee periytymistä käytettävän sellaisessakin tapauksessa, että uuden luokan olio itse asiassa käsitteellisesti sisältää kantaluokan olion. Tällöin on loogisempaa käyttää koostetta; alkuperäisen luokan olio (tai useampia olioita) on attribuuttina uudessa luokassa. Esimerkiksi yllä Context-luokan olio sisältää yksityisenä attribuuttinaan Strategy-luokan olion. Koosteen erikoistapaus on aito kooste eli kompositio, jolloin UML-notaatiossa käytetään valkean salmiakkikuvion asemasta mustaa. Aidon koosteen tapauksessa komponentin suhde pääluokkaan on seuraava: 1. Komponentti voi olla olemassa ainoastaan pääluokan olion osana. 2. Komponentti voi olla osana ainoastaan yhdessä pääluokan oliossa. Koosteolioita käsiteltäessä pitää kiinnittää erityishuomiota olioiden kopioimiseen ja niiden yhtäsuuruuden vertailuun. Kooste on erikoistapaus luokkien välisestä assosiaatiosta, joka on kahden tai useamman välinen suhde, viittaus tai riippuvuus. Assosiaatiota merkitään luokkien välisellä janalla, jossa voi olla myös nuoli merkitsemässä lukusuuntaa. Assosiaatiolle voidaan antaa nimi ja lisäksi merkitä kertautuminen, ts. niiden olioiden lukumäärä, joita assosiaatio voi vähimmillään ja enimmillään yhdistää.

Esimerkki Composite-suunnittelumallin luokkakaavio. Edellä oleva esimerkkikaavio kuvaa ns. Composite-suunnittelumallin rakennetta. Siinä Client käyttää Component-luokan operation()-metodia. Tämä assosiaatio on merkitty kaavioon. Kaaviossa näkyy myös aito kooste: Component-oliot sisältyvät johonkin Composite-säiliöön. Lähteet [Har] Harsu, Maarit. Ohjelmointikielet, Periaatteet, käsitteet, valintaperusteet, Talentum 2005. [Seb] Sebesta, Robert W. Concepts of Programming Languages 5th edition, Addison-Wesley 2002