{"id":64,"date":"2018-01-12T17:42:03","date_gmt":"2018-01-12T15:42:03","guid":{"rendered":"https:\/\/coursepages.uta.fi\/tiea2-1\/?page_id=64"},"modified":"2018-03-29T19:40:35","modified_gmt":"2018-03-29T16:40:35","slug":"ratkaisujen-tarkistus","status":"publish","type":"page","link":"https:\/\/coursepages2.tuni.fi\/tiea2-1\/kevat-2018\/harjoitukset\/ratkaisujen-tarkistus\/","title":{"rendered":"Ratkaisujen tarkistus"},"content":{"rendered":"<p>Ratkaisuja tarkistetaan sek\u00e4 automaattisesti ett\u00e4 opettajien toimesta. Automaattinen tarkistus tapahtuu osin Lausekielinen ohjelmointi I ja II -kurssien <a href=\"https:\/\/coursepages2.tuni.fi\/tiep1\/syksy-2017\/harjoitukset\/ratkaisujen-tarkistus\/#automaattinen_tarkistus\">tapaan<\/a> testeill\u00e4, joissa verrataan malliratkaisun ja opiskelijan ratkaisun tulosteita. Testauksessa voidaan tutkia automaattisesti my\u00f6s <span style=\"background-color: #ffff99\">ohjelman rakennetta<\/span>. Automaattisesta testauksesta kerrotaan asianomaisissa teht\u00e4v\u00e4nannoissa ja kunkin teht\u00e4v\u00e4n testit kuvaillaan tarkemmin WETOssa. WETO tulostaa rakennetestin ep\u00e4onnistuessa lyhyen virheilmoituksen. Tarkista virheen tapahtuessa, ett\u00e4 olet esitellyt testatun piirteen teht\u00e4v\u00e4nannossa pyydetyll\u00e4 tavalla. Esimerkiksi metodien n\u00e4kyvyysm\u00e4\u00e4reiden tulee olla teht\u00e4v\u00e4nannossa m\u00e4\u00e4riteltyj\u00e4. Ota yhteytt\u00e4 kurssin vastuuopettajaan, jos en keksi j\u00e4rjellisess\u00e4 ajassa miksi WETO ei hyv\u00e4ksy ohjelmaasi. Huomaa, ett\u00e4 ohjelmasi ei ole varmasti oikeellinen, vaikka testaus onnistuu, koska testit kattavat vain osan ohjelman toiminnallisuudesta ja rakenteesta.<\/p>\n<p>Kurssin opettajat tarkistavat kullakin viikkoharjoituskerralla nelj\u00e4 teht\u00e4v\u00e4\u00e4 niiden rakenteen osalta. Ratkaisua arvioitaessa voidaan esimerkiksi tutkia onko luokan tiedot k\u00e4tketty pyydetyll\u00e4 tavalla ja onko luokassa kaikki tarvittavat metodit. Opettajat voivat tarkistaa ratkaisut my\u00f6s tyylin eli hyv\u00e4n ohjelmointitavan noudattamisen osalta. Tyylitarkistus voi kohdistua mihin tahansa teht\u00e4v\u00e4\u00e4n. N\u00e4in esimerkiksi huono sisennys voi tuottaa nollan, vaikka ohjelma l\u00e4p\u00e4isee WETO-testit. Muista noudattaa hyv\u00e4n ohjelmointitavan perusteita (Lausekielinen ohjelmointi I -kurssin luentomateriaalin 14. luku) ja uusia hyvi\u00e4 tapoja (Lausekielinen ohjelmointi II -kurssin luentomateriaalin 7. luku). Noudata my\u00f6s t\u00e4m\u00e4n kurssin kuluessa opetettavia hyvi\u00e4 tapoja: \u00c4l\u00e4 muun muassa nime\u00e4 aksessoreita kahta kielt\u00e4 k\u00e4ytt\u00e4en. Teht\u00e4v\u00e4nannossa kerrotaan, jos teht\u00e4v\u00e4n ratkaisut arvioidaan tyylin osalta.<\/p>\n<p>Tarkistus kohdistuu satunnaisesti valittuun otokseen palautuksia, jolloin osa ratkaisuista j\u00e4\u00e4 tarkistamatta ja on mahdollista, ett\u00e4 tuurillakin voi saada pisteen. Tutustu mallivastauksiin v\u00e4hint\u00e4\u00e4n tarkistettujen teht\u00e4vien osalta, jotta mahdolliset virheet omassa ratkaisussa eiv\u00e4t j\u00e4isi huomaamatta. Huonolaatuinen ty\u00f6 n\u00e4kyy kuitenkin ennemmin tai my\u00f6hemmin nollina, koska otos on suuri. Varmin tapa hankkia ykk\u00f6nen on tehd\u00e4 kaikki teht\u00e4v\u00e4ss\u00e4 pyydetty ja testata ohjelmaa.<\/p>\n<p>Opettajat kirjoittavat WETOon kommentteja vain, kun nollan syy ei ole ilmiselv\u00e4. Kaikki muu palaute ratkaisuista annetaan keskitetysti alempana. Huomaa, ett\u00e4 ratkaisuja ei voi korjata. Nolla vaihtuu ykk\u00f6seksi vain, jos tarkistaja on tehnyt virheen.<\/p>\n<p>Opiskelijoiden tulisi tarkistaa pisteens\u00e4 arvosteluvirheiden varalta aina, kun kurssin postilistalla ja <em>Ajankohtaista<\/em>-palstalla viestit\u00e4\u00e4n harjoituksen pisteiden olevan valmiit. N\u00e4et harjoituksen <em>x<\/em> pisteet WETOssa <em>Olio-ohjelmoinnin perusteet 2018<\/em> | <em>Viikkoharjoitukset<\/em> | <em>Harjoitus<\/em> <em>x<\/em> -kohdan <em>Grading<\/em>-v\u00e4lilehdelt\u00e4. Ota yhteytt\u00e4 teht\u00e4v\u00e4n tarkistajaan, mik\u00e4li ep\u00e4ilet tarkistuksessa tapahtuneen virheen. Ota yhteytt\u00e4 ryhm\u00e4n vet\u00e4neeseen opettajaan, jos l\u00e4sn\u00e4olopiste puuttuu. (Luupin koodauspajan osalta yhteydenotot Jormalle.) L\u00f6yd\u00e4t mahdolliset kommentit nollaan johtaneista syist\u00e4 teht\u00e4v\u00e4n <em>Grading<\/em>-v\u00e4lilehdelt\u00e4, jossa on viel\u00e4 napsautettava pisteen rivi\u00e4, jotta kommentti avautuu.<\/p>\n<p><strong>Harjoitus 1<\/strong><\/p>\n<p>Tarkistetut teht\u00e4v\u00e4t ja teht\u00e4vien tarkistajat olivat: 2) oppilaitos, Kari, 4) alkuaine, Kimmo, 5) kaivuri, Antti ja 6) oma luokka, Jorma.<\/p>\n<p>2) Tiedonk\u00e4tkenn\u00e4ss\u00e4 ei ollut juuri huomauttamista. Asteen asetusmetodissa olisi hyv\u00e4 k\u00e4ytt\u00e4\u00e4 vakioita eik\u00e4\u00a0numeroarvoja, koska vakiot on tehty ohjelmassa k\u00e4ytett\u00e4viksi.<\/p>\n<p>4) Tiedonk\u00e4tkent\u00e4 oli hyvin hallussa t\u00e4ss\u00e4kin teht\u00e4v\u00e4ss\u00e4. Tyylin osalta olisi edelleen muistettava kommentit ja hyv\u00e4t (riitt\u00e4v\u00e4n pitk\u00e4t) muuttujien nimet.<\/p>\n<p>5) Kaivurin kaatumisongelmaa oli korjattu jonkin verran siten, ett\u00e4 asettajassa ollut merkkijonon pituuden tarkistus oli poistettu. T\u00e4m\u00e4 on virhe, koska my\u00f6s korjatun asettajan tulisi tarkistaa ettei attribuutin arvoksi voi asettaa tyhj\u00e4\u00e4 merkkijonoa &#8221;&#8221;. Teht\u00e4v\u00e4n mallivastauksessa on esitetty kuinka ongelman voi korjata ilman, ett\u00e4 tarkistuksia on tarpeen karsia.<\/p>\n<p>6) Monesta omasta luokasta puuttuivat lis\u00e4metodit. Luokassa tuli olla aksessoreiden lis\u00e4ksi ainakin kaksi muuta metodia. T\u00e4st\u00e4 ei rankaistu nyt, koska olio-ohjelmointi oli ensimm\u00e4isten harjoitusten aikaan hyvin uusi tuttavuus. Lis\u00e4\u00e4 puuttuvat metodit luokkaasi, jos ovat siit\u00e4 unohtuneet, koska tarkistus tiukentuu kurssin edetess\u00e4. Nollat tulivat unohtuneista testiluokista. Unohduksia oli yll\u00e4tt\u00e4v\u00e4n paljon ja oli harmi antaa nolla varsinkin, kun moni oma luokka oli eritt\u00e4in hyvin tehty.<\/p>\n<p><strong>Harjoitus 2<\/strong><\/p>\n<p>Tarkistetut teht\u00e4v\u00e4t ja teht\u00e4vien tarkistajat olivat: 2) pipo, Kimmo, 4) alkuaine, Antti, 6) presidentti, Kari ja 7) oma luokka, Jorma.<\/p>\n<p>2) Perimm\u00e4inen syy miksi <strong>static<\/strong>-m\u00e4\u00e4re tuli poistaa on osassa ratkaisuja j\u00e4\u00e4nyt selitt\u00e4m\u00e4tt\u00e4. T\u00e4m\u00e4n tapaisissa keksimisteht\u00e4viss\u00e4 pit\u00e4isi olla pyydetyt perustelut toimenpiteelle samaan tapaan kuin esimerkiksi matematiikan tentiss\u00e4 ei aivan riit\u00e4 antaa oikeaa lopputulosta, vaan tarvitaan my\u00f6s v\u00e4livaiheet.Teht\u00e4v\u00e4 arvioitiin opiskelijoiden onneksi hyvin liberaalisti ja osin v\u00e4\u00e4r\u00e4kin perustelu kelpasi. T\u00e4rkeint\u00e4 oli, ett\u00e4 oli kertonut edes jotain siit\u00e4 mit\u00e4 oli tehnyt ja miksi. Tutustu mallivastaukseen, jos ongelman syy j\u00e4i ep\u00e4selv\u00e4ksi.<\/p>\n<p>4) Hylk\u00e4yksi\u00e4 oli t\u00e4ss\u00e4 teht\u00e4v\u00e4ss\u00e4 enemm\u00e4n ja kaikkien nollien syy oli liittyi <strong>null<\/strong>-arvoon. Joko <strong>null<\/strong>-tarkistusta ei oltu tehty tai tarkistus oli vasta pituuden tarkistamisen j\u00e4lkeen, jolloin ensimm\u00e4inen vertailu kaataa ohjelman, kun parametri on <strong>null<\/strong>-arvoinen.<\/p>\n<p>6) Presidentti oli koodattu hyvin. Ongelmia ei juuri ollut. Muutama palauttaja oli lipsauttanut WETOon v\u00e4\u00e4r\u00e4n version yliluokasta siten, ett\u00e4 edelliseen teht\u00e4v\u00e4\u00e4n oli palautettu kyseisen teht\u00e4v\u00e4n testit selvitt\u00e4v\u00e4 valtionp\u00e4\u00e4mies, mutta kuudennessa teht\u00e4v\u00e4ss\u00e4 yliluokasta oli versio, joka ei edellisen teht\u00e4v\u00e4n testej\u00e4 selvitt\u00e4isi. Versionhallinta tulee sit\u00e4 t\u00e4rke\u00e4mm\u00e4ksi mit\u00e4 pitemm\u00e4lle kurssilla p\u00e4\u00e4st\u00e4\u00e4n.<\/p>\n<p>7) Testiluokkia oli edelleen hukassa. Onneksi ei samassa m\u00e4\u00e4rin kuin ensimm\u00e4isiss\u00e4 harjoituksissa. Seuraavaksi yleisin ongelma oli jommankumman tai molempien rakentajien puuttuminen.<\/p>\n<p><strong>Harjoitus 3<\/strong><\/p>\n<p>Tarkistetut teht\u00e4v\u00e4t ja teht\u00e4vien tarkistajat olivat: 3) ydinvoimala, Antti, 4) laite, Kari, 5) kettu, Kimmo ja 6) oma luokka, Jorma.<\/p>\n<p>3) Ydinvoimalasta ei juuri muuta kuin, ett\u00e4 <em>Override<\/em>-annotaatio kannattaa ottaa tavaksi. Muuten kaikki kunnossa.<\/p>\n<p>4) Vakiot oli otettu hyvin haltuun. Tyylipuolella toiveissa olisi lis\u00e4\u00e4 kommentteja. Lukumetodeissa (gettereiss\u00e4) ei tarvitse pohtia valintarakenteella mit\u00e4 palauttaa; attribuutin arvon voi palauttaa suoraan <strong>return<\/strong>-lauseella.<\/p>\n<p>5) Ketut oli tehty hyvin. Nollat tulivat attribuutin tunnuksen peitt\u00e4neist\u00e4 <em>paino<\/em>-nimisist\u00e4 muuttujista.<\/p>\n<p>6) Omassa luokassa p\u00e4\u00e4asiallinen ongelma oli se, ett\u00e4 metodin toteutus tai korvaus puuttui. Ali- ja yliluokat olivat valtaosin k\u00e4sitteellisesti luontevia <em>IsA<\/em>-suhteella tarkistellen.<\/p>\n<p><strong>Harjoitus 4<\/strong><\/p>\n<p>Tarkistetut teht\u00e4v\u00e4t ja teht\u00e4vien tarkistajat olivat: 2) vanhentuva leivos, Kari, 3) kissa, Kimmo, 5) laite, Antti ja 6) oma luokka, Jorma.<\/p>\n<p>2) Rajapinta oli toteutettu sujuvasti. Nollat tulivat p\u00e4\u00e4osin WETOn automaattitarkistajan toimesta.<\/p>\n<p>3) My\u00f6s kissat olivat p\u00e4\u00e4osin tyylikk\u00e4\u00e4sti koodattuja. Muutama ratkaisu oli tehty pitemm\u00e4n kaavan kautta. <em>Tervehtiva<\/em>-toteuteutuksen tarkistus <strong>instanceof<\/strong>-operaattoria k\u00e4ytt\u00e4en puuttui osasta ratkaisuja. N\u00e4iss\u00e4 tapauksissa opiskelijat saivat pit\u00e4\u00e4 pisteens\u00e4, koska testiluokka ei tutkinut ratkaisuja t\u00e4lt\u00e4 osin.<\/p>\n<p>5) Laitteen p\u00e4\u00e4ongelma olivat edelleen vakiot. Vakioita ei oltu joko k\u00e4ytetty tai sitten niit\u00e4 oli k\u00e4ytetty siten, ett\u00e4 ohjelma rikkoutuu, kun vakioiden arvot vaihtuvat. Kun ohjelmassa on annettu valmiita vakioita, niin p\u00e4\u00e4s\u00e4\u00e4nt\u00f6 on se, ett\u00e4 vakiot on jateltu k\u00e4ytett\u00e4viksi. Vaikka kirjoitushetkell\u00e4 literaali (esimerkiksi 3) saattaa vaikuttaa itsest\u00e4\u00e4n selv\u00e4lt\u00e4, se ei tule sit\u00e4 olemaan en\u00e4\u00e4 muutaman kuukauden p\u00e4\u00e4st\u00e4 kirjoittamisesta, eik\u00e4 se ole sit\u00e4 muille koodia lukeville. Vakiot ovat olemassa sit\u00e4 varten, ettei t\u00e4llaisia maagisia numeroita tarvitsisi koodiin ujuttaa.<\/p>\n<p>Vakioiden suuruuden vertailu (esimerkiksi tila &lt;= NUKKUU &amp;&amp; tila &gt;= SAMMUTETTU) ei ole t\u00e4ss\u00e4 teht\u00e4v\u00e4ss\u00e4 toivottavaa, koska vakiot ovat olemassa sit\u00e4 varten, ett\u00e4 niit\u00e4 k\u00e4ytt\u00e4en voidaan viitata arvoon riippumatta siit\u00e4 mik\u00e4 se on. Jos joskus tulisi tarve esimerkiksi muuttaa SAMMUTETTU-vakion arvoksi 9, ei yll\u00e4 esitetyn tapainen vertailu en\u00e4\u00e4 toimisi ajatellulla tavalla.<\/p>\n<p>6) Teht\u00e4v\u00e4 oli tehty hyvin ja koodin tyyli oli kohdallaan. Joukossa oli opettajan harmaata p\u00e4iv\u00e4\u00e4 pirist\u00e4vi\u00e4 oivalluksia. Nollat tulivat <strong>implements<\/strong>-m\u00e4\u00e4rittelyn unohtumisesta. Java k\u00e4\u00e4nt\u00e4\u00e4 toteutukseksi ajatellun metodin iloisesti, vaikka sopimusta rajapinnan toteutuksesta ei ole tehty, koska ilman sopimusta kyseess\u00e4 on kieliopillisesti luokan oma metodi.<\/p>\n<p><strong>Harjoitus 5<\/strong><\/p>\n<p>Tarkistetut teht\u00e4v\u00e4t ja teht\u00e4vien tarkistajat olivat: 2) pipon korjaus, Kimmo, 4) <em>toString<\/em>, <em>equals<\/em> ja leivokset, Antti, 5) <em>Comparable<\/em> ja voimala, Kari ja 8) oma luokka, Jorma.<\/p>\n<p>2) Pipot oli paikattu onnistuneesti. Tyylipuolen ongelmaksi nousi t\u00e4ll\u00e4 kertaa sisennys.<\/p>\n<p>4) Leivosten <em>toString<\/em>&#8211; ja <em>equals<\/em>-korvaukset olivat hyvi\u00e4: merkkijonoesitykset ja vertailut tehtiin kunkin luokan sis\u00e4ll\u00e4 luokan omista piirteit\u00e4 k\u00e4ytt\u00e4en ja aliluokasta kutsuttiin yliluokan metodia <strong>super<\/strong>-attribuutin kautta, kuten piti. <em>Equals<\/em>-korvauksissa voi luottaa <strong>try<\/strong>&#8211;<strong>catch<\/strong>-lauseeseen, joka nappaa kiinni tyyppimuunnoksen ep\u00e4onnistumisesta johtuvat poikkeukset, jolloin <strong>instanceof<\/strong>-operaattorille ei metodissa ole oikeastaan k\u00e4ytt\u00f6\u00e4.<\/p>\n<p>5) <em>Comparable<\/em>-rajapinnan toteutuksessa on huomattava, ett\u00e4 geneerisen ohjelmoinnin kautta p\u00e4\u00e4st\u00e4\u00e4n eroon suuresta m\u00e4\u00e4r\u00e4st\u00e4 tyyppimuunnoksia. Teht\u00e4v\u00e4ss\u00e4 tyyppimuuttuja <em>T<\/em> kiinnitettiin <em>Voimala<\/em>-tyyppiin, jolloin <em>compareTo<\/em>-operaatiossa voimaloita voidaan vertailla n\u00e4pp\u00e4r\u00e4sti tehon suhteen ilman <em>equals<\/em>-metodissa tarvittavaa tyyppimuunnosta. Tyyppimuunnos t\u00e4h\u00e4n tapaan: <em>Voimala<\/em> toinenVoimala = (<em>Voimala<\/em>)parametri; on tarpeeton, koska parametriviite on jo valmiiksi <em>Voimala<\/em>-tyyppinen.<\/p>\n<p>8) <em>ToString<\/em>-korvaukset oli tehty my\u00f6s omissa luokissa juuri toivotulla tavalla <strong>super<\/strong>-attribuutin avulla ketjuttaen.<\/p>\n<p><strong>Harjoitus 6<\/strong><\/p>\n<p>Tarkistetut teht\u00e4v\u00e4t ja teht\u00e4vien tarkistajat olivat: 2) laite ja akku, Antti, 3) syv\u00e4kopiointi, Kari, 4) sanakirja, Kimmo ja 6) listan taulukointi, Jorma.<\/p>\n<p>2) Kaikki tarkistetut ratkaisut hyv\u00e4ksyttiin. Ohjelmointiteknisin\u00e4 seikkoina esiin nousivat turhat <strong>import<\/strong>-lauseet ja olioiden luominen ennen metodin parametreille teht\u00e4vi\u00e4 tarkistuksia.<\/p>\n<p>Turha <strong>import <\/strong>vaikuttaa ohjelman luettavuuteen, koska lukija tekee monesti oletuksia luokan sis\u00e4ll\u00f6st\u00e4 jo <strong>import<\/strong>-lauseiden perusteella. Esimerkiksi <em>java.io<\/em>-pakkauksen k\u00e4ytt\u00f6\u00f6n ottava luokka k\u00e4sittelee todenn\u00e4k\u00f6isesti tiedostoja. Koodin lukija saattaa jopa jopa ep\u00e4ill\u00e4, ett\u00e4 ohjelma on keskener\u00e4inen tai rikki, jos luokissa on paljon <strong>import<\/strong>-lauseita, mutta ei pakkausten sis\u00e4lt\u00f6\u00e4 k\u00e4ytt\u00e4vi\u00e4 lauseita.<\/p>\n<p>Turhien olioiden luomista tulisi v\u00e4ltt\u00e4\u00e4, koska luomisoperaatio on yleens\u00e4 sek\u00e4 suoritusajalla ja muistink\u00e4yt\u00f6ll\u00e4 mitattuna &#8221;kallis&#8221; operaatio. Esimerkiksi n\u00e4in sanoen:<\/p>\n<pre><strong>public<\/strong> Laite(int t) <strong>throws<\/strong> IllegalArgumentException {\r\n   akku = <strong>new<\/strong> Akku(Akku.HYVA);\r\n   <strong>if <\/strong>(t == SAMMUTETTU) {\r\n      tila = t;\r\n   }\r\n   <strong>else<\/strong> {\r\n      <strong>throw new<\/strong> IllegalArgumentException();\r\n   }\r\n}<\/pre>\n<p><em>Akku<\/em>-olio luodaan my\u00f6s silloin, kun parametrin arvo on jotain muuta kuin <em>SAMMUTETTU<\/em>. Harjoitusteht\u00e4vien laajuisissa ohjelmissa ylim\u00e4\u00e4r\u00e4isill\u00e4 olioilla ei ole ajan tai muistin kannalta mit\u00e4\u00e4n merkityst\u00e4, mutta laajemmissa ohjelmissa turhia olioita on syyt\u00e4 v\u00e4ltt\u00e4\u00e4. Yll\u00e4 annettu rakentaja olisi tehokkaampi n\u00e4in:<\/p>\n<pre><strong>public<\/strong> Laite(int t) <strong>throws<\/strong> IllegalArgumentException {\r\n   <strong>if <\/strong>(t == SAMMUTETTU) {\r\n      tila = t;\r\n      \/\/ Luodaan akku vain, jos laiteen luominen on mahdollista.\r\n\u00a0     akku = <strong>new<\/strong> Akku(Akku.HYVA); }\r\n   <strong>else<\/strong> {\r\n      <strong>throw new<\/strong> IllegalArgumentException();\r\n   }\r\n}<\/pre>\n<p>Ylim\u00e4\u00e4r\u00e4iset oliot vaikeuttavat \u2013 ylim\u00e4\u00e4r\u00e4isten rakentajien tapaan \u2013 koodin lukemista.<\/p>\n<p>3) Kopiorakentajat oli tehty hyvin. Nollat tulivat k\u00e4yt\u00e4nn\u00f6ss\u00e4 vain WETOn toimesta.<\/p>\n<p>4) Sanakirjassa kaikki opettajan antamat nollat johtuivat puutteellisesta kommentoinnista. Metodeille tulisi muistaa kirjoittaa yleinen kommentti ennen otsikkoa ja tarkemmat kommentit metodin rungon sis\u00e4\u00e4n. Valmiissa rakenteissa on yleens\u00e4 valmiita hakuoperaatioita, joita k\u00e4ytt\u00e4m\u00e4ll\u00e4 voi v\u00e4ltt\u00e4\u00e4 itse kirjoitettuja silmukoita. <em>HashMapissa get<\/em>-operaatio silmukoi rakenteen tiedot l\u00e4pi, jolloin ei ole tarvetta esimerkiksi hakea ensin pareja ja sitten silmukoida niit\u00e4 l\u00e4pi itse tehdyll\u00e4 rakenteella.<\/p>\n<p>6) Taulukoivan listaoperaatio oli nelj\u00e4nnen teht\u00e4v\u00e4n tapaan ratkaistu sujuvasti, mist\u00e4\u00a0 vastuuopettaja on hyvin iloinen. Vastuuopettajan harmiksi kommentoinnissa oli nelj\u00e4nnen teht\u00e4v\u00e4n tapaan hieman oiottu. Nollat tulivat joko t\u00e4ysin tai l\u00e4hes kommentoimattomista operaatioista.<\/p>\n<p><strong>Harjoitus 7<br \/>\n<\/strong><\/p>\n<p>Tarkistetut teht\u00e4v\u00e4t ja teht\u00e4vien tarkistajat olivat: 2) hakuoperaatio, Kimmo, 3) suurimman alkion hakeva operaatio, Antti, 4) yhtye ja levy, Kari ja 6) s\u00e4hk\u00f6isen tentin UML-kaavio, Jorma.<\/p>\n<p>2) Enemmist\u00f6 ratkaisuja oli suoraviivaisia. Muutamassa operaatiossa oli ylim\u00e4\u00e4r\u00e4ist\u00e4 monimutkaisuutta. Molemmilla tavoilla p\u00e4\u00e4stiin kuitenkin hyvin maaliin ja siten ei opettajan antamia nollia t\u00e4st\u00e4 teht\u00e4v\u00e4st\u00e4.<\/p>\n<p>3) Suurimman alkion hakevat operaatiot toimivat hyvin; kaikki WETOn hyv\u00e4ksym\u00e4t ratkaisut hyv\u00e4ksyttiin. Haussa oli lyhempi\u00e4 ja pitempi\u00e4 ratkaisuja. Molemmissa on omat ongelmansa.<\/p>\n<p>Tyhj\u00e4\u00e4n listaan liittyv\u00e4st\u00e4 tarkistuksesta p\u00e4\u00e4see eroon luottamalla <em>alkio<\/em>-operaatioon, joka palauttaa <strong>null<\/strong>-arvon my\u00f6s, kun parametrina saatu indeksiarvo katsotaan virheelliseksi, koska lista on tyhj\u00e4.\u00a0Lausumalla pelk\u00e4st\u00e4\u00e4n:<\/p>\n<pre>Object suurin = alkio(0);<\/pre>\n<p>ja k\u00e4ytt\u00e4m\u00e4ll\u00e4 esiehtoista silmukkaa, tulosmuuttujaan saadaan oikea arvo (<strong>null<\/strong>) ilman erillist\u00e4 tarkistusta tyhj\u00e4n listan varalta. Ongelmana on se, ett\u00e4 haku nojaa nyt hyvin vahvasti tiettyyn <em>alkio<\/em>-operaation ominaisuuteen. N\u00e4in lyhennetty operaatio menisi rikki, jos vastuuopettaja saisi esimerkiksi p\u00e4\u00e4h\u00e4ns\u00e4 ajatuksen muuttaa <em>alkio<\/em>-operaatiota siten, ett\u00e4 virheen merkkin\u00e4 heitet\u00e4\u00e4nkin poikkeus.<\/p>\n<p>Koodin lukijan on my\u00f6s hankala ymm\u00e4rt\u00e4\u00e4 kuinka erikoistapaukseen on varauduttu, jos kommenteissa s\u00e4\u00e4stell\u00e4\u00e4n juuri t\u00e4ss\u00e4 kohdassa. Koodin selkeys saattaa toisaalta my\u00f6s k\u00e4rsi\u00e4, kun asioita lausutaan turhan monimutkaisesti.<\/p>\n<p>Esimerkiksi t\u00e4m\u00e4:<\/p>\n<pre><strong>if<\/strong> (suurin == null) {\r\n   <strong>return<\/strong> null;\r\n}\r\n<strong>else<\/strong> {\r\n   <strong>return<\/strong> suurin; \r\n}<\/pre>\n<p>voidaan ilmaista yhdell\u00e4 <strong>return<\/strong>-lauseella.<\/p>\n<p>Yhteenvetona: yksinkertaisuuteen tulee pyrki\u00e4, koska yksinkertainen koodi on luettavaa ja kaunista, mutta koodin eliminoinnissa on syyt\u00e4 &#8221;kikkailla&#8221; vain pakottavista syist\u00e4.<\/p>\n<p>WETO hylk\u00e4si muutaman ty\u00f6n siksi, ett\u00e4 listan suurimpaan alkioon liittyv\u00e4 muuttuja (yll\u00e4 <em>suurin<\/em>) oli alustettu kokonaisluvulla. Alkuarvon tyypin kiinnitt\u00e4v\u00e4 operaatio toimii niin pitk\u00e4\u00e4n, kun listalla on viitteit\u00e4 olioihin, joita voidaan vertailla muuttujan viittaamaan olioon. Pelkk\u00e4 <em>Comparable<\/em>-rajapinnan toteutus kahdessa luokassa ei takaa viel\u00e4, ett\u00e4 luokkien olioita voidaan vertailla. Esimerkiksi <em>Integer<\/em>&#8211; ja <em>String<\/em>-luokka toteuttavat <em>Comparable<\/em>-rajapinnan, mutta n\u00e4iden luokkien olioiden vertailu ei ole mahdollista, koska luokkien <em>compareTo<\/em>-metodin on toteutettu siten, ett\u00e4 niiss\u00e4 voidaan vertailla vain luokan omia olioita.<\/p>\n<p>4) Opettajan hylk\u00e4\u00e4mist\u00e4 ratkaisuissa oli p\u00e4\u00e4asiassa kaksi ongelmaa. Ensimm\u00e4inen ongelma oli se, ett\u00e4 ratkaisuista puuttui joko kaikki aksessorit tai suuri osa niist\u00e4. Toinen ongelma oli puutteellinen parametrien tarkistus aksessoreissa ja rakentajissa.<\/p>\n<p>6) Nollat tulivat kaaviosta puuttuvista luokista, v\u00e4\u00e4r\u00e4n tyyppisist\u00e4 suhteista ja assosiaatioiden nimien puuttumisesta. On syyt\u00e4 pit\u00e4\u00e4 mieless\u00e4, ett\u00e4 luokkakaavion symboloiden v\u00e4listen viivojen ulkoasulla on semattinen merkitys. Esimerkiksi tavallista assosiaatiota ei voi ilmaista nuolella, jonka p\u00e4\u00e4ss\u00e4 on ontto kolmiok\u00e4rki, koska t\u00e4llainen nuoli on varattu periytymisen ilmaisemiseen. Koostesuhdetta piirrett\u00e4ess\u00e4 viivan p\u00e4\u00e4ss\u00e4 oleva vinoneli\u00f6 (&#8221;salmiakki&#8221;) tulisi muistaa sijoittaa sis\u00e4lt\u00e4v\u00e4n luokan puolelle.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ratkaisuja tarkistetaan sek\u00e4 automaattisesti ett\u00e4 opettajien toimesta. Automaattinen tarkistus tapahtuu osin Lausekielinen ohjelmointi I ja II -kurssien tapaan testeill\u00e4, joissa verrataan malliratkaisun ja opiskelijan ratkaisun tulosteita. Testauksessa voidaan tutkia automaattisesti my\u00f6s ohjelman rakennetta. Automaattisesta testauksesta kerrotaan asianomaisissa teht\u00e4v\u00e4nannoissa ja kunkin teht\u00e4v\u00e4n testit kuvaillaan tarkemmin WETOssa. WETO tulostaa rakennetestin ep\u00e4onnistuessa lyhyen virheilmoituksen. Tarkista virheen tapahtuessa, ett\u00e4 &hellip; <a href=\"https:\/\/coursepages2.tuni.fi\/tiea2-1\/kevat-2018\/harjoitukset\/ratkaisujen-tarkistus\/\" class=\"more-link\">Jatka artikkeliin <span class=\"screen-reader-text\">Ratkaisujen tarkistus<\/span><\/a><\/p>\n","protected":false},"author":6,"featured_media":0,"parent":38,"menu_order":2,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-64","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1\/wp-json\/wp\/v2\/pages\/64","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1\/wp-json\/wp\/v2\/comments?post=64"}],"version-history":[{"count":70,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1\/wp-json\/wp\/v2\/pages\/64\/revisions"}],"predecessor-version":[{"id":304,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1\/wp-json\/wp\/v2\/pages\/64\/revisions\/304"}],"up":[{"embeddable":true,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1\/wp-json\/wp\/v2\/media?parent=64"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}