------------------------------------------------------------------------- Ohjelmoinnin perusteet, 13.11.2002 tehtävä 1 / Tanja K. ------------------------------------------------------------------------- 1) Vastaa lyhyesti ja täsmällisesti seuraaviin kysymyksiin (12 pist): YLEISTÄ o Keskiarvo 8.0 pistettä, 260 vastausta, joista 2 tyhjiä o Tehtävänannossa pyydettiin LYHYITÄ ja täsmällisiä vastauksia. Jokaisesta kohdasta oli mahdollista saada täydet pisteet korkeintaan muutaman rivin vastauksella, eikä kaksi sivua ylimääräistä selittelyä asiaan liittyen - tai sen vierestä - ole tehnyt mitään vaikutusta tarkastajaan. o Hyvä koodiesimerkki on usein kompensoinut sanallisen selityksen puutteita ========================================================================= a) Mitä tarkoittaa metodin kuormittaminen? Kuormittaminen tarkoittaa sitä, että luokassa on kaksi tai useampia samannimisiä metodeja, jotka eroavat toisistaan parametrien tyypin ja/tai määrän suhteen. Miksi ja mihin sitä käytetään? Joissain tilanteissa "sama asia" halutaan tehdä erilaisille parametreille. Koska välineen käyttäjän kannalta kyseessä on tavallaan sama operaatio, on luontevaa voida nimittää operaatiota yhdellä nimellä. Metodin kuormittamisella varaudutaan moniin erilaisiin parametriyhdistelmiin, joita kutsuja voi antaa. (Esim. kuormitettu tulostusmetodi System.out.print, tai kuormitetut konstruktorit.) 1 p: useita samannimisiä metodeja 1 p: ero parametrien lukumäärässä 1 p: tai niiden tyypeissä 1 p: miksi ja mihin Ensimmäiset kolme pistettä on jaettu kaavamaisesti sen mukaan, selviääkö vaadittu tieto vastauksesta. Neljännen pisteen on saanut monenlaisista korrekteista perusteluista. Yleisiä puutteita ja virheitä: ----------------------------- o Vastauksesta ei selviä, mihin ja miksi kuormittamista käytetään, tai kysymykseen on vastattu tyyliin "helpottaa ohjelmointia/ selkeyttää koodia". Siis miten? o On puhuttu SAMASTA metodista, jota voi kutsua erilaisin parametrein eikä vastauksesta käy ilmi, että vastaaja on ymmärtänyt kyseessä olevan USEITA samannimisiä metodeja. o Ed. kohtaan liittyi usein virheellinen ajatus, että kuormittamisen ansiosta kirjoitettavan koodin määrä vähenee, "kun joudutaan kirjoittamaan vain yksi metodi". (Kirjoitettavan koodin määrä ei vähene mihinkään, sillä jokaisen samannimisen metodin algoritmi joudutaan luonnollisesti koodaamaan erikseen.) o Korostettu sitä, että metodien parametrien on erottava nimenomaan tyypiltään. Kuormitettujen metodien parametrit voivat kuitenkin olla samantyyppisia eron ollessa parametrien lukumäärässä. o Se, että metodien parametrit eroavat nimeltään, ei ole kuormittamista, toisin kuin jossain paperissa vastattiin. Parametrien nimellä ei ole mitään merkitystä. o Parametrien osalta vain yhden pisteen sai puhumalla yleisesti "erilaisista parametreista". o Kuormitettujen metodien paluuarvoilla ei ole merkitystä, toisin kuin jotkut olivat vastanneet. Paluuarvot voivat erota tai olla samat - yhdentekevää. ========================================================================= b) Milloin metodin muuttuja syntyy? Milloin se häviää? Täydet pisteet on saanut esim. seuraavasta lauseesta. Metodin muuttujat luodaan, kun metodia kutsutaan, ja vapautetaan, kun metodista palataan kutsuvaan osaan. 2 p: synty 2 p: häviäminen B-kohta oli osattu hyvin, ja valtaosa vastaajista on saanut täydet 4 pistettä. Yksittäispisteitä on saanut, jos jompi kumpi vastauksen osioista oli "sinne päin". Yleisin puute/ virhe: -------------------- o Vastattu, että metodin muuttuja syntyy silloin, kun se määritellään. Jos vastauksesta ei ole (edes implisiittisesti) selvinnyt, että tarkoitetaan muuttujan määrittelyä metodin kutsun yhteydessä/ suorituksen aikana, ei synty-kohdasta ole saanut pisteitä. Useimmissa vastauksissa oli lisäksi innostuttu selittelemään yhtä sun toista ylimääräistä. Mitään seuraavaa EI kysytty: ---------------------------- Metodin muuttujia ovat metodin otsikossa esitellyt muodolliset parametrit ja metodin lauselohkossa ja sisemmissä lohkoissa esitellyt paikalliset muuttujat. Parametreilla on kutsussa asetettu alkuarvot, kun taas muille metodin muuttujille on eksplisiittisesti sijoitettava alkuarvo. Metodin lauselohkoissa (siis sulkeiden { } sisällä) esitellyt muuttujat ovat käytettävissä vain, kun ko. lohko tulee suoritettavaksi. Kun suoritus poistuu lohkosta, ei muuttujiin voi enää viitata. ========================================================================= c) Mihin tarkoitukseen public String toString() -metodia käytetään? Miten? Usein ohjelmassa halutaan tulostaa tietoja olion tilasta. Jos luokkaan määritellään toString()-niminen metodi, voidaan luokan ilmentymän tilan tulostaminen tehdä halutussa muodossa antamalla oliomuuttujan nimi suoraan System.out.print-metodille parametrina. toString() metodi palauttaa arvonaan merkkijonon (String), joka on muodostettu sopivalla tavalla olion tietorakenteiden arvoista kuvaamaan olion sisäistä tilaa. Kun oliomuuttuja esiintyy sellaisenaan paikassa, johon syntaksin mukaan pitäisi tulla merkkijono, kutsutaan toString()-metodia, joka siis palauttaa olion merkkijonoesityksen. Käyttö tulostuslauseessa: Radio asa = new Radio(); System.out.println(asa); Pisteytys: ---------- 1 p: käyttö olion tilan tietojen selvittämiseen 1 p: ohjelmoidaan luokkaan, jotta saadaan tilatiedot halutussa muodossa 1 p: metodi palauttaa (return-lauseella) merkkijonon, joka yleensä sisältää haluttujen kenttien arvot 1 p: oliomuuttuja voidaan antaa S.o.p-metodille parametrina sellaisenaan ToString()-metodin sanallinen selittäminen tuntui olevan vaikeaa ja koodiesimerkeillä olikin tämän kohdan arvostelussa suuri merkitys. Esimerkkiä ei kuitenkaan vaadittu. Virhevalikoima oli erittäin kirjava. Ohessa edustava otos puutteista ja virheistä: -------------------------------------------- o Ei ole huomattu, että toString()-metodi pitää itse ohjelmoida luokkaan palauttamaan haluttujen kenttien arvot, jotta sen kutsu tuottaisi toivotun selkokielisen raportin olion tilasta. o Yleinen virhekäsitys oli, että toString()-metodi itsessään tulostaa jotain. Joissain vastauksissa tätä oli havainnollistettu seuraavan tapaisella esimerkillä: public String toString(){ S.o.p("tietoa olion tilasta"); } Yhdessä paperissa metodin runko oli muodossa return System.out.print("tietoa olion tilasta") Nämä ovat VIRHEITÄ! Vähimmäisvaatimuksena olisi pitänyt oivaltaa, että String-tyyppinen metodi palauttaa aina String-tyyppisen arvon. o Muistettu, että Pikkuvarasto-luokassa tällainen on, ja sen ansiosta Pikkuvarasto-olion tila voidaan tulostaa esim. muodossa mehua : 0.0. Olettakaamme kuitenkin, että tarkastajamme ei ole perehtynyt sisäpiiri- juttuihin. Siis mitä tämä vastaus hänelle kertoo toString()-metodista? Pelkästä oppimateriaaliesimerkin ulkoa toistamisesta on saanut korkeintaan pisteen, ellei ohesta ole käynyt ilmi, että asia on myös ymmärretty, ja vastaaja osaa sitä tarvittaessa soveltaa muuhunkin kuin pikkuvarastojen tilan tulostamiseen. o Vaikeuksia luokan ja olion suhteen hahmottamisessa, esim: "toString()-metodi kirjoitetaan olioon" (ei, vaan luokkaan). o Metodi sekoitettu String-luokan compareTo-metodiin, jolla verrataan merkkijonojen aakkosjärjestystä. o Koodiesimerkeissä hyvin yleinen pikkuvirhe, josta ei kuitenkaan erikseen sakotettu, oli sulkujen kirjoittaminen toString()-metodin return-lauseen yhteyteen seuraavasti: return("palautettava stringi"); =========================================================================