Johdatus ohjelmointiin, syksy 1998. 2. välikoe 17.12.1998, tehtävä 3 Arvosteluperusteet ja esimerkkiratkaisuja (Sami Nikander) Yleistä tehtävän arvostelusta: ------------------------------ Tehtävässä piti selostaa luokan lataaminen (2 p) ja olion luonti (2 p), sekä valaista myös, miksi nämä käsitteet ovat tärkeitä (1 p), yht. 5 p. Selostuksen kohderyhmäksi ajatellaan "opiskelijakollega". Vastauksessa pitäisi siis selostaa em. käsitteet (ei vain toistaa papukaijamaisesti esim. kirjan tekstiä) ja osoittaa niiden tärkeys esim. kertomalla, millä tavoin käsitteet eroavat toisistaan, miksi niiden ero on niin olennainen ja miten ero käytännössä ilmenee. Koska kyseessä on ohjelmoinnin, eikä pedagogiikan koe, ei arvostelussa voitu pitää vastauksen pedagogista hyvyyttä itseisarvona, eli palkita vastauksen opetuksellisia ansioita. Toiselle kertominen on kuitenkin hyvä tapa mitata asian ymmärtämistä, joten vastauksista on yritetty kaivaa lähinnä sitä kätkettyä tietoa, onko asia mennyt kertojalle itselleen perille. Tiedollisesti hyvä vastaus, joka on pedagogisesti huono, on saattanut siis saada täydet pisteet, mutta ansiokaskaan selitys, joka paljastaa *puutteet selittäjän tiedoissa*, ei ole saanut hyviä pisteitä. Valitettavasti en ole voinut palkita myöskään monia viihdyttäviä ja runollisia vastauksia pelkästään niiden viihdearvon takia. En myöskään ole voinut palkita yleisiä meta-selostuksia siitä, kuinka hienoa olio-ohjelmointi on ja kuinka tärkeää olisi ymmärtää kyseessä oleva asia (jota ei kuitenkaan sitten lopulta selitetä). Kovin moni tuntui nähneen (sinänsä turhaa) vaivaa muotoillakseen vastauksensa tarpeettoman tuttavalliseksi tai kevytsävyiseksi, vaikka se usein heikensi vastauksen informaatiosisältöä. Sinänsä oli oikein liikuttavaa lukea niin monenmonta "Hyvä Ystävä"-aloitusta tenttivastauksista! :-) Esimerkit, kuvat ja kaaviot ovat aina hyviä selventämään asiaa, joten niitä käyttämällä on voinut korvata tai täydentää sanallista selostusta, mutta täydet pisteet on voinut saada vallan hyvin ilman kuvia ja käppyröitä. Millainen on hyvä vastaus? Pohdintaa ja esimerkkejä: ---------------------------------------------------- Sinänsä on varmaan itsestäänselvää, että näiden käsitteiden ymmärtäminen on tärkeää Java-ohjelmoinnissa, joten triviaalivastauksia ("jotta osaisi ohjelmoida paremmin", "koska sitä kysytään kokeessa") ei hyväksytty, eivätkä ne vastaakaan kunnolla tärkeyskysymykseen. Vastaus kysymykseen, miksi nämä käsitteet ovat tärkeitä ymmärtää, voisi olla esim. seuraavanlainen: "Luokka/olio -rakenteen oleellisimpia käsitteitä on ero luokan staattisten ja ei-staattisten (dynaamisten) ominaisuuksien välillä: missä vaiheessa luokan ja olion eri ominaisuudet tulevat käyttöön ja eri alustukset suoritetaan. Heti kun luokka on ladattu, sen luokkakohtaiset (staattiset) ominaisuudet (staattiset metodit ja muuttujat) ovat käytettävissä, vaikka yhtään ilmentymää ei vielä olisi luotukaan. Luokan lataamisen jälkeen on *mahdollisuus* luoda olioita. Sen sijaan oliokohtaiset ominaisuudet alustetaan kullekin oliolle erikseen sitä luotaessa, ja pelkkä luokan lataaminen ei vielä tarjoa pääsyä oliokohtaisiin muuttujiin ja metodeihin. Luokka voi siis olla olemassa ilman oliota (ilmentymää), mutta olion luonti edellyttää aina vastaavan luokan olemassaoloa (ja lataamista)." Luokan lataamisen ja olion luonnin mekanismia selostaessa riitti kurssikirjassa (Luku 4.2.3, s. 146) esitetty tarkkuus asioiden kulusta. Täten täydet pisteet luokan lataamisesta/olion luonnista sai melko vähäisellä kirjoittamisella. Alla on minimaalinen vastaus, jolla sai täydet pisteet itse käsitteiden selostamisesta: suora lainaus kappaleesta 4.2.3 "Luokan lataaminen ja olion luonti". "Kun suoritetettava ohjelma viittaa ensimmäisen kerran johonkin luokkaan, tuo luokka ladataan (load) muistiin. Tällöin luokan staattinen kalusto asetetaan alkutilaan: luokkamuuttujat saavat alkuarvonsa, mahdolliset staattiset alustuslohkot suoritetaan. Aina kun suoritettava ohjelma luo olion eli luokan ilmentymän new-operaatiolla, tuon olion oma kalusto asetetaan alkutilaan: ilmentymän muuttujat saavat alkuarvonsa ja jokin konstruktori suoritetaan (nimenomaan tässä järjestyksessä). " Seuraavassa muutamia yleisimpiä virheitä/puutteita, joita ilmeni vastauksissa: - Ei mainintaa staattisten alustuslohkojen suorittamisesta (-½ p) - Muuttujien alustuksesta ei mainintaa (luokka-/ilmentymämuutt.) (a' -½ p) - Olion luonnissa ei mainita konstruktorin suoritusta/new-kutsua (a' -½ p) - Olion luonti määritellään vain "konstruktorin kutsuksi" (-½ p) - Konstruktorin kutsu väitetään tapahtuvaksi ennen ilmentymä- muuttujien alkuarvojen asettamista (jos näin väitettiin eksplisiittisesti, sakotin pisteitä - jos asioiden järjestyksestä oltiin hiljaa, katsoin läpi sormien). (-½ p) - Luokan lataaminen väitetään tapahtuvaksi aina kun olio luodaan, konstruktoreiden suoritus väitetään tapahtuvaksi aina luokan latauksen yhteydessä tai muuten sekoitettu, mitä tapahtuu missäkin ohjelman suoritusvaiheessa. (-1 p tai enemmän) - Selostetaan muuten virheettömästi eri käsitteitä, mutta sekoitetaan johdonmukaisesti termit staattinen ja ei-staattinen. Tämä on ehkä ollut pelkkä muistivirhe joidenkin kohdalla, mutta ero on niin oleellinen, että pisteet ovat ropisseet heti - näitä ei saa sekoittaa! (-1 p tai enemmän) - Puhutaan epämääräisesti "kaluston alkutilaan saattamisesta", määrittelemättä tarkemmin, mitä tämä kalusto on. Pelkästään "kalustosta" epätarkasti puhuminen vei heti pisteitä, sen sijaan en sakottanut epätarkkuudesta tai väärinkäsityksestä, joka useimmissa vastauksissa näkyi: selostettiin erillisinä asioina "kaluston käyttöönottoa", "muuttujien alustamista" ja esim. "konstruktorin suoritusta", vaikka tuo "kaluston käyttöönotto" nimenomaan tarkoittaa kahta jälkimmäistä toimenpidettä. (-1 p) - On luultu virheellisesti "luokan lataus" pakkauksiin ja import-määreeseen liittyväksi asiaksi. Ihan päin honkia! (-1 p tai enemmän) - On sekoitettu periminen ja aliluokat luokkien lataamiseen tai olioiden luontiin. Sekin aivan väärä käsitys. (-1 p tai enemmän)