581326-3 Java-ohjelmointi, koe 14.12.2005/AW 1. tehtävän arvosteluperiaatteet Aki Korpua Tehtävänanto: ----------------------------------------------------------------------------------------- Luokka Piste on määritelty: public class Piste { private static int lkm=0; private int x=0, y=0; private final int minä; public Piste(int x, int y) { this.x = x; this.y = y; ++lkm; minä=lkm; } public int kuka() {return minä;} public void aseta(int x, int y) { this.x = x; this.y = y; } public String toString() { return "("+ kuka() + ")(" + x+"," + y + ")"; } } Ohjelmoi tälle luokalle aliluokka VarillinenPiste, joka on kuin piste täydennettynä väriä esittävällä double-arvolla. VarillinenPiste-ilmentymiä luodaan konstruktoreilla: * public VarillinenPiste() konstruoi VarillinenPiste-olion, jonka x ja y ovat 0 ja väri on 0.0. * public VarillinenPiste(int x, int y, double väri) konstruoi VarillinenPiste-olion annetuin parametrein. VarillinenPiste-oliolle on käytettävissä aksessorit: * public void aseta(int x, int y, double väri) asettaa VarillinenPiste-olion kaikille kentille arvon. * public void aseta(int x, int y) asettaa VarillinenPiste-olion x- ja y-koordinaatille arvon. * public void aseta(double väri) asettaa VarillinenPiste-olion värin. * public int kuka() palauttaa arvonaan VarillinenPiste-olion yksikäsitteisen identiteetin. * public String toString() palauttaa arvonaan selkeän merkkiesityksen VarillinenPiste-oliosta. Ohjelmoi luokkaan VarillinenPiste vain tarpeelliset osat. Luokkaa Piste ei saa muuttaa. Maksimipisteet: 17p -------------------------------------------------------------------------------------------- Arvostelu ja kommentit: -------------------------------------------------------------------------------------------- Tehtävässä oli tärkeintä huomata, että kentät x ja y ovat private kenttiä, jolloin niihin ei voida viitata aliluokasta vaan täytyy käyttää super:n avulla yliluokan aksessoreita, konstruktoreita ja metodeja. Toinen juttu olisi ollut tietenkin, jos ne olisivat olleet määritely protected. Täydet pisteet: -kapselointi on tajuttu: yliluokan muuttujat private-tyyppisiä, niihin ei voida viitata -Super:ia on osattu käyttää oikein. -ei ole toteutettu mitään ylimääräisiä metodeja tai muuttujia -väri-muuttuja on määritelty. -perinnän syntaksi on oikein: extends Piste Jonkin näiden ominaisuuksien puuttumisesta tai väärinkäytöstä otettiin pisteitä pois. Joitakin pieniä lipsuksia syntaksissa on armahdettu. Kohtia joihin on kiinnitetty huomiota arvostelussa: -käytetään suoraan yliluokan muuttujia, kapselointia ei ole tajuttu eikä superia käytetä. Tällöin on saanut pisteitä tuskin lainkaan, sillä tämä oli tärkein osa tässä tehtävässä. Muutamia pisteitä on annettu oikeasta muuttujien määrittelystä, perinnäntoteutuksesta ja esim. public void aseta(double väri)-metodin oikeasta määrittelystä. -kuormitettu tarpeettomasti yliluokan metodeja -2 tai -3p (riippuen miten kuormitettu) -väri-muuttuja ei ole private -2p tai se on static -3p -superia käytetään jossain kohtaa vain vähän väärin, mutta idea ymmärretty -2p -Jossain kohtaa oli rikottu kapselointia pahasti (käytetty suoraan x ja y arvoja), mutta useimmissa kohtaa oli osattu käyttää hyvin Super:ia. -6p -Oliokohtaista MINÄ-arvoa oltiin toteutettu uudestaan -4p -Ohjelmointivirheistä, ylimääräisestä turhasta koodista tai ajatusvirheestä -1p Yleisesti ottaen tehtävässä oli joko osattu käyttää oikein super:ia tai sitten ei oltu osattu lainkaan, minkä takia pistejakauma on niin jyrkkä. Yksi hyvin yleinen virhe, joka tiputti täyden pisteen ratkaisuja, oli public void aseta(int x, int y)- ja public int kuka()-metodien uudelleen kirjoittaminen, tehtävänannossa sanottiin: Ohjelmoi luokkaan VarillinenPiste vain tarpeelliset osat. ------------------------------------------------------------------------------------- Malliratkaisu: ------------------------------------------------------------------------------------- public class VarillinenPiste extends Piste { private double väri; public VarillinenPiste() { super(0, 0); this.väri = 0.0; } public VarillinenPiste(int x, int y, double väri) { super(x,y); this.väri = väri; } public void aseta(int x, int y, double väri) { super.aseta(x, y); this.väri = väri; } public void aseta(double väri) { this.väri = väri; } public String toString() { return super.toString() + " (väri=" + väri +")"; } }