arvostelija Aspektiohjelmointi Juuso Hyvönen Helsinki Kandidaatintutkielma HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Koko: px
Aloita esitys sivulta:

Download "arvostelija Aspektiohjelmointi Juuso Hyvönen Helsinki Kandidaatintutkielma HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos"

Transkriptio

1 hyväksymispäivä arvosana arvostelija Aspektiohjelmointi Juuso Hyvönen Helsinki Kandidaatintutkielma HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

2 HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta Fakultet Faculty Laitos Institution Department Matemaattis-luonnontieteellinen tiedekunta Tekijä Författare Author Juuso Hyvönen Työn nimi Arbetets titel Title Tietojenkäsittelytieteen laitos Aspektiohjelmointi Oppiaine Läroämne Subject Tietojenkäsittelytiede Työn laji Arbetets art Level Aika Datum Month and year Sivumäärä Sidoantal Number of pages Kandidaatintutkielma sivua Tiivistelmä Referat Abstract Aspektiohjelmointi on ohjelmointiparadigma, joka pyrkii lisäämään ohjelmakoodin modulaarisuutta kapseloimalla läpileikkaavat ongelmat omiksi komponenteikseen. Läpileikkaavilla ongelmilla tarkoitetaan ohjelmointiongelmia, joiden ratkaiseminen perinteisillä ohjelmointiparadigmoilla on mahdotonta tai hyvin vaikeaa ilman toteutuksen hajoamista toisteisena järjestelmän eri komponentteihin. Läpileikkaavia ongelmia ovat esimerkiksi lokikirjoitus, transaktioiden hallinta sekä poikkeusten käsittely. ACM Computing Classification System (CCS): D.2.13 [Reusable Software]: Reuse models D.3.2 [Language Classifications]: Multiparadigm languages D.3.4 [Processors]: Compilers Avainsanat Nyckelord Keywords Aspektiohjelmointi, ohjelmointitekniikka, ohjelmointiparadigmat, AspectJ, kääntäjät Säilytyspaikka Förvaringsställe Where deposited Muita tietoja övriga uppgifter Additional information

3 Sisältö ii 1 Johdanto 1 2 Läpileikkaava ongelma Ratkaisun modularisointi Aspektiohjelmointikieli Määrällistäminen ja tietämättömyys AspectJ Toteutustekniikat Koodin generointi Suoritusaikainen punonta Hyödyt Koodin laatu Koodin tehokkuus Ohjelmoijan tuottavuus Yhteenveto 19 Lähteet 21

4 1 Johdanto 1 Ohjelmointiongelma ratkaistaan tyypillisesti pilkkomalla ongelma pieniin aliongelmiin, jotka ratkaisemalla saadaan koottua ratkaisu varsinaiseen ongelmaan. Olioohjelmointi tuo perinteisen proseduraalisen ohjelmoinnin ja funktionaalisen ohjelmoinnin rinnalle uuden paradigman, jossa loogisesti samaan ongelmaan kuuluva koodi kirjoitetaan yhteen luokkaan, josta suoritusaikana luodaan ilmentymiä olioita [Pok89, s. 97]. Näin ongelmanratkaisun vastuujako saadaan suoritettua helposti hahmotettavalla tavalla, mikä lisää esimerkiksi ohjelman ylläpidettävyyttä. Jotkin ongelmat ovat kuitenkin luonteeltaan sellaisia, että niiden ratkaiseminen edellä mainituilla ohjelmointiparadigmoilla ei ole luontevaa. Kun ohjelmointiparadigma ei ole optimaalinen ongelman ratkaisuun, on mahdollista, että ongelman ratkaisu hajautuu toisteisena eri puolillle ohjelman lähdekoodia. Samalla koodista tulee helposti vaikealukuista ja huonosti ylläpidettävää [Kic97, s. 1-2]. Luokkaa ohjelmoidessaan ohjelmoija joutuu usein toteuttamaan luokkaan perustoiminnallisuuden lisäksi lokikirjaukset toteuttavan logiikan sekä tietoturvaominaisuuksia kuten käyttöoikeuksien tarkistamisen. Lisäksi esimerkiksi tietokantaa käyttäviin luokkiin joudutaan toteuttamaan transaktionhallintamekanismi. Näiden ominaisuuksien sisällyttäminen jokaiseen niitä tarvitsevaan luokkaan lisää ohjelman koodimäärää merkittävästi. On myös huomattava, että jos esimerkiksi tietoturvaratkaisuihin tulee muutoksia, on ympäri järjestelmää hajautetun tietoturvakoodin päivittäminen työlästä ja virhealtista. Edellisen kappaleen esimerkissä luokkaan mainittiin varsinaisen perusongelman ratkaisun lisäksi kolme toimintoa, jotka eivät varsinaisesti ole luokan toiminnan kannalta olennaisia tai joiden toteutusvastuun antaminen luokalle ei ole aivan yksiselitteistä. On hyvin todennäköistä, että nämä samat toiminnot joudutaan toteuttamaan suureen osaan järjestelmän komponentteja, jolloin syntyy huomattava määrä tois-

5 2 teista koodia. Tällaisia järjestelmän monia komponentteja koskettavia ongelmia kutsutaan luonteeltaan järjestelmää läpileikkaaviksi (Cross-cutting concern) [Kic97, s. 7]. Niitä on vaikea ratkaista hajauttamatta ratkaisun vaatimia koodijaksoja moniin järjestelmän komponentteihin. Ongelman ratkaisuista perinteisin menetelmin seuraa seuraavia ongelmia [Påh02, s. 5]: Koodin uudelleenkäytettävyys huononee, kun komponenteissa on ylimääräisiä järjestelmäspesifisiä yksityiskohtia. Ohjelmoijan tuottavuus laskee, kun ohjelmoidessa tulee kiinnittää huomiota perusongelman ulkopuolisiin yksityiskohtiin. Järjestelmän jatkokehitettävyys kärsii, kun uusien vaatimusten toteuttaminen vaatii eri puolilla järjestelmää tehtäviä muutoksia myös osiin, jotka eivät muuten olisi uuden vaatimuksen toteuttamisen kannalta olennaisia. Läpileikkaavien ongelmien ratkaisuksi on ehdotettu kokonaan uutta ohjelmointiparadigmaa, aspektiohjelmointia (Aspect-Oriented programming) [Kic97]. Aspektiohjelmointi tukee ajatusta haasteiden eriyttämisestä (Separation of concerns) [Dij82]. Sen ideana on lisätä ohjelman modulaarisuutta liittämällä läpileikkaavan ominaisuuden toteuttava komponentti ennalta määriteltyihin liitoskohtiin (Join point). Liitoskohtia voivat olla esimerkiksi metodin tai konstruktorin kutsu, olion alustus tai poikkeuskäsittelijän suoritus. Aiemmin esitellyt ongelmat voidaan ratkaista toteuttamalla kunkin ongelman ratkaisemiseksi oma, vain kyseisen ongelman ratkaisuun erikoistunut komponentti ja liittämällä se pääohjelmaan tekemällä erityinen liitoskohtamääritys (Pointcut). Liitoskohtamääritys sekä liitoskohdissa suoritettava komponentti, jota kutsutaan neuvoksi (Advice), muodostavat yhdessä aspektin (Aspect). Aspektit liitetään koodin erityisellä aspektipunojalla (Aspect weaver). Aspektipunoja liittää aspektit osaksi varsinaista kääntäjälle annettavaa ohjelmakoodia. Tämän jälkeen koodi voidaan kääntää kielen omalla kääntäjällä, minkä jälkeen ohjelma on valmis suoritettavaksi.

6 2 Läpileikkaava ongelma 3 Aspektiohjelmointi pyrkii helpottamaan ohjelmistokehitystä ratkaisemalla läpileikkaavien ongelmien aiheuttaman koodin pirstaloitumisen [Kic97, s. 9]. Läpileikkaavalla ongelmalla tarkoitetaan haastetta, jota ei voi perinteisillä ohjelmointiparadigmoilla eriyttää selvästi omaksi komponentikseen, vaan sen toteutus hajautuu toisteisena eri puolille ohjelman lähdekoodia. Luokkaan joudutaan usein toteuttamaan sen perustoiminnallisuuden lisäksi huomattavasti muutakin logiikkaa kuten metodikutsujen synkronointia, lokikirjausten pito tai esimerkiksi tietoturvaominaisuuksia [Påh02, s. 4]. Nämä ominaisuudet toteutetaan siis luokkaan tai vaihtoehtoisesti luokka kutsuu näitä ominaisuuksia toteuttavia komponentteja. Koodin on usein toisteista ja sitä syntyy huomattavia määriä, mikä tekee ohjelman rakenteesta sotkuista (Tangled code) [Kic97, s. 8]. Kuva 1 havainnollistaa läpileikkaavan ongelman hajautumista järjestelmän eri komponentteihin. Kuva 1. Läpileikkaavat ongelmat koskettavat useita järjestelmän komponentteja. Aspektiohjelmointi jakaa ohjelmointiongelmat kahteen kategoriaan [Kic97, s. 8]. Ominaisuus on peruskomponentti (Component), jos se on puhtaasti kapseloitavissa

