Muusta kuin vesisioista

Samankaltaiset tiedostot
12. Monimuotoisuus 12.1

12. Monimuotoisuus 12.1

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

9. Periytyminen Javassa 9.1

Luentomateriaali. Informaatioverkostot: Studio 1. Janne Käki MUUTTUJAT SWING POLYMORFISMI UML-KAAVIOT SOVELMAT SILMUKAT POIKKEUKSET JAVADOC

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

Javan perusteita. Janne Käki

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

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Rajapinta (interface)

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

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

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

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

9. Periytyminen Javassa 9.1

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite

Kehyspohjainen ohjelmistokehitys

Ohjelmistojen mallintaminen viikon 4 laskareiden mallivastauksia

ITKP102 Ohjelmointi 1 (6 op)

Graafinen käyttöliittymä, osa 1

Oliosuunnittelu. Oliosuunnittelu

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

Java kahdessa tunnissa. Jyry Suvilehto

T Henkilökohtainen harjoitus: FASTAXON

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

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

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

Ohjelmistotekniikan menetelmät, suunnittelumalleja

Taulukot. Jukka Harju, Jukka Juslin

Olio-ohjelmointi Syntaksikokoelma

15. Ohjelmoinnin tekniikkaa 15.1

Ohjelmoinnin jatkokurssi, kurssikoe

Suunnittelumalleja, MVC. Juha Järvensivu 2008

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Olio-ohjelmointi Javalla

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

Ohjelmistotuotanto. Luento

12. Kehysarkkitehtuurit

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

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

1 Tehtävän kuvaus ja analysointi

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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

SEPA - Design Patterns

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

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

ITKP102 Ohjelmointi 1 (6 op)

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op

15. Ohjelmoinnin tekniikkaa 15.1

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

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

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

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Olio-ohjelmointi Johdanto suunnittelumalleihin. 1. Yleistä

ITKP102 Ohjelmointi 1 (6 op)

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Oliot viestivät metodeja kutsuen

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

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Listarakenne (ArrayList-luokka)

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

2. Olio-ohjelmoinista lyhyesti 2.1

16. Javan omat luokat 16.1

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

T Ohjelmistojen määrittely- ja suunnittelumenetelmät Harjoitustyöraportti TNT - Tarkistetaan Ne Tentit Arkkitehtuuri- ja suunnittelumalli

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Tietorakenteet, laskuharjoitus 7,

ITKP102 Ohjelmointi 1 (6 op)

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Analyysi, staattinen mallintaminen, kohdealueen malli ja luokkakaavio

Hirviö. Design Patterns

T SEPA - päiväkirja: Design Patterns. ETL työkalu

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Hirviö. Design Patterns

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Ohjelmoinnin perusteet, kurssikoe

Metodien tekeminen Javalla

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Standardi- ja tietorakenneluokkia

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

14. Poikkeukset 14.1

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

Ohjelmistojen suunnittelu

Ohjelmoinnin perusteet Y Python

Ohjelmistokehykset (software frameworks)

18. Abstraktit tietotyypit 18.1

JUnit ja EasyMock (TilaustenKäsittely)

8/20: Luokat, oliot ja APIt

Common Lisp Object System

Hohde Consulting 2004

Pong-peli, vaihe Aliohjelmakutsu laskureita varten. 2. Laskurin luominen. Muilla kielillä: English Suomi

TIE Ohjelmistojen suunnittelu

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

Kooste. Esim. Ympyrän keskipiste voidaan ajatella ympyrän osaksi.

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Kertaus: yleistys-erikoistus ja perintä

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

1. Mitä tehdään ensiksi?

14. Poikkeukset 14.1

Transkriptio:

Muusta kuin vesisioista Janne Käki 8.12.2006

Metodin kuormittaminen (overloading) Samannimisestä metodista on määritelty samassa luokassa (tai samassa yli- ja aliluokkien jatkumossa) useita versioita, joista valitaan suoritettavaksi yksi sen perusteella, mitä parametreja metodikutsussa on annettu. Metodikutsu sidotaan suoritettavaan metodiin metodin nimen sekä parametrien tyyppien ja järjestyksen perusteella. (Sen sijaan esimerkiksi parametrimuuttujien nimillä ei ole mitään merkitystä. Ei myöskään sillä, minkä tyyppisiä arvoja metodin eri versiot palauttavat.) Metodikutsujen on oltava yksiselitteisiä, eli ei saa olla epäselvää, mikä vaihtoehtoisista tietynnimisen metodin versioista nyt suoritetaan: public void metodi(object o, String s) {... } public void metodi(string s, Object o) {... } metodi( nuuh, nuuh ); metodi( nuuh, (Object) nuuh );

