Tehtävässä oli tarkoitus toteuttaa tehtävänannossa annetun luokan Puurokattila aliluokka Joulupuurokattila. Luokasta Puurokattila annettiin ainoastaan seuraava ohjelmointirajapinta kuvauksineen (joita ei ole otettu tähän): konstruktori Puurokattila(double annos) public void lisääAinetta(double määrä) public double annaPuuroannos() Minkään muiden rajapintojen olettaminen luokkaan Puurokattila oli virhe. Tehtävässä erikseen sanottiin, että luokkaa Puurokattila ei tule ohjelmoida. Tehtävä on kuitenkin arvosteltu siitä armollisesti, että ylimääräisen tavaran kirjoittamisesta ei rangaistu erikseen, ja yliluokan turhasta ohjelmoimisesta ei rangaistu lainkaan. Itse asiassa yliluokan toteutuksia ei edes katsottu. Luokkaan pyydettiin toteuttamaan metodit Joulupuurokattila(double annos) public void lisääManteleita(int määrä) public double annaPuuroannos() Muita metodeita ei kaivattu, ne tarjosivat vain lisämahdollisuuden osoittaa, ettei osaa javaa. Eli jos ylimääräiset metodit olivat oikein, tämä laskettiin kahteen (2!) pisteeseen, jotka kuvasivat luokan kirjoittamisen osaamista. Jos taas ne eivät olleet oikein, pisteitä saattoi mennä joko vaadittujen metodien pisteistä (vaadittujen metodien apumetodeista tulevat pisteet laskettiin siis metodien käyttöyhteydessä) tai sitten noista kahdesta pisteestä. Pisteitä jaossa 17p, jotka tulevat seuraavasti: Luokka on Puurokattila-luokan aliluokka (avainsana extends) (1p) Tästä ei saanut pisteitä, jos unohti kirjoittaa luokan olevan aliluokka (mistä tuli muitakin ongelmia), tai jos muisti avainsanan merkitsevästi väärin ('extend' hyväksyttiin vielä, 'excludes' tai 'implements' ei). Luokalla on luokan rakenne (kentät, metodit) (2p) tästä sai 0p: class-määre puuttuu, luokan rakenne täysin hukassa (esim. muita metodeita määritelty main-metodin sisällä, ei onnistu javassa), javan syntaksissa virheitä (sulkeet kadoksissa), (hyvin) virheellisiä ylimääräisiä metodeja ei määritelty kenttiä, ei määritelty kenttää manteleille, määritelty kenttä annokselle ja puuromäärälle, mutta ei määritelty korvaavaa metodia lisääAinetta() ja/tai useita yhden pisteen virheitä 1p: kentät eivät ole private, metodit eivät ole public, omituinen static - määre jossain, metodien sisäisiksi sopivia apumuuttujia määritelty luokan kentiksi, tai virheellinen ylimääräinen metodi 2p: ks. esimerkkivastaus luokan rakenteesta Luokan loppusulun löytymistä ei tarkistettu. Konstruktori: (4p) ainut ja oikein esitelty 1p Tätä pistettä ei herunut esim. jos public luokan konstruktori oli private tai näkyi vain omassa pakkauksessa. Tehtävänanto saattoi johtaa tässä hieman harhaan, ne nokkelat ihmiset jotka ymmärsivät huomauttaa aiheesta vastauksessaan saivat toki pisteen. Jos metodissa oli javan syntaksivirheitä, tätä pistettä ei myöskään saanut, eikä jos luokassa oli muitakin konstruktoreita. alustaa luokan kentät oikein 3p Tästä ei tullut täysiä pisteitä, jos alustettiin jotain kenttiä, joita ei oltu määritelty, tai alustettiin jotain kenttiä, joiden väitettiin periytyneen yliluokalta. Luokan omien kenttien alustamatta jättäminen ei ollut virhe, yliluokan mahdollisten kenttien jättäminen sen sijaan oli. Yliluokan konstruktorin kutsu tuotti 3p oikealla parametrillä. Parametria ei lopulta tarvinnut tarkistaa, koska tehtävänannossa ei vaadittu, eikä myöskään kerrottu, mikä laillinen annos sitten olisi. Tarkistaminen ei ollut virhe, jos sen teki oikein, eli yliluokan konstruktorin kutsun on oltava konstruktorin ensimmäinen lause. Esimerkki (ei ainut mahdollinen 4p vastaus): public Joulupuurokattila (double annos) { super(annos > 0 ? annos : -annos); manteleita = 0; // ei pakollinen } metodi lisääManteleita: (3p) oikein esitelty 1p Tästä ei tullut pisteitä, jos metodin määrittely oli muuttunut tehtävänannosta, tai jos metodissa oli Javan syntaksissa virheitä. manteleiden määrä muuttuu oikein 2p Manteleiden määrän piti lisääntyä parametrina saadun määrän verran tai vähentyä määrän verran, kuitenkin vähintään nollaan. Kovin tyypillinen virhe oli se, että negatiivinen parametri vähennettiin mantelien määrästä, jolloin itseasiassa lisätään manteleita. Tällöin sai korkeintaan 1 pisteen tästä kohdasta. Jos muutettiin jotain esittelemätöntä muuttujaa tai mantelien määrä ei muuttunut, tästä ei saanut pisteitä. Esimerkki (ei ainut 3p vastaus): public void lisääManteleita (int määrä) { if ((manteleita += määrä) < 0) manteleita = 0; } metodi annaPuuroAnnos: (7p) oikein esitelty 1p Kuten yllä. Tyypillisiä virheitä oli yritys kutsua yliluokan metodia kuin se olisi staattinen metodi, oikea tapa on 'super.annaPuuroAnnos()'. toimii oikein: annoksen selvittäminen, 2 tapausta, 2p Tästä ei saanut pisteitä, jos käytti jotain määrittelemättömiä muuttujia tai yritti antaa annosta määrästä, jota ei ollut. Yliluokan metodin kutsuminen ja tuloksen ottaminen talteen oli helpoin tapa saada tästä täydet pisteet. Toinen oli ollut korvata kaikki yliluokassa mahdollisesti oleva, eli käytännössä kirjoittaa yliluokka uusiksi aliluokkaan. ainemäärä vähenee oikein 1p Sama kuin annoksen selvittämisessä, lisäksi tästä ei saanut pisteitä jos yliluokan metodia kutsui koska sattuu, joka kutsuhan vähentää puurokattilan puuron määrää. annoksen merkki oikein 2p Annoksen merkin piti olla negatiivinen, jos annoksessa ei ole mantelia, eli manteleitahan ei tullut jos annosta ei ollut, manteleita ei ollut tai tuuri ei käynyt tehtävänannossa annetun arvonnan kanssa. Jos merkki meni yhdessä tapauksessa väärin päin tai manteleita vähennettiin vaikka ei ollut annosta, tästä sai yhden pisteen. Jos merkki oli konsistentisti väärin päin tai sekoiltiin muuten pahemmin, tästä ei saanut pisteitä. mantelit vähenevät 1p Jos manteleita vähennetään silloin kuin pitääkin ja ne jäävät vähintään nollaan, tästä sai yhden pisteen. Jos edellisessä kohdassa sähellettiin mantelien kanssa, pisteet lähtivät jo siitä. Varsinkin tässä metodissa yleinen virhe oli se, että metodista poistuttiin returnilla ennen aikojaan. Returnin jälkeisiä rivejä ei suoriteta. Esimerkki: public double annaPuuroAnnos() { double annos = super.annaPuuroAnnos(); if ((annos > 0) && (manteleita > 0) && (Math.random() < 0.2)) { lisääManteleita(-1); return annos; } return -annos; } Kokonainen esimerkkivastaus: public class Joulupuurokattila extends Puurokattila { private int manteleita; public Joulupuurokattila (double annos) { super(annos > 0 ? annos : -annos); // tarkistus ei välttämätön manteleita = 0; // ei välttämätön } public void lisääManteleita (int määrä) { if ((manteleita += määrä) < 0) manteleita = 0; } public double annaPuuroAnnos() { double annos = super.annaPuuroAnnos(); if ((annos > 0) && (manteleita > 0) && (Math.random() < 0.2)) { lisääManteleita(-1); return annos; } return -annos; } } -- Jaakko Nurro "If you feel anything, be brave, come forth, let it show." Happy Rhodes: Words Weren't Made For Cowards