7 4 yleisestetyksi toiminnallisuudeksi (Procedure). Toiminnallisuudella tarkoitetaan tässä esimerkiksi oliota, metodia, proseduuria tai API:a. Ominaisuus on aspekti, jos sitä ei voi puhtaasti kapseloida yleistetyksi proseduuriksi. Aspektit eivät tyypillisesti ole selkeitä järjestelmän yksittäisiä osia vaan ne ovat enemmänkin peruskomponenttien ominaisuuksia. Tämä kategorisointi tuo esiin aspektiohjelmoinnin tavoitteen. Järjestelmä voidaan abstrahoida selkeästi eri luonteisiksi osiksi, joista voidaan lopulta koota valmis järjestelmä. 2.1 Ratkaisun modularisointi Johdannossa annettiin esimerkkejä tyypillisistä läpileikkaavista ongelmista. Seuraavaksi esitellään yksinkertainen läpileikkaava ongelma ja sen ratkaisu esimerkkilistauksineen. Ohjelmistokehittäjä on kehittänyt pelin, jossa ohjataan ruudulla näkyviä esineitä. Jokainen ruudulla näkyvä esine toteuttaa MovableObject -rajapinnan, joka tarjoaa setterin x- ja y-koordinaateille. Jokaisen setterikutsun jälkeen näyttöluokkaa täytyy tiedottaa tapahtuneesta muutoksesta, joten setteri hoitaa myös tämän. Erilaisia liikuteltavia objekteja voi olla suuri määrä, mutta kaikissa näissä toistuu listauksessa 1 esitetty rakenne. public class Ship implements MovableObject { private int x; private int public void setxy(int x, int y) { this.x = x; this.y = y; Display.notify(); // Tiedota näyttöä muutoksesta } } Listaus 1. Luokka Ship toteuttaa rajapinnan MovableObject.

8 5 Tiedottamisesta syntyy ongelma, jos esimerkiksi pelin grafiikkakehys täytyy vaihtaa ja Display.notify() -kutsun sijaan joudutaan jatkossa tekemään jokin toinen rutiini. Tällöin kehittäjä joutuu toteuttamaan muutoksen jokaiseen MovableObject - rajapinnan toteuttavaan luokkaan, mikä on työlästä ja virhealtista. Aspektiohjelmointi mahdollistaa tiedotusongelman siirtämisen pois MovableObject - rajapinnasta ja vastuun antamisen kokonaan luokan ulkopuolelle. Aspektiohjelmoinnilla voidaan määritellä oma komponentti, aspekti, joka suoritetaan aina MovableObject - luokan ilmentymien setxy -metodin suorituksen jälkeen. Listauksessa 2 on esimerkki aspektista, joka ratkaisee tiedotusongelman. Listauksessa on toteutettuna aspekti, joka kutsuu näyttöluokan notify -metodia aina MovableObject -luokan ilmentymien setxy -metodin suorituksen jälkeen. Liitoskohtamäärityksen (Pointcut) kohta MovableObject+. sitoo neuvon suorituksen kaikkiin MovableObject -luokan aliluokkiin. Aspektin toteuttamisen jälkeen MovableObject -rajapinnan toteutuksista voidaan jättää kutsu Display.notify(); pois. public aspect MovableOperations { pointcut notifydisplay(): execution( * spacewar.model.movableobject+.setxy(..)); after() : notifydisplay() { Display.notify(); // Tiedota näyttöä muutoksesta } } Listaus 2. Aspekti, joka ratkaisee tiedotusongelman. Aspekti koostuu neuvosta ja siihen liittyvästä liitoskohtamäärityksestä. Neuvolla (Advice) tarkoitetaan varsinaista aspektin toteuttavaa komponenttia. Se on luonteeltaan tavallinen metodi ja voi kutsua muita komponentteja kuten mikä tahansa muukin metodi. Neuvoja voi olla eri tyyppisiä. Esimerkiksi suositussa aspektitoteutuksessa AspectJ:ssä [Asp05] neuvoja on viittä eri tyyppiä. Ne ovat before, after,

9 6 after returning, after throwing ja around. Before -tyyppinen neuvo suoritetaan ennen varsinaista peruskomponenttia. After suoritetaan peruskomponentin suorituksen päätyttyä. After return saa parametrinaan liitoskohdasta palautuneen paluuarvon, jolloin voidaan esimerkiksi kirjoittaa lokiin saatu laskentatulos. After throwing saa parametrinaan heitetyn poikkeuksen, jolloin voidaan hoitaa poikkeuksenkäsittelyä. Around -tyyppinen neuvo suoritetaan siten, että osa siitä suoritetaan ennen peruskomponenttia ja osa siitä suoritetaan komponentin suorituksen jälkeen. Aspektit liitetään muuhun ohjelmakoodiin liitoskohtamäärityksellä. Liitoskohtamääritys on joukko liitoskohtia (Join point), joissa aspekti liitetään ohjelmakoodiin (Kuva 2). Liitoskohta voi olla esimerkiksi jonkin metodin kutsuminen tai poikkeuksen heitto [Påh02, s. 8]. Liitoskohtamääritykseen käytetään siihen erityisesti kehitettyä kieltä ja kullakin aspektitoteutuksella voi olla oma liitoskohtakielensä. Jotkin toteutukset antavat ohjelmoijalle mahdollisuuden valita eri liitoskohtamäärityskielistä [Joh12, s. 233]. Kuva 2. Neuvot liitetään liitoskohtamäärityksen mukaisiin liitoskohtiin.

10 7 Aspektipunoja on ohjelma, joka suoritetaan ennen varsinaista ohjelman lähdekoodin kääntämistä. Se liittää ohjelmoijan määrittelemät neuvot näille määriteltyihin liittymäkohtiin. Aspektipunoja siis generoi ohjelmoijan tekemien liitoskohtamääritysten avulla sotkuista koodia, jota ohjelmoija olisi ohjelmoinut, jos ei olisi käyttänyt aspektiohjelmointia. Ohjelmoijan ei tarvitse nyt kuitenkaan nähdä tätä välivaihetta [Kic97, s. 13]. Modernit aspektitoteutukset pystyvät hoitamaan aspektien punomisen vasta luokan latauksen aikana (Load-time weaving) tai vasta ohjelman suorituksen aikana (Runtime weaving) [Ecl09]. 3 Aspektiohjelmointikieli Mikä tekee kielestä aspektikielen? Aspektiohjelmointi ei ole sidoksissa olio-ohjelmointiin, vaikka tunnetuimmat toteutukset kuten AspectJ [Ecl12], Spring AOP [Joh12, s. 198] ja PostSharp [Sha12] perustuvat kaikki oliokieliin. Kiczales et al. käyttivät ensimmäinen aspektiohjelmointia käsittelevässä artikkelissaan [Kic97, s. 4] osaan esimerkeistä Lispiä, joka on proseduraalinen kieli. Filmanin ja Friedmanin [Fil01, s. 8] mukaan olioparadigman tarjoama luokkahierarkia on vain miellyttävä ympäristö aspektiohjelmoinnille. 3.1 Määrällistäminen ja tietämättömyys Filmanin ja Friedmanin mukaan aspektiohjelmoinnille olennaista ovat termit määrällistäminen (Quantification) ja tietämättömyys (Obliviousness) [Fil01, s. 3]. Niillä voidaan osoittaa, onko kieli aspektikieli. Määrällistämisellä tarkoitetaan peruskomponenttien tarkkailua ja tutkimista sekä kannanottoa niiden toteutukseen [Fil01, s. 5]. Aspektiohjelmoijana siis tutkimme ensin kuinka peruskomponentti toimii ja tämän jälkeen teemme komponentin, joka jollain tapaa paikkaa mahdollisia perus-

11 8 komponentin puutteita. Tietämättömyydellä tarkoitetaan sitä, että perusohjelman ei tarvitse tietää, että sen toimintaan vaikutetaan aspektiohjelmoinnilla. Sama pätee ohjelmoijiin. Ohjelmoijien ei tarvitse tietää, että heidän luomansa ohjelman toimintaan tullaan vaikuttamaan aspektiohjelmoinnilla. Filmanin ja Friedmanin mukaan aspektiohjelmointi perustuu kykyyn tehdä määrällistettyjä kannanottoja tietämättömien ohjelmoijien luomista ohjelmista [Fil01, s. 4]. He haluavat, että voisimme sanoa Tämä koodi toteuttaa tämän haasteen (Concern). Suorita se, kun nämä ehdot pitävät. Voimme siis tehdä kannanottoja muotoa Ohjelmassa P, kun ehto C pitää, suorita tehtävä A. perinteisesti ohjelmoidusta ohjelmasta P [Fil01, s. 5]. Steimannin [Ste06, s. 484] mukaan äskeisessä määritelmässä näkyy AspectJ:n suuri vaikutus aspektiohjelmoinnin määritelmän kehittymiseen. Pari (C, A) voidaan nähdä aspektin määritelmänä. C on liitoskohtamääritys ja A tässä kohdassa suoritettava neuvo. P on ohjelman suoritus, joka sisältää neuvojen suorituksen. Määrällistämisen suorittaa AspectJ:n kääntäjä. Ohjelmaa voidaan määrällistää joko sen staattisen rakenteen perusteella tai dynaamisesti sen käyttäytymisen perusteella. Ohjelman staattinen määrällistys on sen ohjelmakoodi tai siitä jäsennelty abstrakti syntaksipuu [Fil01, s. 5]. Aspektijärjestelmät voivat olla staattiselta määrällistämiskyvyltään kahta eri luokkaa [Fil01, s. 5-6]. Ne voivat olla joko musta laatikko -järjestelmiä (Black-box) tai läpinäkyviä -järjestelmiä (Clear-box). Musta laatikko -järjestelmät eivät pysty tutkimaan peruskomponenttien sisältöä ja eivät siten voi muuttaa esimerkiksi näiden kenttiä. Ne ovat luonteeltaan kääreitä, jotka ympäröivät peruskomponenttia. Esimerkiksi metodikutsujen synkronointi on tällaiselle järjestelmälle sopiva ongelma, sillä synkronoinnissa tarkoituksena on ajoittaa komponentin suoritus oikea-

12 9 aikaiseksi. Synkronoinnin tapauksessa aspektin ei siis tarvitse varsinaisesti käsitellä peruskomponenttia, mutta aspekti hoitaa komponentin kutsumisen oikeaan aikaan. Läpinäkyvät järjestelmät kykenevät tarkastelemaan ja myös muuttamaan peruskomponenttien sisältöä. Niillä pystytään määrittelemään hyvin tarkkoja ehtoja ja muokkaamaan esimerkiksi ohjelman tulostusta, jos tietyt ehdot täyttyvät. Tällaiset tekniikat ovat omiaan esimerkiksi lokikirjoitukseen [Fil01, s. 6]. Dynaaminen määrällistäminen tapahtuu ohjelman suoritusaikana [Fil01, s. 6]. Siinä voidaan määritellä ehtoja, jotka voivat liittyä esimerkiksi poikkeusten heittoon, aliohjelmakutsuihin tai ohjelman käyttöhistoriaan. Dynaamisesti voidaan tarkistaa esimerkiksi funktion parametrien oikeellisuus tai toteuttaa tietoturvaominaisuuksia kuten tarkistaa käyttäjän oikeus suorittaa kutsuttu metodi. 3.2 AspectJ AspectJ [Ecl12] on suosittu Javaan perustuva aspektiohjelmointitoteutus. AspectJ sai alkunsa Xeroxin Palo Alton tutkimuskeskuksessa, josta myös aspektiohjelmointi on lähtöisin. AspectJ-projektissa on työskennellyt esimerkiksi aspektiohjelmoinnin lanseeranneen artikkelin [Kic97] kirjoittanutta tutkimusryhmää johtanut Gregor Kiczales. Vuonna 2003 AspectJ annettiin osaksi Eclipse-projektia, joka kehittää avoimen lähdekoodin ohjelmistokehistystyökaluja [Pal03]. Uusin versio AspectJ:stä on tekstin kirjoitushetkellä Java 1.7 -yhteensopiva AspectJ AspectJ laajentaa Java-kieltä aspektin käsitteellä. Kaikki Java-ohjelmat ovat siis yhteensopivia AspectJ:n kanssa, mutta AspectJ:n laajennokset eivät käänny tavallisella Java-kääntäjällä. AspectJ käyttää omaa kääntäjäänsä, joka sisältää myös aspektipunojan [Ecl09]. Se tuottaa standardia Javan tavukoodia, joten AspectJ:llä toteutetut ohjelmat toimivat tavallisella Javan virtuaalikoneella. Aspekti määritellään AspectJ:ssä kuten mikä tahansa luokka, mutta sen luonnissa

13 10 käytetään termiä aspect termin class sijaan [Asp03]. Aspekti voi AspectJ:ssä sisältää liitoskohtia ja neuvoja. Se voi sisältää myös tyypinsisäisiä määrityksiä (Intertype declarations), joilla voidaan lisätä valmiisiin luokkiin kenttiä, metodeja sekä rajapintoja. Listauksessa 3 on esimerkki AspectJ:llä toteutetusta aspektista, joka tulostaa getauthor-luokan kutsun palauttaman kirjailijan nimen. Tätä tekniikkaa, jossa metodin paluuarvo kierrätetään aspektin läpi, voidaan käyttää esimerkiksi lokikirjoituksen toteuttamiseen. 1. public aspect LogAuthorName { 2. pointcut log() : execution( * fi.bachelor.fall.document.getauthor(..)); 3. after() returning (Author author): log() { 4. System.out.println("Author was: " + author.getname()); 5. } 6. } Listaus 3. AspectJ:llä toteutettu metodin getauthor suorituksen jälkeen suoritettava aspekti. Rivi 1 määrittelee aspektin nimen, joka on listauksessa LogAuthorName. Rivi 2 tekee liitoskohtamäärityksen. Aspekti liitetään paketin fi.bachelor.fall luokan Document metodin getauthor suoritukseen. Rivi 3 määrittelee after return -tyyppisen neuvon nimeltä log. After return - tyyppinen neuvo suoritetaan liitoskohdan suorittamisen jälkeen. Se saa parametrinaan liitoskohdassa määritellyn metodin paluuarvon. AspectJ tarjoaa monipuolisen syntaksin liitoskohtien määrittelemiseen [Asp03]. Listauksessa 3 käytettiin metodin suoritukseen kytkeytyvää liitoskohtaa. Muita liitoskohtatyyppejä ovat esimerkiksi poikkeuskäsittelijän suoritus, joka määritellään esimerkiksi: handler(arrayoutofboundsexception) sekä kohdeobjektin tyypin mukaan aktivoituva target(sometype). Liitoskohtamääritysten parametreissa voi-

14 11 daan käyttää tähtioperaattoria ("*"), joka hyväksyy kaikki arvot. Liitoskohtamääritys voidaan myös koostaa useasta liitoskohtatyypistä käyttäen operaattoreita OR (" "), AND ("&&") ja NOT ("!"), jolloin saadaan aikaan hyvin tarkkoja määrityksiä. 4 Toteutustekniikat Aspektiparadigma voidaan toteuttaa kahdella hyvin erilaisella tekniikalla [Don11]: Ensin esitelty tekniikka on Xeroxin Palo Alton tutkimuskeskuksessa kehitty tapa punoa aspektikoodi peruskomponenttien ympärille erillisellä aspektipunojalla joko käännösaikana tai vasta dynaamisesti ohjelman suoritusaikana [Kic97, s ]. Toinen tapa on polymorfismia hyväkseen käyttävät välitysluokat [Don11, s. 458]. 4.1 Koodin generointi Koodin generointiin perustuvassa menetelmässä määritellään ensin neuvot, minkä jälkeen ne liitetään koodiin erillisellä liitoskohtamäärityksellä. Liitoskohtamääritys tehdään erityisellä tarkoitusta varten kehitetyllä kielellä. Varsinainen aspektien punonta voidaan suorittaa kahdella tapaa: Vanhempi [Kic97, s. 12] tapa on punoa aspektit ohjelmakoodiin ennen kääntämistä ja luovuttaa kääntäjälle valmis lähdekooditiedosto, jossa aspektit ovat valmiiksi koodiin sidottuina, jolloin kääntäjän ei tarvitse erikseen osata käsitellä aspekteja. Tästä hieman pidemmälle viedyssä versiossa kääntäjä osaa hoitaa sekä aspektien punomisen, että koodin kääntämisen. Näin toimii esimerkiksi jo aiemmin esitelty AspectJ [Ecl09]. AspectJ liittää ensin aspektit varsinaiseen ohjelmakoodiin, minkä jälkeen se kääntää koodin Javan tavukoodiksi. Toinen tapa on punoa aspektit ohjelmaan, on liittää ne vasta suoritusaikana käyttäen hyväksi dynaamisesti tavukoodia generoivaa kirjastoa kuten CGLIB (Code Ge-

15 12 neration Library) [Cod12]. CGLIB mahdollistaa ohjelman suoritusaikana luokkien luonnin dynaamisesti sekä jo olemassaolevien luokkien muokkaamisen. Tätä tekniikkaa (ja kirjastoa) käyttävät hyväkseen monet suositut ohjelmakehykset kuten Hibernate [Hib12] ja Spring [Joh12, s. 199]. Seuraavassa listauksessa esitetään AspectJ:n [Asp05] toteutettu, aiemman listauksessa 3 AspectJ:n standardisyntaksilla toteutetun aspektin kanssa toiminnaltaan identtinen aspekti. Erona listaukseen 2 on se, että nyt aspektin määrittelyyn on käytetty AspectJ:n tarjoamia kääntäjälle tarkoitettuja kommentteja. Tämä tuo selvästi ilmi sen, kuinka aspektit ovat luonteeltaan tavallisia luokkia, jotka aspektipunoja sitoo muuhun public class LogAuthorName * fi.bachelor.fall.document.getauthor(..))", returning= author ) public void log(author author) { System.out.println("Author was: " + author.getname()); } } Listaus 4. Yksinkertainen aspekti toteutettuna Aspektiluokka on ja neuvo on määritelty joka saa parametrinaan liitoskohtamäärityksen. Esimerkissä liitämme luokan LogAuthorName metodin log kutsun edeltämään pakkauksessa fi.bachelor.fall olevan luokan Document metodin getauthor - alkuiset kommentit ovat kääntäjälle tarkoitettua tietoa, minkä avulla se kykenee punomaan aspektit osaksi varsinaista tavukoodia.

16 Suoritusaikainen punonta Suoritusaikainen punonta perustuu dynaamisten välitysluokkien (dynamic proxies) käyttöön [Don11, s. 458]. Välitysluokkia käyttävä strategia perustuu Javan tapauksessa reflektioon. Reflektiolla tarkoitetaan ohjelman rakenteen tarkastelua sekä muuttamista ohjelman suoritusaikana [Ora12]. Tehdas-suunnittelumallia mukaileva välitysluokkatehdas voidaan toteuttaa seuraavasti [Don11, s. 458]: Luodaan staattinen välistysluokkatehdas. Tehdas-luokan ei tarvitse toteuttaa mitään erityistä rajapintaa. Tehtaan välitysluokan luonnista vastaavalle metodille annetaan parametreina sopivan rajapinnan tarjoavat before - ja after -neuvot sekä peruskomponentin toteuttava olio. Tehtaalta saadaan paluuarvona Object -muotoinen olio, joka voidaan pakottaa sopivan tyyppiseksi (Cast). Tämän jälkeen peruskomponentin suorittavaa metodia voidaan kutsua välitysluokan kautta. Kutsu suorittaa nyt kuitenkin ensin before -neuvon, ja vasta tämän jälkeen suoritetaan peruskomponentti, eli alkuperäinen kutsuttu metodi. Tämän jälkeen suoritetaan vielä after -neuvo. Tehtaan toteutuksesta on esimerkki listauksessa 5. Listaus on hyvin vaikeaselkoinen ja sen ymmärtäminen ei ole välttämätöntä. public class AopProxy { public static Object createproxy(final Object obj, final BeforeAdvice beforeadvice, final AfterAdvice afteradvice) { return Proxy.newProxyInstance( obj.getclass().getclassloader(), obj.getclass().getinterfaces(), new InvocationHandler() { public Object invoke(object proxy, Method method, Object[] args) throws Throwable { beforeadvice.before(); Object object = method.invoke(obj, args); afteradvice.after();

17 14 } } }); return object; } Listaus 5 [Don11, s. 458]. Dynaamisten välitysluokkien kirjoittaminen on hyvin sotkuista. Tällä tekniikalla aspektiohjelmointi on mahdollista toteuttaa täysin Javan standardikirjastolla ilman erillistä aspektipunojaa. Tekniikka on kuitenkin ohjelmoijalle hidas ja vaikeasti hahmotettava, kuten listauksesta 5 voi todeta, joten suoritusaikainen punonta tehdään käytännössä ohjelmistokehyksen tarjoamien palveluiden avulla. Esimerkiksi yrityssovelluksissa paljon käytetyssä Spring-sovelluskehyksessä on oma suoritusaikaiseen punontaan perustuva aspektiohjelmointitoteutus [Joh12, s. 235]. 5 Hyödyt Ohjelmiston laatua voidaan mitata esimerkiksi arvioimalla sen tehokkuutta, monimutkaisuutta, ymmärrettävyyttä, uudelleenkäytettävyyttä, testattavuutta ja ylläpidettävyyttä [Ros97, s. 1-2]. Aspektiohjelmointi pyrkii parantamaan ohjelmiston laatua modularisoimalla läpileikkaavat ongelmat omiksi komponenteikseen. Tämä voi esimerkiksi vähentää tarvittavaa koodimäärää [Lip00], tehostaa laskentaa [Kic97] ja lisätä ohjelmoijan tuottavuutta [Han09]. 5.1 Koodin laatu Monet ohjelmointikielet tarjoavat jonkinlaisen rakenteen poikkeusten käsittelyyn. Poikkeuskäsittely tuottaa kuitenkin huomattavia määriä komponentin perusongel-

18 15 man kannalta toissijaista koodia. Poikkeuskäsittely tuottaa myös huomattavia määriä toisteista koodia, kun samaa poikkeusta joudutaan käsittelemään useassa järjestelmän komponentissa. Aspektiohjelmoinnilla tämä voidaan välttää ympäröimällä poikkeuksia heittävä komponentti poikkeuskäsittelyyn erikoistuneilla neuvoilla. Lippert ja Lopes tutkivat aspektiohjelmoinnin käyttöä poikkeuskäsittelyyn [Lip00]. He kirjoittivat JWAM-nimisen interaktiivisiin yrityssovelluksiin (interactive business applications) tarkoitetun sovelluskehyksen [Bre99] uusiksi käyttäen AspectJ:tä ja saavuttivat huomattavia parannuksia koodin laatuun [Lip00, s. 424]. Alkuperäisessä JWAM-kehyksen versiossa, joka ei käyttänyt aspektiohjelmointia, poikkeusten havaitsemiseen käytettiin 2120 riviä esiehtoja ja 666 riviä jälkiehtoja. Lisäksi poikkeuksien hoitamiseen käytettiin 414 catch-lausetta (2070 koodiriviä). Yhteensä poikkeuskäsittelyyn käytettiin 10,9% koodista. Identtisen toiminnallisuuden tarjoavassa AspectJ:tä käyttävässä versiossa esiehtoja käsitteli 660 riviä koodia ja jälkiehtoja 300 riviä koodia. Catch-lauseita oli vain 31 kappaletta (200 koodiriviä). Yhteensä poikkeuskäsittelyä oli vain 2,9% ohjelmakoodista. Gregor Kiczales et al., tutkivat aspektiohjelmoinnin esitelleessä artikkelissaan aspektiohjelmoinnin hyötyjä käyttäen tutkimuksessaan kuvankäsittelyohjelmaa, jossa kuva kulkee läpi erilaisten suodattimien [Kic97, s. 4]. Optimoimaton versio ohjelmasta oli kooltaan 768 riviä. Optimoimattoman version suorituskyky oli kuitenkin huomattavan hidas verrattuna siihen, mitä saataisiin, jos suodatinketjuja optimoitaisiin käsin. Käsin optimoidussa versiossa rivejä oli Aspekteilla pyrittiin tässä tutkimuksessa hoitamaan suodattimien optimointi. Se onnistui huomattavan hyvin, sillä aspekteilla toteutetussa versiossa rivejä oli enää 1039 ja suorituskyky oli verrattavissa käsin optimoituun versioon ollen yli 100 kertaa nopeampi kuin optimoimaton versio [Kic97, s. 13]. Koodirivien määrää ei voi pitää yksiselitteisenä ohjelmiston laadun mittarina. Lippert ja Lopes saivat kuitenkin tuloksia myös aspektiohjelmoinnin ohjelmiston laatua

19 16 parantavista mahdollisuuksista [Lip00, s. 424]. Spagettikoodin määrää saatiin karsittua huomattavasti, kun ohjelman perustoiminnallisuus oli kuvattu omissa komponenteissaan ja virheenkäsittely omissaan. Ohjelmiston tuki eri konfiguraatioille parani [Lip00, s. 425]. Vasta käännösaikana tapahtuva aspektien liittäminen ohjelmistoon antoi mahdollisuuden määritellä vaihtoehtoisia tapoja hoitaa poikkeukset esimerkiksi ohjelmiston kehitysvaiheen mukaan. Tuki järjestelmän vaatimusmuutoksille parani myös huomattavasti. Kun yksi poikkeustyyppi on käsitelty vain yhdessä komponentissa, voidaan koko järjestelmää koskeva muutos hoitaa yhdessä paikassa. Ilman aspekteja poikkeuskäsittelyn muutos voitaisiin huonossa tapauksessa joutua toteuttamaan jopa satoihin eri komponentteihin. Aspektit osaltaan helpottavat ohjelmistokehitystä sillä ne mahdollistavat esimerkiksi geneerisen virheenkäsittelyn, jolloin peruskomponenttien kehityksen aikana voidaan käyttää yleiskäyttöisiä virheenkäsittelykomponentteja, jotka voidaan myöhemmin korvata paremmin virhetyypille soveltuvilla [Lip00, s. 425]. Tällöin voidaan keskittyä varsinaisen perustoiminnallisuuden nopeaan prototyyppitestaamiseen. Lisäksi ohjelmistokomponenttien uudelleenkäytettävyys paranee, kun kerran toteutettu aspekti voidaan kytkeä moniin eri ohjelmistoihin. 5.2 Koodin tehokkuus Kuten jo edellisessä kappaleessa mainitussa kuvankäsittelyohjelman tutkimuksessa [Kic97] todettiin, on aspektiohjelmoinnilla mahdollista saavuttaa huomattavia hyötyjä optimoimalla koodia ennen sen antamista kääntäjälle. Tällainen optimointi hidastaa ohjelman kääntämistä, sillä aspektit tulee punoa ohjelmaan ennen sen luovuttamista kääntäjälle. Koodia optimoivien aspektien käyttö kuitenkin nopeuttaa ohjelman suoritusta merkittävästi [Kic97, s. 13]. Aspektiohjelmoinnin käytöllä voi olla suuria vaikutuksia ohjelman suorituskykyyn ja ohjelmoijan tulee ymmärtää

20 17 kuinka hänen käyttämänsä aspektitoteutus toimii, jotta hän voisi käyttää sitä tehokkaasti. Aspektien punonta voi tapahtua myös dynaamisesti ohjelman suorituksen aikana. AspectWerkz-projekti [Bon05], joka työsti [Pal03] omaa aspektiohjelmointitoteutustaan, testasi eri aspektiohjelmointitoteutusten suorituskykyä [Asp04]. Mittauksissa havaittiin, että ennen käännöstä tapahtuvaan punontaan perustuvat ratkaisut eivät juurikaan hidasta ohjelman suoritusta; metodin kutsumiseen kuluva aika nousi testijärjestelmässä viidestä nanosekunnista kymmeneen nanosekuntiin. Tällä ei juuri ole vaikutusta ohjelman suorituskykyyn, jollei aspektillisia metodeja kutsuta huomattavan tiheään. Dynaamiset toteutukset olivat huomattavasti hitaampia. Springin aspektitoteutuksella metodin kutsumiseen kului 390 nanosekuntia ja JBossin toteutuksella [Jbo12] 220 nanosekuntia. Tällainen viive saattaa vaikuttaa jo huomattavasti ohjelman suorituskykyyn. Dynaamiset toteutukset testattiin suorittamalla niitä ilman optimointeja. Dynaamiset toteutukset ovat kuitenkin käyttäjän optimoitavissa, jolloin voitaisiin saavuttaa parempia tuloksia. Esimerkiksi Spring tarjoaa mahdollisuuden estää neuvojen muokkaaminen ohjelman suoritusaikana [Joh12, s. 266]. Tämä vähentää metodin kutsumiseen tarvittavaa logiikkaa ja nopeuttaa näin kutsua. Aspektiohjelmoinnin käytöllä näyttäisi siis voivan olla suuria vaikutuksia ohjelman suorituskykyyn. Ohjelmoijan tulee ymmärtää kuinka hänen käyttämänsä aspektitoteutus toimii, jotta hän voisi käyttää sitä tehokkaasti. 5.3 Ohjelmoijan tuottavuus Hanenberg, Kleinschmager ja Josupeit-Walter tutkivat aspektiohjelmoinnin vaikutusta ohjelmoijan tuottavuuteen [Han09]. He opettivat ohjelmoijille aspektiohjelmointia ja mittasivat tämän jälkeen kuinka nopeasti ohjelmoija ratkaisee ongelman aspektiohjelmoinnilla käyttäen AspectJ:tä verrattuna olio-ohjelmointiin Javalla. He

21 18 havaitsivat, että aspektilla on oltava vähintään 36 liitoskohtaa, jotta läpileikkaavien ongelmien erottaminen aspekteina peruskomponenteista olisi tuottavampaa kuin perinteisen olio-ohjelmoinnin käyttäminen [Han09, s. 166]. Aspektiohjelmointi ei siis välttämättä sovellu kovin pieniin projekteihin, sillä tuottavuushyötyä saavutetaan vasta, kun saman läpileikkaavan ongelman kohtaa suurehko määrä komponentteja. Testiin osallistuneet ohjelmoijat olivat kuitenkin saaneet vain 1,5 tunnin opetuksen aspektiohjelmointiin, joten on mahdollista, että todellinen tuottavuus aspektiohjelmoinnin hyvin sisäistäneellä ohjelmoijalla olisi parempi. Walker et al. [Wal99] puolestaan tutkivat ohjelmoijan kykyä ylläpitää AspectJ:llä tuotettua koodia. He käyttivät tutkimuksessa hajautettua kirjastojärjestelmää [Wal99, s. 122]. Tutkijat havaitsivat, että ohjelmoijan on helppo löytää virheitä aspektikoodista, jos läpileikkaava ongelma on tarpeeksi selkeä. Kuitenkin vain yhdessä kolmesta synkronointiin liittyvistä ongelmista ratkaisuaika oli AspectJ:tä käyttäen huomattavasti nopeampi kuin puhtaalla Javalla [Wal99, s. 124]. Ohjelman jatkokehitystä mittaavissa testeissä AspectJ-koodin kehitettävyyttä verrattiin Emerald-kielisen koodin kehitettävyyteen [Wal99, s. 122]. Emerald valittiin vertailukieleksi, koska siinä on sisäänrakennettuna tuki hajautetulle ja synkronoidulle ohjelmoinnille. Aspektiohjelmoijat olivat kaikissa testeissä hieman Emeraldohjelmoijia hitaampia [Wal99, s. 126]. Tutkimuksessa havaittiin, että aspektiohjelmointi on nopeaa ja tuottavaa, jos aspektin ja peruskomponentin välinen rajapinta on tarpeeksi selkeä [Wal99, s. 126]. Esimerkiksi yksinkertainen metodikutsujen synkronointi onnistuu hyvin aspekteilla, sillä tällöin peruskomponentissa ei tarvitse tehdä minkäänlaisia olettamuksia aspekteista. Ongelmia syntyy, kun esimerkiksi ohjelman suoritusnopeutta pyritään optimoimaan luomalla aspekti, joka jollain tapaa vaikuttaa peruskomponentille saapuvan tiedon muotoon. Tällöin peruskomponentti joutuu tekemään perustoiminnalli-

22 19 suuden kannalta ylimääräisiä oletuksia saamansa tiedon laadusta, mikä lisää komponentin ohjelmoinnin haastavuutta. Tällöin myös osaltaan rikkoutuu Filmanin ja Friedmanin [Fil01, s. 3] määritelmä, jonka mukaan aspektiohjelmoinnissa on kyse määrällistettyjen kannanottojen tekemisestä tietämättömistä komponenteista. 6 Yhteenveto Aspektiohjelmointi pyrkii ratkaisemaan läpileikkaavat ongelmat eriyttämällä kunkin läpileikkaavan ongelman ratkaisun omaksi komponentikseen. Läpileikkaavia ongelmia ovat ongelmat, joiden toteutus hajautuu helposti toisteisena järjestelmän eri komponentteihin. Tällaisia ongelmia ovat esimerkiksi monet tietoturvaominaisuudet, lokikirjausten teko sekä transaktioiden hallinta. Aspektit, koostuvat neuvosta, jolla tarkoitetaan varsinaista ongelman toteuttavaa koodia sekä liitoskohtamäärityksestä, jonka avulla määritellään aspektien liitospisteet muuhun ohjelmakoodiin. Aspektit liitetään usein koodiin erityisellä aspektipunojalla. Aspektien punonta voi tapahtua jo ennen koodin kääntämistä tai vasta dynaamisesti ohjelman suoritusaikana. Aspektiparadigman mukaista koodia on mahdollista toteuttaa myös ilman erillistä aspektipunojaa käyttämällä välitysluokkia. Aspektiohjelmoinnin tuoma koodin modulaarisuus parantaa koodin laatua. Se vähentää huomattavasti esimerkiksi poikkeuskäsittelyyn tarvitta vaa koodimäärää. Aspektiohjelmointi ei ole aina tehokas tapa ratkaista ongelmaa, sillä läpileikkaavan ongelman löytäminen ja sen modularisointi yleiskäyttöiseksi komponentiksi voi olla haastavaa. Koodin ylläpidettävyyden parantumisesta ei ole konkreettisia todisteita ja aspektiohjelmoinnilla toteutetun ohjelmiston ylläpito oli joissain tapauksissa jopa hitaampaa kuin aspektittoman ohjelmiston. On huomattava, että aspektiohjelmointi ei poista tarvetta ratkaista läpileikkaavia

23 20 ongelmia. Se antaa vain työkalun läpileikkaavien ongelmien modularisointiin. Aspektiohjelmointi ei myöskään syrjäytä olio-ohjelmointia tai muita ohjelmointiparadigmoja. Se on luonteeltaan enemmänkin laajennos nykyisiin ohjelmointiparadigmoihin.

24 Lähteet 21 Asp03 AspectJ Team, the, The aspectj programming guide, chapter 2. the aspectj language, http: //eclipse.org/aspectj/doc/released/progguide/language.html. [ ] Asp05 AspectJ Team, the, Pointcuts and advice, [ ] Asp04 AspectWerkz ja Vasseur, A., Aop benchmark, [ ] Bre99 Breitling, W., Lilienthal, C., Lippert, M. ja Züllighoven, H., The jwam framework: Inspired by research, reality-tested by commercial utilization. Proceedings of OOPSLA 2000 Workshop: Methods and Tools for Object-Oriented Framework Development and Specialization, Bon05 Bonér, J. ja Vasseur, A., Aspectwerkz - plain java aop, [ ] Cod12 Dij82 Don11 Code generation library, [ ] Dijkstra, E. W., On the role of scientific thought. Selected writings on Computing: A Personal Perspective. Springer-Verlag, 1982, sivut Dong, Z., Aspect oriented programming technology and the strategy of its implementation. International Conference on Intelligence Science and Information Engineering. IEEE, 2011, sivut Ecl09 Eclipse Foundation, the, Understanding aspectj technology, http: // [ ]

25 22 Ecl12 Eclipse Foundation, the, Aspectj project, the, [ ] Fil01 Hib12 Han09 Filman, R. ja Friedman, D., Aspect-oriented programming is quantification and obliviousness. RIACS Technical Report IEEE, Hibernate - jboss community, [ ] Hanenberg, S., Kleinschmager, S. ja Josupeit-Walter, M., Does aspect-oriented programming increase the development speed for crosscutting code? an empirical study. Third International Symposium on Empirical Software Engineering and Measurement. IEEE, 2009, sivut Jbo12 Jboss aop, [ ] Joh12 Johnson, R. et al., Spring framework reference documentation, spring-framework-reference/pdf/spring-framework-reference. pdf. [ ] Kic97 Lip00 Kiczales, G., Lamping, J., Mendhekar, A., Maeda, C., Lopes, C., Loingtier, J.-M. ja Irwing, J., Aspect-oriented programming. Proceedings of the European Conference on Object-Oriented Programming, ECOOP 97. Springer-Verlag, 1997, sivut Lippert, M. ja Videira, L., A study on exception detection and handling using aspect-oriented programming. Proceedings of the 22nd international conference on Software engineering. ACM, 2000, sivut Ora12 Oracle, The java tutorials, trail: The reflection api, [ ] Pal03 Palo Alto Research Center Incorporated, Palo alto research center and eclipse announce release of aspectj to the open source community, [ ]

26 23 Pok89 Påh02 Ros97 Sha12 Ste06 Wal99 Pokkonuri, B. P., Object oriented programming. ACM SIGPLAN Notices Volume 24 Issue 11, Nov ACM, 1989, sivut Påhlsson, N., An introduction to aspect-oriented programming and aspectj. Topic Report for Software Engineering, Rosenberg, L. ja Hyatt, L., Software quality metrics for object-oriented environments. Crosstalk Journal, SharpCrafters, Postsharp, [ ] Steimann, F., The paradoxical success of aspect-oriented programming. OOPSLA 06 Proceedings of the 21st annual ACM SIGPLAN conference on Object-oriented programming systems, languages, and applications. ACM, 2006, sivut Walker, R., Baniassad, E. ja Murphy, G., An initial assessment of aspect-oriented programming. Proceedings of the 1999 International Conference on Software Engineering. ACM, 1999, sivut

arvostelija OSDA ja UDDI palveluhakemistoina.

arvostelija OSDA ja UDDI palveluhakemistoina. Hyväksymispäivä Arvosana arvostelija OSDA ja UDDI palveluhakemistoina. HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta/Osasto Fakultet/Sektion Faculty/Section Laitos Institution

Lisätiedot

Selainpelien pelimoottorit

Selainpelien pelimoottorit Selainpelien pelimoottorit Teemu Salminen Helsinki 28.10.2017 Seminaaritutkielma Helsingin yliopisto Tietojenkäsittelytiede ! 1 HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta

Lisätiedot

Aspektiohjelmointiympäristöt

Aspektiohjelmointiympäristöt hyväksymispäivä arvosana arvostelija Aspektiohjelmointiympäristöt Jesse Hallio Helsinki 23.11.2005 seminaari HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET

Lisätiedot

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

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki Sisällys JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta Abstrakti luokka ja metodi Rajapintamäärittely (interface) Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto 13.10.2000 E.

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien

Lisätiedot

11/20: Konepelti auki

11/20: Konepelti auki Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon

Lisätiedot

1. Olio-ohjelmointi 1.1

1. Olio-ohjelmointi 1.1 1. Olio-ohjelmointi 1.1 Sisällys Olio-ohjelmointi on eräs ohjelmointiparadigma. Olio-ohjelmoinnin muotoja. Ohjelmiston analyysi ja suunnittelu. Olioparadigman etuja ja kritiikkiä. 1.2 Ohjelmointiparadigmoja

Lisätiedot

Arkkitehtuurinen reflektio

Arkkitehtuurinen reflektio Arkkitehtuurinen reflektio Toni Ruokolainen Toni.Ruokolainen@cs.helsinki.fi Helsinki 6.10.2003 Tiivistelmä HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET

Lisätiedot

Avoimet ohjelmistokehykset

Avoimet ohjelmistokehykset arvosana päiväys arvostelija Avoimet ohjelmistokehykset Jyri Laukkanen 24.9.2008 HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET Tiedekunta/Osasto Fakultet/Sektion

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Geneerinen ohjelmointi. Lueteltu tyyppi enum. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien silmukoimiseen:

Lisätiedot

5. HelloWorld-ohjelma 5.1

5. HelloWorld-ohjelma 5.1 5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2

Lisätiedot

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

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo Concurrency - Rinnakkaisuus Group: 9 Joni Laine Juho Vähätalo Sisällysluettelo 1. Johdanto... 3 2. C++ thread... 4 3. Python multiprocessing... 6 4. Java ExecutorService... 8 5. Yhteenveto... 9 6. Lähteet...

Lisätiedot

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet Pakkaukset ja määreet Toisiinsa liittyvät luokkatiedostot voidaan koota pakkauksiksi. Luo hierarkiaa ja järjestystä ohjelmistotuotteeseen.

Lisätiedot

Olio-ohjelmointi Javalla

Olio-ohjelmointi Javalla 1 Olio-ohjelmointi Javalla Olio-ohjelmointi Luokka Attribuutit Konstruktori Olion luominen Metodit Olion kopiointi Staattinen attribuutti ja metodi Yksinkertainen ohjelmaluokka Ohjelmaluokka 1 Olio-ohjelmointi

Lisätiedot

ELM GROUP 04. Teemu Laakso Henrik Talarmo

ELM GROUP 04. Teemu Laakso Henrik Talarmo ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................

Lisätiedot

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä 812347A Olio-ohjelmointi, 2015 syksy 2. vsk X Poikkeusten käsittelystä Sisältö 1. Yleistä poikkeusten käsittelystä 2. Poikkeuskäsittelyn perusteita C++:ssa 3. Standardissa määritellyt poikkeukset 4. Poikkeusvarmuus

Lisätiedot

Common Lisp Object System

Common Lisp Object System Common Lisp Object System Seminaarityö Tomi Vihtari Ohjelmointikielten periaatteet kevät 2004 Helsingin Yliopisto Tietojenkäsittelytieteen laitos Järvenpää 5. huhtikuuta 2004 Sisältö 1 Johdanto... 1 2

Lisätiedot

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

Aalto Yliopisto T-106.2001 Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa Aalto Yliopisto T-106.2001 Informaatioverkostot: Studio 1 Oliot ja luokat Javaohjelmoinnissa Vesa Laakso 22.9.2012 Sisällysluettelo Sisällysluettelo... 1 Johdanto... 2 1. Luokka... 2 2. Olio... 2 3. Luokan

Lisätiedot

Javan perusteita. Janne Käki

Javan perusteita. Janne Käki Javan perusteita Janne Käki 20.9.2006 Muutama perusasia Tietokone tekee juuri (ja vain) sen, mitä käsketään. Tietokone ymmärtää vain syntaksia (sanojen kirjoitusasua), ei semantiikkaa (sanojen merkitystä).

Lisätiedot

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli TIE-20306 PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli Seminaariesitelmä ryhmä 24 Markku Ahokas Jani Kuitti i SISÄLLYSLUETTELO 1. YLEISTÄ EIFFELISTÄ... 1 1.1 Historia ja tausta... 1 1.2

Lisätiedot

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1 9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Ilmentymämetodien korvaaminen. Luokkametodien peittäminen. Super-attribuutti. Override-annotaatio.

Lisätiedot

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin 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

Lisätiedot

12. Monimuotoisuus 12.1

12. Monimuotoisuus 12.1 12. Monimuotoisuus 12.1 Sisällys Johdanto. Periytymismekanismi määrittää alityypityksen. Viitteiden sijoitus ja vertailu. Staattinen ja dynaaminen luokka. Myöhäinen ja aikainen sidonta. Parametrinvälitys

Lisätiedot

5. HelloWorld-ohjelma 5.1

5. HelloWorld-ohjelma 5.1 5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2

Lisätiedot

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

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance) Sisällys JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys Periytyminen (inheritance) Näkyvyys (visibility) Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto 13.10.2000 E. Hyvönen: Java Osa

Lisätiedot

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

812341A Olio-ohjelmointi Peruskäsitteet jatkoa 812341A Olio-ohjelmointi 2106 Peruskäsitteet jatkoa Luokkakohtaiset piirteet n Yhteisiä kaikille saman luokan olioille n Liittyvät luokkaan, eivät yksittäiseen olioon n Kaikki ko. luokan oliot voivat käyttää

Lisätiedot

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat Rajapinnat Java-kieli ei tue luokkien moniperintää. Jokaisella luokalla voi olla vain yksi välitön yliluokka. Toisinaan olisi

Lisätiedot

14. Poikkeukset 14.1

14. Poikkeukset 14.1 14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla

Lisätiedot

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 14. Poikkeukset. Johdanto. Johdanto Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla

Lisätiedot

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1 3. Komponentit ja rajapinnat 3.1 Komponenttien idea: ohjelmistotuotannon rationalisointi 3.2 Mikä on ohjelmistokomponentti? 3.3 Komponentit ohjelmistoyksikköinä 3.4 Rajapinnat 3.6 Komponenttien räätälöinti

Lisätiedot

Rajapinta (interface)

Rajapinta (interface) 1 Rajapinta (interface) Mikä rajapinta on? Rajapinta ja siitä toteutettu luokka Monimuotoisuus ja dynaaminen sidonta Rajapinta vs periytyminen 1 Mikä rajapinta on? Rajapintoja käytetään, kun halutaan määritellä

Lisätiedot

Olio-ohjelmointi Virhetilanteiden käsittely

Olio-ohjelmointi Virhetilanteiden käsittely Olio-ohjelmointi 2016 Virhetilanteiden käsittely Poikkeustilanteet n Java-järjestelmässä voidaan ottaa kiinni ohjelman suoritusaikana tapahtuvia virhetilanteita, joita ei saada kiinni tavanomaisilla ohjausrakenteilla

Lisätiedot

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä muuttujia ja vakioita. Esittely

Lisätiedot

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

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä 2016 IX Olioiden välisistä yhteyksistä Sisältö 1. Johdanto 2. Kytkentä 3. Koheesio 4. Näkyvyydestä 2 Johdanto n Ohjelmassa syntyy kytkentöjä olioiden välille Toivottuja ja epätoivottuja n Näkyvyys vaikuttaa

Lisätiedot

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä

Lisätiedot

812341A Olio-ohjelmointi, I Johdanto

812341A Olio-ohjelmointi, I Johdanto 812341A Olio-ohjelmointi, 2016 I Johdanto Sisältö 1. Abstraktiosta 2. Olio-ohjelmoinnin historiaa 3. Olioparadigmasta 4. Peruskäsitteiden kertausta 812341A Olio-ohjelmointi, Johdanto 2 1 Abstraktiosta

Lisätiedot

Java-API, rajapinnat, poikkeukset, UML,...

Java-API, rajapinnat, poikkeukset, UML,... Java-API, rajapinnat, r poikkeukset, UML,... Janne Käki 12.10.2006 Keskeisimmät Java-API:n pakkaukset API = Application Programming Interface eli sovellusohjelmointirajapinta (!) pakkaus (engl. package)

Lisätiedot

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet 815338A Ohjelmointikielten periaatteet 2015-2016 VIII Poikkeusten ja tapahtumien käsittely Sisältö 1. Poikkeusten käsittelyn käsitteitä ja suunnittelukriteerejä 2. Poikkeusten käsittely C++:ssa 3. Poikkeusten

Lisätiedot

Luokat ja oliot. Ville Sundberg

Luokat ja oliot. Ville Sundberg Luokat ja oliot Ville Sundberg 12.9.2007 Maailma on täynnä olioita Myös tietokoneohjelmat koostuvat olioista Σ Ο ω Μ ς υ φ Ϊ Φ Θ ψ Љ Є Ύ χ Й Mikä on olio? Tietokoneohjelman rakennuspalikka Oliolla on kaksi

Lisätiedot

Aspektiohjelmointi ja hauraat liitoskohtamääritykset

Aspektiohjelmointi ja hauraat liitoskohtamääritykset Aspektiohjelmointi ja hauraat liitoskohtamääritykset Timo Tapanainen Helsinki 25.9.2007 Pro gradu -tutkielma HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos i HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET

Lisätiedot

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä 6.11.2002

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä 6.11.2002 JReleaser Yksikkötestaus ja JUnit Mikko Mäkelä 6.11.2002 Sisältö Johdanto yksikkötestaukseen JUnit yleisesti JUnit Framework API (TestCase, TestSuite) Testien suorittaminen eri työkaluilla Teknisiä käytäntöjä

Lisätiedot

14. Poikkeukset 14.1

14. Poikkeukset 14.1 14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.

Lisätiedot

4.12.2005. SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

4.12.2005. SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T SEPA: REFAKTOROINTI 2 (9) SEPA: REFAKTOROINTI 3 (9) VERSIOHISTORIA Version Date Author Description 0.1 2.12.2005 Erik Hakala Ensimmäinen

Lisätiedot

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 14. Poikkeukset. Johdanto. Johdanto Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.

Lisätiedot

Test-Driven Development

Test-Driven Development Test-Driven Development Ohjelmistotuotanto syksy 2006 Jyväskylän yliopisto Test-Driven Development Testilähtöinen ohjelmistojen kehitystapa. Tehdään ensin testi, sitten vasta koodi. Tarkoituksena ei ole

Lisätiedot

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

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2 4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä

Lisätiedot

Tutoriaaliläsnäoloista

Tutoriaaliläsnäoloista Tutoriaaliläsnäoloista Tutoriaaliläsnäolokierroksella voi nyt täyttää anomuksen läsnäolon merkitsemisestä Esim. tagi ei toiminut, korvavaltimon leikkaus, yms. Hyväksyn näitä omaa harkintaa käyttäen Tarkoitus

Lisätiedot

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } } Yksikkötestauksella tarkoitetaan lähdekoodiin kuuluvien yksittäisten osien testaamista. Termi yksikkö viittaa ohjelman pienimpiin mahdollisiin testattaviin toiminnallisuuksiin, kuten olion tarjoamiin metodeihin.

