******************************** Ohjelmoinnin jatkokurssi Kurssikoe 8.12.2008/AW Tehtävä 1, arvosteluperusteita Petri Vuorio ******************************** Tehtävässä keskeisintä oli hahmottaa periytymiseen ja kapselointiin liittyviä asioita. Tehtävän lähtöoletus oli, ettei yliluokasta tiedetä api:n lisäksi mitään muuta. Tehtävänannossa mainitut tietojen tallennus ja käsittely täytyy toteuttaa, mikäli sitä ei voida tehdä yliluokan api:n kautta. Tehtävässä tuli siis toteuttaa operaattoritiedon tallennus, mutta muut tiedot käsittelee yliluokka. Täydet pisteet: - kapselointi on ymmärretty: - yliluokan tiedot saa vain yliluokan rajapintakutsuilla - aliluokan yksityisillä muuttujilla private-määre - periminen on ymmärretty: - luokan perinnän syntaksi on oikein - super():n oikea käyttö - toteutettu ainoastaan tarpeelliset osat - ei oleellisia ohjelmointi- tai syntaksivirheitä 2p 2 parametrin konstruktori = 1p super():a käytetty oikein muttei ensimmäisenä tai virheellisin parametrein = 2p toimii oikein 2p 1 parametrin konstruktori (kuten edellinen) 4p mitäOn() = 1p ei toimi, hyvä lähestymistapa tai useita tai vakavia virheitä, super:a osattu käyttää = 2p ei toimi oleellisen virheen takia = 3p toimii suunnilleen, kömpelöhkö toteutus tai pikkuvirheitä = 4p toimii hyvin 2p poistaTieto() = 0p jos toteutettu miten tahansa = 2p jätetty perittäväksi (vaikka vahingossakin, kunhan muut osat tehtävästä tehty) 2p toString() = 0p jos super.toString():ä ei käytetty tai käytetty väärin tai käytetty tulostuslausetta = 1p pikkuvirheitä = 2p toimii hyvin 2p operaattori() = 0o operaattorikenttä ei ole private = 1p ei toimi, mutta operaattorikenttä on private = 2p toimii ja operaattorikenttä on private 2p main() = 1p puutteita, esim. muita kuin toString()-aksessoreita ei käytetty = 2p toimii hyvin Yhteensä 16p Seuraavista virheistä sakotettiin kokonaispistemäärää: - luokan ja perinnän määrittelyssä virheitä -2p - konstruktorissa yritetty alustaa luokkaa new-operaattorilla -2p - muuttujan nimi ei ala kirjamella -2p - huolimattomuusvirheitä -1-2p - toistuvasti esittelemättömiä muuttujia - toistuvasti metodikutsu ilman ()-merkkejä (kenttäviittauksen syntaksi) - merkkijonoliteraalivakioita kirjoitettu ilman lainausmerkkejä mitäOn()-metodin muita tyypillisiä virheitä: - String-olio ei ole taulukko -> ei voi indeksoida -2p -> käytettävä esim. charAt()-metodia tai muunnettava char-taulukoksi - char-taulukkoon sijoitetaan null -2p - muutettaessa taulukkoa String:ksi ei huomoitu pituutta -1p - String, johon katenoidaan, ei alustettu -1p - mitäOn()-metodissa oletettu tiedon mahtumaan tiettyyn kokoon -1p Seuraavilla seikoilla ei ollut vaikutusta arvosteluun: - TiedonHakija-luokka toteutettu - puuttuvia puolipilkkuja - sulkujen määrässä pieniä virheitä - selvät kirjoitusvirheet - toString()-metodissa ei katenoitu välimerkkiä operaattorin ja super.toString():n väliin - main()-metodi sijoitettu erilliseen luokkaan - salainenKoodi tallennettu olion kenttään (tarpeetonta tässä!) /* * Ohjelmoinnin jatkokurssi * Kurssikoe 8.12.2008/AW * Tehtävä 1 * Esimerkkiratkaisu, laatinut Petri Vuorio */ public class Teletunnistetiedot extends TiedonHakija { // Määritellään vakioksi, koska ei ole tarvetta muuttaa. // Hyväksytty myös ilman final-määrettä. private final String OPERAATTORI; public Teletunnistetiedot(String operaattori, String salainenKoodi) { // super():a on pakko kutsua, koska yliluokalla ei ole parametritonta // konstruktoria! Toisaalta tehtävänantokin sitä vaatii... super(salainenKoodi); this.OPERAATTORI = operaattori; } public Teletunnistetiedot(String operaattori) { // Käytetään olemassa olevaa konstruktoria hyväksi. // Ensimmäisen konstruktorin kaltainen ratkaisu hyväksyttiin myös. this(operaattori, "007"); } public String operaattori() { return this.OPERAATTORI; } // Tämä on yksi yksinkertainen tapa toteuttaa metodi. // Kirjaimerkkien korvaaminen toisella merkillä hyväksyttiin myös. public String mitäOn(String kuka) { String kaikkiTiedot = super.mitäOn(kuka); // Tiedot yliluokasta String teletunnistetiedot = ""; // Tähän muodostetaan sensuroidut tiedot char apuMerkki; // Apumuuttuja for (int i = 0; i < kaikkiTiedot.length(); ++i) { apuMerkki = kaikkiTiedot.charAt(i); // Onko indeksoitu merkki muu kuin kirjainmerkki (negaatio !)? if (!Character.isLetter(apuMerkki)) { // Tässä katenoinnissa Java tekee automaattisesti tyyppimuunnoksen. teletunnistetiedot += apuMerkki; } } return teletunnistetiedot; } // public boolean poistaTieto(String kuka) {} // Metodia ei tarvitse eikä pidä(!) toteuttaa, sillä se peritään sellaisenaan // yliluokasta. public String toString() { return this.operaattori() + ": " + super.toString(); } // Pääohjelma havainnollistamaan luokan toimintaa. public static void main(String[] args) { Teletunnistetiedot a = new Teletunnistetiedot("Sorena"); Teletunnistetiedot b = new Teletunnistetiedot("Ilesa", "salaisuus"); System.out.println("a:n operaattori on " + a.operaattori()); System.out.println("b:n operaattori on " + b.operaattori()); System.out.println("a:n Jorma-teletunnistetiedot: " + a.mitäOn("Jorma")); System.out.println("b:n Jorma-teletunnistetiedot: " + b.mitäOn("Jorma")); // Poistetaan tietoja a.poistaTieto("Jorma"); b.poistaTieto("Jorma"); // Tulostetaan toString()-paluuarvot System.out.println(a); System.out.println(b); } }