Metodin korvaaminen (overriding) Aliluokka määrittelee yliluokassa määritellyn metodin toteutuksen kokonaan uudelleen. Korvaavan metodin puumerkki on täsmälleen sama kuin alkuperäisen, eli metodeilla on sama nimi, samanlainen parametrilista (tyypit ja järjestys) ja sama paluuarvon tyyppi. Voidaan merkitä aliluokkaan kirjoittamalla metodin yläpuolelle erityinen @Override-tägi. Ei pakollista, mutta parantaa luettavuutta. Metodin uusi versio EI saa muuttaa paluuarvon tyyppiä, rajata näkyvyyttä alkuperäistä suppeammaksi (laajentaa sen sijaan saa), heittää sellaisia poikkeuksia joita alkuperäinen ei määritellyt heittävänsä (sen sijaan uusi versio voi mainiosti olla heittämättä joitakin poikkeuksia joita alkuperäinen metodi heitti). Kun luokan A metodi x() on korvattu aliluokassa B metodilla x(), niin alkuperäistä metodia voi kutsua luokan B oliolle vain olio itse notaatiolla super.x(). Muut kutsut johtavat aina luokassa B määritellyn metodin suorittamiseen.

Metodien staattinen ja dynaaminen sidonta Otus eka = new PäheäOtus(); PäheäOtus toka = new PäheäOtus(); Olkoon PäheäOtus luokan Otus aliluokka. Otus-luokassa on määritelty tylsä metodi eksistoi(), jonka PäheäOtus on korvannut uudella päheämmällä versiolla. Lisäksi PäheäOtus-luokassa on täysin uusi, ennen näkemätön metodi kelaasunlaatuas(). PäheälleOtukselle, joka on sijoitettu Otus-tyyppiseen muuttujaan, voidaan kutsua ainoastaan Otus-luokan metodeja. Sanotaan, että kyseisen olion staattinen tyyppi on Otus. Vaikka olio siis osaisi myös kelata laatuaan, sitä ei voi tuon muuttujan kautta käskeä niin tekemään. Sopivalla tyyppimuunnoksella staattinen tyyppi voidaan kuitenkin saattaa sellaiseksi, että tuokin metodi on käytössä. eka :D :D Sen sijaan muuttujan staattinen tyyppi Otus antaa toki meille luvan kutsua oliollemme metodia eksistoi(). Tällöin metodikutsu sidotaan kuitenkin aina olion todelliseen, dynaamiseen tyyppiin, joka tässä tapauksessa on PäheäOtus. Hämmästykseksemme tylsässä Otuslaatikossa piileksinyt olio alkaakin siis eksistoida hyvin päheästi, kun käskytämme sitä tuollaisella metodikutsulla. Mitenkään emme pysty käskemään tuota oliota käyttäytymään siten kuin puhdas Otus käyttäytyisi, ellei se sitten itse päätä suorittaa tuota metodia kutsulla super.eksistoi(). toka Staattinen tyyppi siis sanelee sen, mitkä metodikutsut muuttujaan sijoitetulle oliolle ovat ylipäänsä luvallisia. Dynaaminen tyyppi (joka ei olion elinaikana muutu) taas määrää, mitä koodia oliolle tehtyjen metodikutsujen seurauksena todella suoritetaan.

Iteraattori Vanha tuttu iteroiva for-looppi... for (Olio o : kokoelma) { } System.out.println(o); Kokoelman on toteutettava rajapinta Iterable<T>, joka määrittelee metodin public Iterator<T> iterator()....toimii pinnan alla itse asiassa iteraattoriolion avulla. Sama looppi hieman toisin kirjoitettuna: Iterator<Olio> iter = kokoelma.iterator(); while (iter.hasnext()) { Olio o = iter.next(); System.out.println(o); } Myös Iterator<T> on itse asiassa rajapinta. Iteraattorin metodi next() palauttaa ja poistaa iteraattorista, ei iteroitavasta kokoelmasta järjestyksessä seuraavan elementin. Metodi hasnext() kertoo, vieläkö elementtejä on jäljellä.