Lisätiedot

TIE Principles of Programming Languages CEYLON

TIE Principles of Programming Languages CEYLON TIE-20306 Principles of Programming Languages CEYLON SISÄLLYSLUETTELO 1. YLEISTIETOA KIELESTÄ JA SEN KEHITTÄMISESTÄ... 1 2. CEYLONIN OMINAISUUKSIA... 2 2.1 Modulaarisuus... 2 2.2 Tyypit... 2 2.3 Muita

Lisätiedot

Aika/Datum Month and year Kesäkuu 2012

Aika/Datum Month and year Kesäkuu 2012 Tiedekunta/Osasto Fakultet/Sektion Faculty Laitos/Institution Department Filosofian, historian, kulttuurin ja taiteiden tutkimuksen laitos Humanistinen tiedekunta Tekijä/Författare Author Veera Lahtinen

Lisätiedot

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

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi. 11. Rajapinnat 11.1 Sisällys Johdanto. Abstrakti luokka vai rajapinta? Rajapintojen hyötyjä. Kuinka rajapinnat määritellään ja otetaan käyttöön? Eläin, nisäkäs, kissa ja rajapinta. Moniperiytyminen rajapintojen

Lisätiedot

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 6. Metodit 6.1 Sisällys Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 Oliot viestivät metodeja kutsuen Olio-ohjelmoinnissa ohjelma

