Java-ohjelmointi, koe 28.6.2006/AW (Avoin yliopisto) Arvosteluperusteet, perusteiden laatija Jukka Stenlund Nämä arvosteluperusteet eivät kuvaa täydellisesti jokaisen yksittäisen vastauksen arvostelua. Omien vastausten arvostelusta voi kysyä tarkemmin palautetilaisuudessa, jonka aika ja paikka ilmoitetaan kurssin kotisivuilla. 1. Tehtävän arvosteluperusteet ----------------------------- Tehtävän arvostelussa on lähdetty siitä, että tehtävän ydin oli periytymisen ymmärtämisessä. Niinpä koodi, joka toimi oikein, ei välttämättä saanut täysiä pisteitä, jos koodi vaikutti siltä, että periytymisen toimintaa ei ollut täysin ymmärretty. Vastauksissa esiintyi runsaasti kolmea virhetyyppiä, joista jokaisesta vähennettiin 4 pistettä täysistä pisteistä. Virhetyypit olivat seuraavat: 1. Virheeksi katsottiin, jos luokassa AvaruudenPiste määritellään metodit aseta(double x, double y) ja kuka(). Näille metodeille annetut toteutukset kutsuivat yliluokan vastaavia metodeita. Tällaisten metodien kirjoittaminen oli turhaa, koska AvaruudenPiste-luokka perii TasonPiste-luokalta nämä metodit. Koodi toimii oikein, mutta vaikuttaa siltä, että periytymistä ei ole täysin ymmärretty. Tehtävänannossa painotettiin erityisesti, että luokkaan tulee ohjelmoida vain tarpeelliset osat. -4 pistettä. 2. Pisteitä menetti, jos luokassa AvaruudenPiste viitattiin suoraan yliluokan TasonPiste private-kenttiin, yleensä kenttiin x ja y. Koska kentät ovat private, ei niihin voida suoraan viitata sen luokan ulkopuolelta, jossa ne on määritelty, ei edes luokan aliluokista. Kenttiä voi käyttää ainoastaan luokan TasonPiste julkisten metodien avulla. -4 pistettä. 3. Pisteitä menetti, jos jätti kutsumatta yliluokan parametrillista konstruktoria luokan AvaruudenPiste konstruktorin alussa tai yritti kutsua yliluokan parametritonta konstruktoria. TasonPiste-luokka ei määrittele parametritonta konstruktoria. Koska se määrittelee parametrillisen konstruktorin, ei sillä ole edes implisiittistä (eli koodiin kirjoittamatonta, mutta olemassaolevaa) parametritonta konstruktoria. Niinpä TasonPiste-luokan aliluokkien konstruktoreissa on kutsuttava jotakin TasonPiste-luokan parametrillista konstruktoria eksplisiittisesti (eli kirjoittamalla kutsu koodiin). -4 pistettä Erilaisista "pikkuvirheistä", jotka saattoi tulkita huolimattomuudeksi tai jotka muuten eivät olleet oleellisia tehtävän ytimen kannalta vähennettiin 1-2 pistettä. Sekalaisista kummallisuuksista vähennettiin 2-4 pistettä. Jos luokan lopusta puuttui luokan päättävä aaltosulje, ei tästä vähennetty pisteitä. 2. Tehtävän arvosteluperusteet ------------------------------ Kustakin kohdasta annettiin 0-4.5 pistettä. Yhteen lasketut pisteet pyöristettiin ylöspäin tasapisteiksi. a-kohta: Seuraavien asioiden mainitsemisesta sai pisteen kustakin, kuitenkin yhteensä korkeintaan 4.5 pistettä. -Luokka ladataan, kun suoritettava ohjelma viittaa ensimmäisen kerran tähän luokkaan. -Tällöin luokkamuuttujat saavat alkuarvonsa -ja mahdoliset staattiset alustuslohkot suoritetaan. -Olion luonti tapahtuu new-operaation avulla. -Oliota luotaessa ilmentymämuuttujat saavat alkuarvonsa -ja jokin konstruktori suoritetaan (tässä järjestyksessä). b-kohta: Seuraavat neljä asiaa olivat tärkeimmät mainita (jollain tavoin): -Luokkametodia kutsutaan luokkaan soveltaen, eli sitä voidaan kutsua, vaikkei luokasta olisi tehty yhtään ilmentymää: Luokka.metodi(parametrit) (1 p) -Luokkametodi voi käyttää vain luokkamuuttujia ja kutsua vain toisia luokkametodeita. (1 p) -Ilmentymämetodeita voi kutsua vain olioihin soveltaen: olio.metodi(parametrit) (1 p) -Ilmentymämetodi voi kutsua sekä ilmentymä- että luokkametodeita ja käyttää sekä ilmentymä- että luokkakenttiä. (1 p) Ideana siis, että metodin M luokka-/oliokohtaisuus vaikuttaa sekä siihen, miten metodia M voidaan kutsua että siihen, mitä metodeita metodi M voi kutsua. Seuraavia asioita mainitsemalla saattoi saada vielä puoli pistettä: -Oliolla on aina luokka, mutta luokasta ei ole välttämättä tehty ainuttakaan ilmentymää eli olioita. -Luokkametodi määritellään käyttäen static-määrettä, ilmentymämetodi ilman tätä määrettä. c-kohta: Asioita, joita oli syytä mainita: -teknisesti ottaen aliluokka perii yliluokan kentät ja metodit (2p) -periytymisellä voidaan mallintaa yläkäsite-alakäsite -suhdetta: aliluokka täydentää, erikoistaa, yliluokan määrittelyitä (Lehmä Eläimen aliluokkana yms.) (2p) Puoli pistettä saattoi saada vielä esim. mainitsemalla jonkin seuraavista: -aliluokan ilmentymää voidaan käyttää, kun vaadittu tyyppi on yliluokan tyyppi (Jos vaaditaan Eläin, niin Lehmä kelpaa) -aliluokka ei pääse suoraan käsiksi yliluokan private-kenttiin, mutta voi käsitellä niitä yläluokan julkisten metodien avulla -konstruktorit eivät periydy -yliluokka ei tunne aliluokkaansa -korvaaminen/peittäminen -luokalla voi olla monta aliluokkaa, mutta vain yksi yliluokka Huomio tehtävästä: Joissakin vastauksissa väitettiin, että aliluokka ei peri yliluokalta private-kenttiä. Kyllä se perii, vaikka ne eivät näy siihen. Tästä ei sakotettu, mutta hyvä tietää kuitenkin, miten asia oikeastaan on. d-kohta: Pisteitä sai seuraavasti: -abstrakti luokka ei (välttämättä) toteuta kaikkia metodeitaan (1 p) -rajapintaluokka ei anna toteutusta yhdellekään metodille (1 p) Näiden lisäksi seuraavista huomioista sai pisteen/kohta, kuitenkin korkeintaan 2.5 pistettä: -abstraktista luokasta ei voida luoda ilmentymiä -abstraktin luokan perilliset toteuttavat abstraktit metodit (tai ylipäänsä maininta siitä, että abstraktin luokan voi periä) -abstraktin luokan laatiminen on perusteltua, kun halutaan laatia yleiskäyttöinen luokka, jonka jotkit metodit vaaditaan ohjelmoitavaksi sovelluskohtaisesti aliluokassa -rajapintaluokka on keino kerätä yhteen luokkia, joilla on joitakin samankaltaiseen tarkoitukseen laadittuja samanotsikkoisia metodeita. -luokka L toteuttaa rajapinnan R antamalla toteutuksen kaikille rajapinnassa R määritellyille metodeille ja lupaamalla tämän otsakkeessaan -Luokka voi toteuttaa useamman rajapinnan, vaikka Javassa luokka voi periä vain yhden yliluokan. Rajapintaluokalla pyritään saamaan moniperinnän edut ilman sen haittoja. -rajapintaluokkaa tarvitaan, kun halutaan, että jossain kohdassa ohjelmaa voidaan käyttää useamman eri luokan ilmentymiä, eikä näiltä luokilta haluta vaatia, että niillä olisi yhteinen yliluokka. -rajapintaluokka ja abstrakti luokka ovat tyyppejä siinä kuin muutkin Javan tyypit Yhteensä tästäkin kohdasta saattoi siis saada 4.5 pistettä. 3. tehtävä ---------- -syntaksi "yleisesti ottaen" kunnossa, "näyttää javalta" (tätä pistettä ei kuitenkaan saanut, jos koodi oli kovasti kesken ja näin ollen lyhyeksi jäänyt) 1 -scannerin luominen näppäimistöä lukemaan 1 -tiedoston nimen lukeminen 1 -tiedosto-olion (File) luominen 1 -järkevä virheilmoitus tiedoston olemattomuudesta 1 -Scanner(File)-konstruktorin heittämän FileNotFound-poikkeuksen käsittely tai heittäminen virtuaalikoneelle 1 -scannerin luominen tiedostoa lukemaan 1 -talletustietorakenteen luominen 1 -tiedoston päättymisen tarkkailu 1 -seuraavan sanan lukeminen scannerista 1 -sanojen tallettaminen rakenteeseen 1 ...ilman duplikaatteja 1 -sanojen järjestäminen: -algoritmi kunnossa 1 -compareTo-metodin oikea käyttö 1 -rakenteesta lukeminen/rakenteeseen kirjoittaminen tehty oikein 1 -tulosten tulostaminen 1 -tiedoston sulkeminen 1 Täydet pisteet saattoi saada, vaikka koodissa olisi pieniä virheitä, joiden takia koodi ei menisi kääntäjästä läpi. Myöskään järjestysalgoritmissa esiintymeistä hyvin pienistä virheistä ei sakotettu. Sen sijaan pahoista virheistä koodissa saattoi saada jopa miinuspisteitä. Alle nollaa pistettä ei tehtävästä kuitenkaan voinut saada :) Huomioita tehtävästä: File-olion luominen ei aiheuta poikkeusta, vaikka olion edustamaa tiedostoa ei olisi olemassa. Sen sijaan Scanner-olion luominen lukemaan tiedostoa, jota ei ole olemassa, aiheuttaa poikkeuksen.