Iteraattori Iteroimisessa on vaaransa. Metodi next() voi heittää poikkeuksia... NoSuchElementException, jos elementtejä ei enää ole. Vältettävissä huolellisella hasnext()-metodin käytöllä. ConcurrentModificationException, jos iteroitava kokoelma on muuttunut iteraattorin luomisen jälkeen. Uusia elementtejä ei siis voi kesken iteroinnin lisätä, ellei iterointia tämän jälkeen keskeytä. Elementtien poistaminen on luvallista iteroinnin lomassa vain iteraattoriolion metodilla remove(), joka poistaa viimeisimmän next()-metodin palauttaman elementin, myös iteroitavasta kokoelmasta. Iteraattori siis antaa luvan myös elementtien poistamiseen kokoelmasta (periaatteessa oma iteraattoriluokka voidaan kuitenkin toteuttaa myös niin, ettei remove()-metodi tee mitään). Aina ulkopuoliselle käyttäjälle ei haluta jättää tällaista mahdollisuutta, jolloin voi olla syytä harkita toisenlaisen rajapinnan tarjoamista kokoelman läpikäyntiin.

Suunnittelumallit (design patterns) Hyväksi havaittuja konsepteja siitä, millainen olioyhteisö soveltuu tietynlaisen ongelman ratkaisuun. (Kuvailevat yleensä muutamia oliota, joilla selkeä vastuunjako. Eivät sinänsä ota kantaa siihen, miten olioita kuvaavat luokat toteutetaan, eivätkä riipu tietystä ohjelmointikielestä.) MVC (Model-View-Controller): sovelluksen datamalli, sen esittäminen käyttäjälle sekä datamallin muokkaaminen on jaettu eri osien vastuulle. Observer: yksi olio ilmoittautuu tarkkailemaan muutoksia toisen olion tilassa. Tarkkailtava (observable) olio ilmoittaa, kun muutoksia tapahtuu. Singleton: luokka, josta voidaan luoda vain yksi olio. Luontimetodi piilotettu, ilmentymän luonti (ja luonnin jälkeen tuon ainoan ilmentymän hakeminen) tapahtuu jollakin staattisella metodilla, kuten getinstance(). Factory: luokka, jonka metodien avulla voidaan luoda usean muun luokan ilmentymiä. Paluuarvon tyyppi voi olla jokin rajapinta, jolloin käyttäjä voi luoda erilaisia olioita välittämättä niiden todellisesta luokasta. Composite: suurempi kokonaisuus rakennetaan tietynlaisista rakennuspalikkaolioista, jotka jälleen voivat edustaa jotakin palikkarajapintaa (ja näin ollen olla todelliselta luokaltaan hyvin erilaisia keskenään). ja onhan näitä vielä muitakin

Sovelluskehykset (software frameworks) Valmiiden luokkien (ja lopulta pakkausten) muodostamia kokonaisuuksia, joiden varaan voi rakentaa uusia ohjelmistoja, sekä käyttämällä valmiita komponentteja sellaisenaan että laatimalla niille tarpeen mukaan omia aliluokkia. Tutuin esimerkki sovelluskehyksestä: Swing. Usein sovelluskehysten luokkakokonaisuudet on suunniteltu hyvin, ja niissä nähdään monien suunnittelumallien soveltamista käytäntöön: MVC: jokaisen hiemankin monimutkaisemman Swing-komponentin perustana nämä kolme osaa. Observer: tapahtumankuuntelijat ja kuunneltavat komponentit. Singleton: tietyt Swing-sovelluksen hallintaan ja asetuksiin käytetyt luokat, joilla on aina vain yksi ilmentymä. Factory: esimerkiksi erilaisten reunusten (border) luonti. Composite: komponenttien lisääminen säiliöihin asettelijoiden avulla.

perintä Tulostusvirrat aggregaatio (toimiminen toisen luokan rakenteellisena osana) PrintWriter OutputStream Writer BufferedWriter FileOutputStream tavuvirrat FilterOutputStream OutputStreamWriter FileWriter merkkivirrat Korkeimman tason virroissa ns. decorator-suunnittelumalli. Virrat ovat perusmerkkivirta Writerin aliluokkia (eli lupaavat saman toiminnallisuuden), mutta niiden toiminta perustuu johonkin toiseen, matalamman tason merkkivirtaolioon. Ne lisäävät sen ympärille uutta toiminnallisuutta, koristeita. Nämä virrat luodaan siis aina jonkin olemassa olevan virran pohjalle.