Lisätiedot

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Johdatus ohjelmointiin 811122P (5 op.) 12.12.2005 Ohjelmointikieli on Java. Tentissä saa olla materiaali mukana. Tenttitulokset julkaistaan aikaisintaan

Lisätiedot

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana Muilla kielillä: English Suomi Pong-peli, vaihe 2 Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana Laitetaan pallo liikkeelle Tehdään kentälle reunat Vaihdetaan kentän taustaväri Zoomataan

Lisätiedot

Ohjelmointi 1. Kumppanit

Ohjelmointi 1. Kumppanit Ohjelmointi 1 Kumppanit November 20, 2012 2 Contents 1 Mitä ohjelmointi on 7 2 Ensimmäinen C#-ohjelma 9 2.1 Ohjelman kirjoittaminen......................... 9 A Liite 11 3 4 CONTENTS Esipuhe Esipuhe 5

Lisätiedot

Ohjelmointi 1 / syksy /20: IDE

Ohjelmointi 1 / syksy /20: IDE Ohjelmointi 1 / syksy 2007 10/20: IDE Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/8 Tämän luennon rakenne

Lisätiedot

Test-Driven Development

Test-Driven Development Test-Driven Development Syksy 2006 Jyväskylän yliopisto Test-Driven Development Testilähtöinen ohjelmistojen kehitystapa. Tehdään ensin testi, sitten vasta koodi. Tarkoituksena ei ole keksiä kaikkia mahdollisia

Lisätiedot

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys Tällä kurssilla on tutustuttu ohjelmistojen mallintamiseen oliomenetelmiä ja UML:ää käyttäen Samaan aikaan järjestetyllä kurssilla on käsitelty

Lisätiedot

Object Framework - One. OF-1 is a high-productive Multi-UI OpenEdge data driven development framework. Veli-Matti Korhonen

Object Framework - One. OF-1 is a high-productive Multi-UI OpenEdge data driven development framework. Veli-Matti Korhonen Object Framework - One OF-1 is a high-productive Multi-UI OpenEdge data driven development framework Veli-Matti Korhonen Aiheet OF-1 esittely Mitä ominaisuuksia saa ilman ohjelmointia Miten ohjelmoidaan

Lisätiedot

Java kahdessa tunnissa. Jyry Suvilehto

Java kahdessa tunnissa. Jyry Suvilehto Java kahdessa tunnissa Jyry Suvilehto Ohjelma Ohjelmointiasioita alkeista nippelitietoon n. 45 min Tauko 10 min Oliot, luokat ja muut kummajaiset n. 45 min Kysykää Sisältöä ei oikeasti ole 2x45 min täytteeksi,

Lisätiedot

16. Javan omat luokat 16.1

16. Javan omat luokat 16.1 16. Javan omat luokat 16.1 Sisällys Johdanto. Object-luokka: tostring-, equals-, clone- ja getclass-metodit. Comparable-rajapinta: compareto-metodi. Vector- ja ArrayList-luokat. 16.2 Javan omat luokat

Lisätiedot

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

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++? JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,

Lisätiedot

1. Miten tehdään peliin toinen maila?

1. Miten tehdään peliin toinen maila? Muilla kielillä: English Suomi Pong-peli, vaihe 4 Tässä oppaassa teemme toisenkin mailan. 1. Miten tehdään peliin toinen maila? Maila tehtiin edellisessä vaiheessa, aliohjelmassa LuoKentta, seuraavasti:

Lisätiedot

Liite 1: KualiKSB skenaariot ja PoC tulokset. 1. Palvelun kehittäjän näkökulma. KualiKSB. Sivu 1. Tilanne Vaatimus Ongelma jos vaatimus ei toteudu

Liite 1: KualiKSB skenaariot ja PoC tulokset. 1. Palvelun kehittäjän näkökulma. KualiKSB. Sivu 1. Tilanne Vaatimus Ongelma jos vaatimus ei toteudu Liite 1: skenaariot ja PoC tulokset 1. Palvelun kehittäjän näkökulma Tilanne Vaatimus Ongelma jos vaatimus ei toteudu Palvelun uusi versio on Palveluiden kehittäminen voitava asentaa tuotantoon vaikeutuu

Lisätiedot

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton 2015 syksy 2. vsk IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton Sisältö 1. Johdanto luontimalleihin 2. Proxy 3. Factory Method 4. Prototype 5. Singleton Suunnittelumallit Proxy et.

Lisätiedot

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana Muilla kielillä: English Suomi Pong-peli, vaihe 3 Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana Jaetaan ohjelma pienempiin palasiin (aliohjelmiin) Lisätään peliin maila (jota ei voi vielä

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 11: Olioiden toteuttaminen Riku Saikkonen 28. 11. 2011 Sisältö 1 Miten oliot ja metodikutsut toimivat? 2 Oliot Minkä luokan metodia kutsutaan? Python-esimerkki

Lisätiedot

4. Luokan testaus ja käyttö olion kautta 4.1

4. Luokan testaus ja käyttö olion kautta 4.1 4. Luokan testaus ja käyttö olion kautta 4.1 Olion luominen luokasta Java-kielessä olio määritellään joko luokan edustajaksi tai taulukoksi. Olio on joukko keskusmuistissa olevia tietoja. Oliota käsitellään

Lisätiedot

Ohjelmistojen mallintaminen, mallintaminen ja UML

Ohjelmistojen mallintaminen, mallintaminen ja UML 582104 Ohjelmistojen mallintaminen, mallintaminen ja UML 1 Mallintaminen ja UML Ohjelmistojen mallintamisesta ja kuvaamisesta Oliomallinnus ja UML Käyttötapauskaaviot Luokkakaaviot Sekvenssikaaviot 2 Yleisesti

Lisätiedot

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

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

1. Omat operaatiot 1.1

1. Omat operaatiot 1.1 1. Omat operaatiot 1.1 Sisällys Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Johdatus ohjelmointiin 81122P (4 ov.) 30.5.2005 Ohjelmointikieli on Java. Tentissä saa olla materiaali mukana. Tenttitulokset julkaistaan aikaisintaan

Lisätiedot

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: Harjoitus 7 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: class Lintu //Kentät private int _siivenpituus; protected double _aivojenkoko; private bool _osaakolentaa; //Ominaisuudet public int

Lisätiedot

Työn laji Arbetets art Level Aika Datum Month and year Sivumäärä Sidoantal Number of pages

Työn laji Arbetets art Level Aika Datum Month and year Sivumäärä Sidoantal Number of pages Tiedekunta/Osasto Fakultet/Sektion Faculty Laitos Institution Department Tekijä Författare Author Työn nimi Arbetets titel Title Oppiaine Läroämne Subject Työn laji Arbetets art Level Aika Datum Month

Lisätiedot

812347A Olio-ohjelmointi, X Reflektiivisyys

812347A Olio-ohjelmointi, X Reflektiivisyys 812347A Olio-ohjelmointi, 2016 X Reflektiivisyys Sisältö 1. Luokkainformaatio 2. Olion luominen luokkaolion avulla 3. Metodit olioina 2 Luokkainformaatio n Reflektio: Mahdollisuus ohjelman suorituksen

Lisätiedot

1 Tehtävän kuvaus ja analysointi

1 Tehtävän kuvaus ja analysointi Olio-ohjelmoinnin harjoitustyön dokumentti Jyri Lehtonen (72039) Taneli Tuovinen (67160) 1 Tehtävän kuvaus ja analysointi 1.1 Tehtävänanto Tee luokka, jolla mallinnetaan sarjaan kytkettyjä kondensaattoreita.

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely Poikkeukset Poikkeuksella tarkoitetaan yllättävää ajonaikaista tilannetta, joka

Lisätiedot

12. Näppäimistöltä lukeminen 12.1

12. Näppäimistöltä lukeminen 12.1 12. Näppäimistöltä lukeminen 12.1 Sisällys Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit.

Lisätiedot

8/20: Luokat, oliot ja APIt

8/20: Luokat, oliot ja APIt Ohjelmointi 1 / syksy 2007 8/20: Luokat, oliot ja APIt Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/8 Kohti

Lisätiedot

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmointi 2 / 2010 Välikoe / 26.3 Ohjelmointi 2 / 2010 Välikoe / 26.3 Välikoe / 26.3 Vastaa neljään (4) tehtävään ja halutessa bonustehtäviin B1 ja/tai B2, (tuovat lisäpisteitä). Bonustehtävät saa tehdä vaikkei olisi tehnyt siihen tehtävään

Lisätiedot

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi Solidity älysopimus ohjelmointi Sopimus suuntautunut ohjelmointi Merkle puu Kertausta eiliseltä Solidity on korkean tason älysopimus ohjelmointikieli Muistuttaa olio-ohjelmointia Javalla Sopimuskoodi on

Lisätiedot

Tutkittua tietoa. Tutkittua tietoa 1

Tutkittua tietoa. Tutkittua tietoa 1 Tutkittua tietoa T. Dybå, T. Dingsøyr: Empirical Studies of Agile Software Development : A Systematic Review. Information and Software Technology 50, 2008, 833-859. J.E. Hannay, T. Dybå, E. Arisholm, D.I.K.

Lisätiedot

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

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä Sisällys 9. Periytyminen Javassa Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat

Lisätiedot

Imperatiivisten ohjelmien organisointiparadigmojen. historia

Imperatiivisten ohjelmien organisointiparadigmojen. historia Imperatiivisten ohjelmien organisointiparadigmojen historia Timo Tapanainen Helsingin yliopisto, tietojenkäsittelytieteen laitos Tietojenkäsittelytieteen historia -seminaari, kevät 2007 Sisältö Paradigma,

Lisätiedot

Imperatiivisten ohjelmien organisointiparadigmojen historia

Imperatiivisten ohjelmien organisointiparadigmojen historia Imperatiivisten ohjelmien organisointiparadigmojen historia Timo Tapanainen Helsingin yliopisto, tietojenkäsittelytieteen laitos Tietojenkäsittelytieteen historia -seminaari, kevät 2007 Sisältö Paradigma,

Lisätiedot

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4 Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.

Lisätiedot

JavaRMI 1 JAVA RMI. Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko

JavaRMI 1 JAVA RMI. Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko JavaRMI 1 JAVA RMI Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko JavaRMI 2 Table of Contents...1 JAVA RMI...1 Yleistä...4 Arkkitehtuuri...5 Java RMI kerrosarkkitehtuuri...5

Lisätiedot

P e d a c o d e ohjelmointikoulutus verkossa

P e d a c o d e ohjelmointikoulutus verkossa P e d a c o d e ohjelmointikoulutus verkossa Java-kielen perusteet Teoria ja ohjelmointitehtävät Java-kielen perusteet 3 YLEISKATSAUS KURSSIN SISÄLTÖIHIN 10 JAVA-KIELEN PERUSTEET 10 OPISKELUN ALOITTAMINEN

Lisätiedot

Koht dialogia? Organisaation toimintaympäristön teemojen hallinta dynaamisessa julkisuudessa tarkastelussa toiminta sosiaalisessa mediassa

Koht dialogia? Organisaation toimintaympäristön teemojen hallinta dynaamisessa julkisuudessa tarkastelussa toiminta sosiaalisessa mediassa Kohtdialogia? Organisaationtoimintaympäristönteemojenhallinta dynaamisessajulkisuudessatarkastelussatoiminta sosiaalisessamediassa SatuMariaPusa Helsinginyliopisto Valtiotieteellinentiedekunta Sosiaalitieteidenlaitos

Lisätiedot

Pro gradu -tutkielma Meteorologia SUOMESSA ESIINTYVIEN LÄMPÖTILAN ÄÄRIARVOJEN MALLINTAMINEN YKSIDIMENSIOISILLA ILMAKEHÄMALLEILLA. Karoliina Ljungberg

Pro gradu -tutkielma Meteorologia SUOMESSA ESIINTYVIEN LÄMPÖTILAN ÄÄRIARVOJEN MALLINTAMINEN YKSIDIMENSIOISILLA ILMAKEHÄMALLEILLA. Karoliina Ljungberg Pro gradu -tutkielma Meteorologia SUOMESSA ESIINTYVIEN LÄMPÖTILAN ÄÄRIARVOJEN MALLINTAMINEN YKSIDIMENSIOISILLA ILMAKEHÄMALLEILLA Karoliina Ljungberg 16.04.2009 Ohjaajat: Ari Venäläinen, Jouni Räisänen

Lisätiedot

4. Lausekielinen ohjelmointi 4.1

4. Lausekielinen ohjelmointi 4.1 4. Lausekielinen ohjelmointi 4.1 Sisällys Konekieli, symbolinen konekieli ja lausekieli. Lausekielestä konekieleksi: - Lähdekoodi, tekstitiedosto ja tekstieditorit. - Kääntäminen ja tulkinta. - Kääntäminen,

Lisätiedot

Ohjelmoinnin perusteet, syksy 2006

Ohjelmoinnin perusteet, syksy 2006 Ohjelmoinnin perusteet, syksy 2006 Esimerkkivastaukset 1. harjoituksiin. Alkuperäiset esimerkkivastaukset laati Jari Suominen. Vastauksia muokkasi Jukka Stenlund. 1. Esitä seuraavan algoritmin tila jokaisen

Lisätiedot

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä Rekursiolause Laskennan teorian opintopiiri Sebastian Björkqvist 23. helmikuuta 2014 Tiivistelmä Työssä käydään läpi itsereplikoituvien ohjelmien toimintaa sekä esitetään ja todistetaan rekursiolause,

Lisätiedot

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

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen Sisällys 6. Metodit Oliot viestivät metodeja kutsuen. Kuormittaminen. Luokkametodit (ja -attribuutit).. Metodien ja muun luokan sisällön järjestäminen. 6.1 6.2 Oliot viestivät metodeja kutsuen Oliot viestivät

Lisätiedot

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia. Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka

Lisätiedot

7/20: Paketti kasassa ensimmäistä kertaa

7/20: Paketti kasassa ensimmäistä kertaa Ohjelmointi 1 / syksy 2007 7/20: Paketti kasassa ensimmäistä kertaa Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007

Lisätiedot

Apuja ohjelmointiin» Yleisiä virheitä

Apuja ohjelmointiin» Yleisiä virheitä Apuja ohjelmointiin» Yleisiä virheitä Ohjelmaa kirjoittaessasi saattaa Visual Studio ilmoittaa monenlaisista virheistä "punakynällä". Usein tämä johtuu vain siitä, että virheitä näytetään vaikket olisi

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print

Lisätiedot

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Sisällys. 11. Rajapinnat. Johdanto. Johdanto Sisällys 11. ajapinnat. bstrakti luokka vai rajapinta? ajapintojen hyötyjä. Kuinka rajapinnat määritellään ja otetaan käyttöön? Eläin, nisäkäs, kissa ja rajapinta. Moniperiytyminen rajapintojen avulla.

Lisätiedot

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen Metodit Metodien määrittely Metodin parametrit ja paluuarvo Metodien suorittaminen eli kutsuminen Metodien kuormittaminen 1 Mikä on metodi? Metodi on luokan sisällä oleva yhteenkuuluvien toimintojen kokonaisuus

Lisätiedot