dogs worlds_ugliest_dog.jpg

Samankaltaiset tiedostot
Hakemistojen sisällöt säilötään linkitetyille listalle.

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Harjoitustyö. 1. Johdanto Tehtävä

Sokkelon sisältö säilötään linkitetyille listalle ja tekstitiedostoon. Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

2. Merkkijono, osamerkkijono ja osamerkkijonon haku

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla.

Harjoitus 5 (viikko 48)

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla.

Toinen harjoitustyö. ASCII-grafiikkaa 2017

Harjoitus 5 (viikko 41)

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö

Harjoitustyö Johdanto

Harjoitus 2 (viikko 45)

Harjoitus 5. Esimerkki ohjelman toiminnasta: Lausekielinen ohjelmointi I Kesä 2018 Avoin yliopisto 1 / 5

Harjoitustyö Johdanto

Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Pakkauksen kokoaminen

Harjoitustyö. 1. Johdanto Tehtävä

Toinen harjoitustyö. ASCII-grafiikkaa

5. HelloWorld-ohjelma 5.1

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Harjoitustyö. 1. Johdanto Tehtävä

Harjoitustyö Johdanto. 2. Euroseteli

Harjoitustyö Johdanto Tehtävä

Harjoitus 6 (viikko 42)

4. Luokan testaus ja käyttö olion kautta 4.1

12. Näppäimistöltä lukeminen 12.1

Harjoitus 4 (viikko 47)

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

13. Hyvä ohjelmointitapa (osa 1) 13.1

Harjoitustyö Johdanto Tehtävä

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö

Harjoitus 6. Käytä String-luokasta vain charat- ja length-operaatioita.

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tentti kestää kolme tuntia. Tehdään sähköisesti mikroluokkien Windows-koneilla.

14. Hyvä ohjelmointitapa 14.1

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Harjoitus 5 (viikko 41)

8. Näppäimistöltä lukeminen 8.1

Harjoitus 6 (viikko 42)

16. Javan omat luokat 16.1

Pakkauksen kokoaminen

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tentti kestää kolme tuntia.

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Tämän lisäksi listataan ranskalaisin viivoin järjestelmän tarjoama toiminnallisuus:

9. Periytyminen Javassa 9.1

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

ITKP102 Ohjelmointi 1 (6 op)

15. Ohjelmoinnin tekniikkaa 15.1

Ohjelmoinnin perusteet Y Python

Harjoitus 3 (viikko 39)

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

5. HelloWorld-ohjelma 5.1

8. Näppäimistöltä lukeminen 8.1

Kurssiesite Lausekielinen ohjelmointi II Syksy Jorma Laurikkala Tietojenkäsittelytieteet Informaatiotieteiden yksikkö Tampereen yliopisto

Vastuuopettaja. Kurssiesite Olio-ohjelmoinnin perusteet (TIEA2.1) Kevät Olio-ohjelmoinnin perusteet (eli Oope) Laajuus

Kurssiesite Olio-ohjelmoinnin perusteet (TIEA2.1) Kevät 2018

Kurssiesite Olio-ohjelmoinnin perusteet Kevät Jorma Laurikkala Tietojenkäsittelytieteet Informaatiotieteiden yksikkö Tampereen yliopisto

Vastuuopettaja. Kurssiesite Olio-ohjelmoinnin perusteet Kevät Olio-ohjelmoinnin perusteet (TIEA2.1)

Kurssiesite Olio-ohjelmoinnin perusteet Kevät Jorma Laurikkala Tietojenkäsittelytieteet Luonnontieteiden tiedekunta Tampereen yliopisto

Ohjelmoinnin perusteet Y Python

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin jatkokurssi, kurssikoe

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Vastuuopettaja. Kurssiesite Olio-ohjelmoinnin perusteet Kevät Olio-ohjelmoinnin perusteet (5 op) Tavoitteena

ITKP102 Ohjelmointi 1 (6 op)

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

2. Olio-ohjelmoinista lyhyesti 2.1

4. Olio-ohjelmoinista lyhyesti 4.1

9. Periytyminen Javassa 9.1

Sisältö. 2. Taulukot. Yleistä. Yleistä

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

Kooste. Esim. Ympyrän keskipiste voidaan ajatella ympyrän osaksi.

15. Ohjelmoinnin tekniikkaa 15.1

Harjoitustyö Johdanto Tehtävä

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

ITKP102 Ohjelmointi 1 (6 op)

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Ohjelmoinnin perusteet Y Python

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

1. Omat operaatiot 1.1

4. Lausekielinen ohjelmointi 4.1

Sisällys. Mitä on periytyminen? Yksittäis- ja moniperiytyminen. Oliot ja perityt luokat. Periytymisen käyttö. 8.2

Mitä on periytyminen?

4. Lausekielinen ohjelmointi 4.1

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Ohjelmoinnin perusteet Y Python

Luento 4. Timo Savola. 21. huhtikuuta 2006

TIE Ohjelmistojen testaus 2015 Harjoitustyö Vaihe 3. Antti Jääskeläinen Matti Vuori

Ohjelmoinnin perusteet Y Python

Oliot viestivät metodeja kutsuen

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Harjoitus 1 (viikko 44)

Transkriptio:

1. Johdanto 1.1. Tehtävä Komentoikkuna [1, 2] on teksuaalinen käyttöliittymä, jonka kautta käyttöjärjestelmää ohjaillaan komentoja kirjoittamalla. Komentoikkuna tunnetaan myös muun muassa komentorivinä (command prompt), konsolina (console), terminaalina (terminal), kuorena (shell) ja komentotulkkina (command interpreter). Tarkkaan ottaen komentotulkki on komentoikkunassa ajettava ohjelma, joka lukee käyttäjältä komennot ja muuntaa ne käyttöjärjestelmän ymmärtämään muotoon, mutta koska komentoikkunan avautuessa käynnistetään lähes aina jokin komentotulkki, ymmärretään komentotulkki käytännössä komentoikkunaksi. Suuri osa komentotulkissa saatavilla olevista komennoista liittyy tiedostojen ja hakemistojen käsittelyyn. Esimerkiksi hakemistosta toiseen siirtymiselle ja hakemiston sisällön listaamiselle on omat komennot. Komentotulkki tukeutuu muiden sovellusten tapaan massamuistin käsittelyssä tiedostojärjestelmänä [3] tunnetun käyttöliittymän osan tarjoamiin palveluihin. Tiedostojärjestelmä esittää massamuistissa olevat tiedot siten, että sovellusten ei tarvitse huolehtia hyvinkin monimutkaisesta alkuperäisestä esitystavasta. Moderni tiedostojärjestelmä organisoi massamuistin hakemistot puumaiseksi rakenteeksi, joka on yleensä käännetty: juurihakemisto on ylimpänä ja puun lehtihakemistot alimpana. Kuvassa 1 on esitetty eräs hakemistopuu. / pics temp memo_backup.txt cats ceiling_cat.gif dangerous_kitten.jpg dogs worlds_ugliest_dog.jpg Kuva 1: Eräs hakemistopuu. Suorakaiteet symboloivat hakemistoja. Juurihakemiston nimenä käytetään kauttaviivaa. Viivat yhdistävät alihakemistot ja ylihakemistot. Eri käyttöjärjestelmissä on samankaltaisia komentoja yleisemmille komennoille. Komennot on kuitenkin yleensä nimetty eri tavoin ja samannimisetkin komennot voivat toimia toisistaan poikkeavasti. Esimerkiksi hakemiston listaus tapahtuu Windows-järjestelmässä dir-komennolla, kun taas Linux- ja Mac-järjestelmissä käytetään ls-komentoa. Komentoikkunassa on komentokehote, joka näyttää tyypillisesti juurihakemistosta nykyiseen hakemistoon johtavan hakemistopolun. Komennot kirjoitetaan yleensä samalle riville kuin kehote ja syötetään komentotulkille rivinvaihtonäppäintä painamalla. Kuvassa 2 on annettu kaksi komentoa käyttäjän csjola kotihakemiston Documents-alihakemistossa. Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 1 / 17

Kuva 2: Erään Linux-käyttöjärjestelmän komentoikkuna ja siinä annettuja komentoja. Harjoitustyössä on tehtävänä ohjelmoida Java-kielellä komentoikkunassa toimivaa komentotulkkia simuloiva olioperustainen Simple Oope Shell (SOS) - ohjelma. Tiedostojärjestelmä toteutetaan linkitettynä rakenteena, jossa hakemistojen sisällöt säilötään linkitetyille listalle (luku 3). Tiedostojärjestelmä tallennetaan keskusmuistiin, jolloin harjoitustyöohjelmassa annetut komennot eivät aiheuta koskaan muutoksia massamuistiin. Erityisesti tiedoston tai hakemiston poistava komento ei poista tietoja levyltä, vaan aiheuttaa muutoksen vain keskusmuistissa olevaan rakenteeseen. Harjoitustyössä toteutettavan ohjelman tuntemat komennot ovat sekoitus yleisimmistä käyttöjärjestelmistä tuttuja komentoja. Pääpaino on kuitenkin Unixin kaltaisissa käyttöjärjestelmissä (*nix). Tästä syytä hakemistojen nimet erotetaan toisistaan kenoviivamerkillä ('/') ja tulkki on merkkikokoriippuvainen eli pienet ja suuret kirjaimet katsotaan eri merkeiksi. Tulkki sallii tiedostojen ja hakemistojen nimissä vain tiettyjä merkkejä (luku 3.2). Tulkin komentojen toiminnallisuutta on rajattu paljon, jotta tehtävä ei kävisi liian vaikeaksi. Komentoja voi kohdistaa lähinnä nykyhakemistoon, komennoilla ei ole niiden toimintaan vaikuttavia valintoja ja vain yksi komennoista toimii rekursiivisesti. 1.2. Työn organisointi Harjoitustyö tehdään itse ja lähinnä omalla ajalla. Muiden kurssilaisten kanssa voi vaihtaa ideoita, mutta koodin kopiointi ei tietenkään ole sallittua. Samoin muualta kuin kurssin verkkosivulta löytyneen koodin kopiointi omaan ohjelmaan on kielletty. 1.3. Pakollisuus ja korvaavuudet Harjoitustyö on pakollinen kurssin 10 opintopisteen laajuisena suorittaville opiskelijoille. Tällaisia kurssilaisia ovat erityisesti kaikki tietojenkäsittelytieteiden tutkinto-ohjelman omat opiskelijat. Ota yhteyttä tutkinto-ohjelmasi opintokoordinaattoriin tai kurssin vastuuopettajaan, jos et tiedä tuleeko sinun suorittaa kurssi 5 vai 10 opintopisteen laajuisena. Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 2 / 17

Harjoitustyön voi korvata A) muiden oppilaitosten opinnoilla, B) edellisellä Olioohjelmoinnin perusteet -kurssilla hyväksytyllä harjoitustyöllä tai C) edellisten kohtien tapaisella painavalla syyllä. Kohdan A perusteella on annettu kaikki pyydetyt korvaavuudet. Kohdan B perusteella annettavista harjoitustyökorvaavuuksista on tarkempia tietoja kurssin kotisivuilla. B-kohdan osalta on tärkeintä muistaa, että harjoitustyö korvautuu vain, jos ottaa yhteyttä kurssin vastuuopettajaan. Tähän mennessä tulleet yhteydenotot ja sopimukset on kirjattu ylös eikä uusia yhteydenottoja näiltä osin tarvita. 2. Ohjelman toiminnot Ohjelmassa on oltava toiminnot, jotka mahdollistavat uuden hakemiston ja tiedoston luomisen, hakemiston vaihdon, erilaiset tietojen listaamiset (tietty tiedosto tai hakemisto, koko hakemisto ja rekursiivinen listaus), tiedoston tai hakemiston poiston, tiedoston kopioinnin, tiedoston tai hakemiston uudelleen nimeämisen ja ohjelman lopettamisen. Seuraavassa esitellään ohjelman toiminnallisuutta pienten esimerkkien avulla. Laajempia esimerkkiajoja julkaistaan kurssin kotisivujen Harjoitustyö-kohdassa. 2.1. Ohjelman käynnistäminen Ohjelma luo käynnistymisen yhteydessä pelkästään juurihakemiston sisältävän hakemistopuun. 2.2. Käyttöliittymä Ohjelmalla on oikean komentotulkin tapainen tekstipohjainen käyttöliittymä. Ohjelman käynnistyessä tulostetaan kuvassa 3 esitetyllä tavalla ensin tervehdysteksti "Welcome to SOS." ja omalle rivilleen komentotulkin kehote. Tämän jälkeen jäädään odottamaan käyttäjän syötettä samalle riville välittömästi suurempi kuin merkin jälkeen. Kehote koostuu hakemistopolusta, jossa hakemistojen nimet on erotettu toisistaan kauttaviivalla. Kehote alkaa kauttaviivalla ja päättyy kauttaviivaan ja suurempi kuin merkkiin paitsi, jos ollaan juurihakemistossa, jolloin kauttaviivoja on yksi. Kehote on aluksi "/>", koska tulkin ajatellaan käynnistyvän juurihakemistoon. Welcome to SOS. /> Kuva 3: Ohjelma käynnistyksen jälkeen. Ohjelmaa käytetään komentoikkunan tapaan kirjoittamalla halutun toiminnon käynnistävä komento ja painamalla Enter-näppäintä. Komento ja sen mahdolliset parametrit erotetaan toisistaan yhdellä välilyönnillä. Kaikkien muiden kuin lopetuskomennon jälkeen tulostetaan kehote riviä vaihtamatta ja jäädään odottamaan uutta komentoa välittömästi kehotteen viimeisen merkin jälkeen, jos komento oli oikeellinen. Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 3 / 17

Ohjelma vastaa virheelliseen komentoon tulostamalla omalle rivilleen "Error!" ennen uuden komennon lukemista. Virheeksi katsotaan tuntematon komento (kuva 4) tai tunnettu komento virheellisellä parametrilla. Tulkki sallii tiedostojen ja hakemistojen nimissä vain merkit väleiltä a z, A Z ja 0 9 sekä alaviivamerkin ('_') ja pisteen. Piste saa esiintyä nimessä vain kerran eikä se saa olla nimen ainoa merkki ellei kyseessä ole cd-komennon ylihakemistoon viittaava parametri (luku 2.4). Osassa komennoista on virhe, jos parametrina annetun nimistä tiedostoa tai hakemistoa ei ole olemassa ja osassa komentoja virheen aiheuttaa olemassa oleva tiedosto tai hakemisto. Esimerkiksi olemattomaan alihakemistoon ei voida siirtyä ja toisaalta alihakemistoa ei voida luoda, jos sellainen on jo olemassa. Komento voi epäonnistua myös jommastakummasta tai molemmista syistä: tiedostoa kopioitaessa on mahdollista, että kopioitavan tiedoston nimi on annettu väärin tai että ollaan kopioimassa olemassa olevan tiedoston päälle. Seuraavissa luvuissa kerrotaan mitä kukin komento vaatii parametrina saamansa tiedon tai hakemiston olemassa olon osalta. Tunnetulla komennolla voi olla myös väärä määrä parametreja. Ylimääräiset välilyönnit ennen komentoa, komennon jälkeen, komennon ja sen parametrin välissä tai komennon parametrien välissä katsotaan virheeksi. />pwd Error! /> Kuva 4: Tuntemattoman komennon aiheuttama virhe. Kaikkien tulosteiden muoto on kiinnitetty, jotta ohjelmien automaattinen, tulosteiden vertailuun perustuva tarkistus olisi mahdollista (luku 4). Tarkistusta automatisoimalla pyritään siihen, että kurssin opettajille jää enemmän aikaa työn rakenteen ja laadun arviointiin. Komennot pitää lukea In-apuluokan avulla, jotta ohjelmien tehtävänannon mukainen käyttäytymisen olisi todennäköisempää. Harjoitustyössä käytetään apulaiset-nimiseen pakkaukseen (luku 3.5) sijoitettua versiota In-luokasta, joka on saatavilla kurssin kotisivujen Koodit-kohdassa. Tässä pakkauksessa ovat myös opettajan antamat rajapinnat. 2.3. Hakemiston luominen Nykyiseen hakemistoon luodaan uusi alihakemisto md-komennolla. Alihakemisto annetaan komennolle parametrina. Parametri on virheellinen, jos nykyhakemistossa on jo samanniminen alihakemisto. Kuvassa 5 luodaan uusi hakemisto. />md pics /> Kuva 5: Luodaan juurihakemistoon pics-niminen alihakemisto. Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 4 / 17

2.4. Hakemiston vaihtaminen Hakemisto vaihdetaan cd-komennolla. Nykyisen hakemiston alihakemistoon siirryttäessä komennon parametriksi annetaan alihakemiston nimi. Ylihakemistoon siirrytään antamalla hakemiston nimeksi kaksi pistettä (luku 2.7). Ilman parametria cd-komento vaihtaa hakemistoksi juurihakemiston (luku 2.7). Parametri on virheellinen, jos alihakemistoa ei löydetä. Virhe tapahtuu myös, jos juurihakemistossa yritetään siirtyä ylihakemistoon. Hakemiston vaihdon onnistuessa komentokehotteen polku päivitetään. Kuvassa 6 vaihdetaan alihakemistoihin pics ja cats lisätään samalla kehotteeseen alihakemistojen nimet. />cd pics /pics/>md cats /pics/>cd cats /pics/cats/> Kuva 6: Vaihdetaan juurihakemistosta pics-alihakemistoon. Luodaan uusi alihakemisto cats ja siirrytään tähän hakemistoon. 2.5. Tiedoston luominen Tulkissa on poikkeuksellisesti komento tiedoston luomiseen nykyiseen hakemistoon (mf), koska simulaattorissa ei voi suorittaa esimerkiksi tekstieditoria. Komennolle annetaan parametreiksi tiedoston nimi ja koko tavuina. Komento ei voi luoda tiedostoa, joka on jo hakemistossa. Koon on oltava positiivinen ( 0) kokonaisluku. Kuvassa 7 nykyiseen hakemistoon luodaan kaksi kuvatiedostoa. /pics/cats/>mf ceiling_cat.gif 3677 /pics/cats/>mf dangerous_kiten.jpg 13432 /pics/cats/> Kuva 7: Luodaan kaksi tiedostoa. 2.6. Uudelleen nimeäminen Tiedoston tai hakemiston uudelleen nimeäminen tapahtuu mv-komennolla, jonka ensimmäinen parametri on komennon kohteen nimi ja toinen on kohteen uusi nimi. Nimen vaihto onnistuu, kun nykyisessä hakemistossa on ensimmäisellä parametrilla määritellyn niminen tiedosto tai hakemisto ja toisen parametrin määrittelemää tiedostoa tai hakemistoa ei vielä ole. Kuvassa 8 korjataan tiedoston nimeen tullut kirjoitusvirhe. /pics/cats/>mv dangerous_kiten.jpg dangerous_kitten.jpg /pics/cats/> Kuva 8: Nimetään tiedosto uudelleen. Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 5 / 17

2.7. Hakemiston listaaminen Hakemiston listaamiseen käytetään ls-komentoa. Komento tulostaa näytölle hakemiston koko sisällön nousevassa aakkosjärjestyksessä, kun komennolle ei anneta parametreja. Komento ei järjestä hakemistoa, koska sen tiedot ovat aina oikeassa järjestyksessä (luku 3.3). Kunkin tiedoston ja alihakemiston merkkijonoesitys (luku 3.2) tulostetaan omalle rivilleen. Komennolla voi tulostaa näytölle parametrina annetun tiedon merkkijonoesityksen, jos nykyhakemistossa on annetun niminen tiedosto tai alihakemisto (luku 2.8). Nykyhakemistosta puuttuvan tiedon listaus on virhe. Tyhjään hakemistoon kohdistetun listauskomennon seurauksena ei tulosteta mitään ja luetaan uusi komento. Rekursiiviselle listaukselle on oma komento (luku 2.10). Kuvassa 9 tulostetaan aluksi hakemiston /pics/cats sisältö. Listauksesta nähdään tiedoston nimen vaihtuneen. Tämän jälkeen vaihdetaan cd-komennolla ylihakemistoon pics, luodaan hakemisto dogs ja siirrytään siihen. Uuden tiedoston luominen ei onnistu, koska heittomerkki ei kuulu nimissä sallittuihin merkkeihin (luku 2.2). Toinen luontiyritys onnistuu. Ilman parametria annettu cd-komento palauttaa tulkin juurihakemistoon, joka listaamalla nähdään alihakemistolla pics olevan kaksi tietoa, jotka ovat alihakemistot cats ja dogs. /pics/cats/>ls ceiling_cat.gif 3677 dangerous_kitten.jpg 13432 /pics/cats/>cd.. /pics/>md dogs /pics/>cd dogs /pics/dogs/>mf world's_ugliest_dog.jpg 118088 Error! /pics/dogs/>mf worlds_ugliest_dog.jpg 118088 /pics/dogs/>cd />ls pics/ 2 /> Kuva 9:Hakemiston listaus ja aiemmin esiteltyjä komentoja. 2.8. Tiedoston kopiointi Tiedostosta tehdään kopio cp-komennolla, jolle annetaan parametrina nimet kopioitavalle tiedostolle ja uudelle tiedostolle. Kopiointi epäonnistuu, jos kopioitavaa tiedostoa ei löydetä nykyhakemistosta tai jos nykyhakemistossa on jo jälkimmäisenä parametrina määritelty tiedosto. Hakemiston kopiointi katsotaan virheeksi, koska tehtävää on helpotettu rajaamalla kopiointi vain tiedostoihin. Komento toteutetaan syväkopioivalla kopiorakentajalla (luku 3.2). Kuvassa 10 luodaan uusi hakemisto, siirrytään siihen ja luodaan uusi tiedosto. Tiedostosta tehdään kopio cp-komennolla. Kopion listaus epäonnistuu aluksi kirjoitusvirheen vuoksi. Kopion tiedot saadaan tulostettua toisella yrityksellä. Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 6 / 17

/>md temp />cd temp /temp/>mf memo.txt 42 /temp/>cp memo.txt memo_backup.txt /temp/>ls memo.txt memo.txt 42 /temp/>ls memo_buk.txt Error! /temp/>ls memo_backup.txt memo_backup.txt 42 /temp/> Kuva 10: Tiedoston kopiointi. 2.9. Poistaminen Tiedosto tai hakemisto poistetaan nykyhakemistosta rm-komennolla. Poistamista ei varmisteta käyttäjältä. Poisto epäonnistuu, jos parametrina annetulla nimellä ei löydetä tiedostoa tai hakemistoa. Kuvassa 11 poistetaan edellä kopioitu tiedosto ja siirrytään juurihakemistoon. /temp/>rm memo.txt /temp/>cd.. /> Kuva 11: Tiedoston poisto. 2.10. Rekursiivinen listaaminen Rekursiivinen listaus tehdään find-komennolla. Komento listaa nykyhakemiston alihakemistoineen esijärjestyksessä (luku 3.4). Tiedostojen ja hakemistojen merkkijonoesityksiä edeltää hakemistopolku. Kuvassa 12 listataan tiedostojärjestelmän koko sisältö. />find /pics/ 2 /pics/cats/ 2 /pics/cats/ceiling_cat.gif 3677 /pics/cats/dangerous_kitten.jpg 13432 /pics/dogs/ 1 /pics/dogs/worlds_ugliest_dog.jpg 118088 /temp/ 1 /temp/memo_backup.txt 42 /> Kuva 12: Juurihakemistosta aloitettu rekursiivinen listaus. 2.11. Ohjelman lopetus Ohjelmasta poistutaan parametrittomalla exit-komennolla (kuva 13). Komennon jälkeen tulostetaan riviä vaihtaen "Shell terminated."-teksti. />exit Shell terminated. Kuva 13: Ohjelman lopetus komennolla. Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 7 / 17

3. Ohjelman rakenne 3.1. Yleistä Ohjelma on jaettava kapseloituihin luokkiin, joiden sisältö puolestaan jaetaan järkevän mittaisiin metodeihin. Luokissa on vältettävä saman koodin kopioimista eri paikkoihin, koska koodista voi kirjoittaa asianomaisista paikoista kutsuttavan metodin. Metodien korvaaminen, kuormittaminen ja monimuotoisuus parametrien välityksessä vähentävät tarvetta toistaa koodia eri metodien sisällä. Muistathan, että luokat rakennetaan tiedon ei toimintojen ympärille. Luokkametodeista koostuvat, esimerkiksi Math-luokan tapaiset apuluokat ovat poikkeus tähän sääntöön. Ohjelman toimintoja vastaavia luokkia ei saa tehdä, koska toiminnot eivät ole luokkia itsessään, vaan luokkien metodeja. Olio-ohjelmoinnissa vain keskeisimmät käsitteet mallinnetaan. Luokkia tarvitaan vain sen verran, että ohjelma saadaan toimimaan olioperustaisesti edellä määritellyllä tavalla. Toisaalta kullakin luokalla tulisi olla yksikäsitteinen vastuu. Luokkien lukumäärää ei saa pienentää antamalla luokalle useita sille kuulumattomia vastuita. Erityisesti käyttöliittymäluokan sisältöä on syytä pitää silmällä. Käyttöliittymä vastaa vain ihmisen ja koneen vuorovaikutuksesta ja näin ollen tulkin logiikasta vastaavaa koodia ei saa kirjoittaa sinne, vaan tulkille on tehtävä oma luokka. Muista noudattaa hyvää ohjelmointitapaa: sisennä koodia johdonmukaisesti luettavuuden parantamiseksi, kommentoi riittävästi ja oikeissa paikoissa, liitä jokaiseen metodiin yleisluonteinen kommentti, nimeä vakiot, muuttujat ja operaatiot järkevästi, käytä vakioita, pidä rivit riittävän lyhyinä, käytä välejä lauseiden sisällä ja erota loogiset kokonaisuudet toisistaan väliriveillä, pidä operaatiot järkevän mittaisia operaation tulisi mahtua yhdelle A4-kokoiselle sivulle ja varaudu metodeissa virheellisiin parametrien arvoihin [4, 5]. Erityisesti olio-ohjelmointiin liittyviä hyviä tapoja ovat: luokkiin liitetyt yleiset kommentit, attribuuttien kommentointi, attribuuttien harkittu käyttö [6] ja luokkien tai rajapintojen sijoittaminen omiin tiedostoihinsa. Sisennä koodi välilyönnein. WETO ei hyväksy muilla tavoilla sisennettyä lähdekoodia, jotta koodi näkyisi opettajan editorissa täsmälleen opiskelijan aikomalla tavalla. Lue tiedot näppäimistöltä apulaiset-pakkauksen In-luokalla (luku 3.5). Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 8 / 17

3.2. Luokkahierarkia Harjoitustyössä periytymistä käytetään erityisesti tiedostojärjestelmän sisällön mallintamiseen. Ohjelmassa tulee olla abstrakti yliluokka Tieto ja siitä perityt konkreettiset Tiedosto- ja Hakemisto-luokat. Yliluokassa on StringBuilder-tyyppinen attribuutti tiedon nimelle. Luokalla on yksiparametrinen rakentaja sekä aksessorit nimelle (parametrit ja paluuarvo ovat StringBuilder-tyyppiä). Rakentaja ja nimen asettava metodi heittävät IllegalArgumentException-poikkeuksen, jos parametrina annettu nimi ei ole oikean muotoinen (luku 2.2). Tiedoston oma tieto on koko tavuina. Koko on int-tyyppinen ja sen tulee olla positiivinen ( 0). Tee luokalle ainakin kaksiparametrinen rakentaja, joka heittää IllegalArgumentException-poikkeuksen, jos parametrina annettu nimi tai koko on virheellinen. Rakentajan ensimmäinen parametri on nimi. Kutsu rakentajassa yliluokan yksiparametrista rakentajaa. Tee koolle aksessorit ja heitä asetusmetodista IllegalArgumentException-poikkeus, jos koko on virheellinen. Hakemistolla on OmaLista-tyyppinen (luku 3.3) attribuutti, josta on viitteet hakemiston sisältämiin tiedostoihin ja muihin hakemistoihin (luku 3.4). Hakemiston sisältö on järjestetty aina nimiensä mukaiseen nousevaan aakkosjärjestykseen. Lisäksi hakemistolla on Hakemisto-tyyppinen attribuutti, joka viittaa hakemiston ylihakemistoon. Juurihakemiston ylihakemistoviite on null-arvoinen. Kirjoita luokalle rakentaja, jolla on parametrit nimelle (ensimmäinen parametri) ja ylihakemistolle (toinen parametri). Rakentaja heittää IllegalArgumentExceptionpoikkeuksen, jos nimessä on virhe. Rakentajassa luodaan uusi listaolio ja liitetään siihen attribuutti. Tee aksessorit molemmille attribuuteille. Voit kirjoittaa Tieto-luokalle ja sen aliluokille oletusrakentajat, jos katsot niistä olevan hyötyä ohjelman toteuttamisessa. Olion merkkijonoesityksestä on paljon iloa tässäkin työssä. Korvaa siksi Objectluokan tostring-metodi luokkahierarkian jokaisella tasolla. Tee korvaus ketjuttaen : kutsu aliluokkien tostring-metodin korvauksissa yliluokan versiota superattribuutin avulla juuriluokka pois lukien, koska Object-luokan tostring-metodia ei pidä kutsua. Tiedosto-luokassa korvattu tostring-metodi palauttaa merkkijonon, jossa on alusta lukien tiedoston nimi, välilyönti ja tiedoston koko. Jos tiedosto-olion tiedot ovat esimerkiksi "ceiling_cat.gif" ja 3677, on metodin paluuarvo "ceiling_cat.gif 3677". Hakemisto-luokan tostring-metodin palauttama merkkijono koostuu hakemiston nimestä, kauttaviivasta, välilyönnistä ja kokonaisluvusta, joka kertoo montako tiedostoja ja alihakemistoa hakemisto sisältää. Jos hakemisto-olion nimi on "pics" ja hakemiston sisältö koostuu kahdesta alihakemistosta, on metodin palauttama merkkijonoesitys "pics/ 2". Tiedosto- ja Hakemisto-luokkien merkkijonoesitykset tulostetaan, kun hakemisto listataan. Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 9 / 17

Toteuta Comparable-rajapinnan compareto-metodi Tieto-luokassa. Kiinnitä geneeriseksi tyypiksi Tieto. Olioita vertaillaan niiden nimien perusteella. Korvaa luokassa myös Object-luokan equals-metodi siten, että oliot katsotaan samoiksi, jos niiden nimet ovat merkilleen samat. Pienet ja suuret kirjaimet katsotaan eri merkeiksi. Joudut muuntamaan nimet String-tyyppisiksi ennen vertailua, koska StringBuilder-luokka ei korvaa equals-metodia eikä toteuta Comparablerajapintaa. CompareTo- ja equals-metodeja tarvitaan uusissa listaoperaatiossa (luku 3.3). Kirjoita kopiorakentajat Tieto- ja Tiedosto-luokille. Tieto-luokan kopiorakentaja syväkopioi nimen. Kopiorakentajaa käytetään tiedoston kopioivan komennon toteuttamiseen. Hakemisto-luokan on toteutettava opettajan antama Komennettava-rajapinta, jossa on tulkin komentojen toteuttamiseen ja luokkahierarkian testaamiseen soveltuvia metodeja. Kiinnitä geneeriseksi tyypiksi Tieto. Sijoita Tieto-, Tiedosto- ja Hakemisto-luokat omaa pakkaukseensa (luku 3.5). Luokkahierarkian toteutuksessa hyödyllisiä harjoitustehtäviä ovat muun muassa tehtävät 5.3 (tostring-metodin korvaus ketjuttaen), 5.4 (Comparable-rajapinnan toteutus) ja 6.3 (syväkopiointi). 3.3. OmaLista-luokka ja muut tietorakenteet Ohjelman pääasiallisena tietorakenteena käytetään fi.uta.csjola.oope.listapakkauksen LinkitettyLista-luokasta perittyä OmaLista-luokkaa. Luokan tärkein käyttökohde on hakemiston sisällön säilöminen (luku 3.4). Lista-pakkaus on saatavilla kurssin kotisivujen Koodit-kohdasta. Huomaa, että pakkauksen sisältöä ei saa muuttaa millään tavoin. Älä lisää tiedoston tai hakemiston tai minkään muun luokan tietoja attribuuteiksi listan Solmu-luokkaan. Tiedostojen ja hakemistojen on oltava solmujen tietoalkioina, jotta lista olisi edelleen yleiskäyttöinen. Javan API:n tietorakenneluokkia, kuten ArrayList-luokkaa, ei saa käyttää. Kysy neuvoa harjoitustyön ohjaajalta, mikäli olet epätietoinen tietorakenteiden käyttöön liittyvissä kysymyksissä. Harjoitustyössä tutustutaan linkitettyyn listarakenteeseen myös toteuttamalla OmaLista-luokassa opettajan antaman Ooperoiva-rajapinnan määrittelemät listaoperaatiot. Yksi rajapinnan operaatioista lisää alkion listalle siten, että alkio sijoittuu kaikkien itseään pienempien tai yhtä suurien alkioiden jälkeen ja ennen kaikkia itseään suurempia alkioita. Alkioita vertaillaan lisättäessä Comparablerajapinnan compareto-metodilla (luku 3.2), jolloin tiedostoja ja hakemistoja sisältävä lista järjestyy automaattisesti nousevaan aakkosjärjestykseen. Voit halutessasi tehdä muitakin kuin rajapinnan määrittelemiä listaoperaatioita. Operaatioiden tulee olla puhtaita listaoperaatioita, joita voitaisiin käyttää myös muissa tehtävissä. Näin OmaLista-luokassa ei saa esiintyä harjoitustyön luokkien tunnuksia. Erityisesti nimiä Tieto, Tiedosto, Hakemisto, String tai StringBuilder ei saa käyttää oman listaluokan operaatioissa. Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 10 / 17

3.4. Tiedostojärjestelmä Harjoitustyössä tiedostojärjestelmän näyttäytyy hakemistopuuna (luku 1.1), joka koostuu keskinäisillä viitteillä yhdistetyistä Hakemisto-luokan olioista. Oliot muistuttavat jossain määrin yhteen suuntaan linkitetyn listan solmuja, joista kustakin on viite seuraavaan solmuun. Pääasiallinen ero on se, että hakemistosta voi lähteä useita viitteitä seuraavin hakemistoihin (alihakemistot) ja että hakemistosta on myös viite edelliseen hakemistoon (ylihakemisto). Yli- ja alihakemiston välisten viitteiden avulla puussa voidaan liikkua ylös ja alas viitteitä seuraamalla. Hakemisto-luokka säilöö tiedostoihinsa ja alihakemistoihinsa liittyvät viitteet Omalista-tyyppiselle listalle (luku 3.3), joka on luokan attribuutti. Hakemistooliolla on näin osaolio, joka luomisesta ja hallinnoinnista hakemisto on vastuussa. Kuvassa 14 on hahmoteltu Documents-nimisen hakemiston ja sen sisällön rakenne olioina. Documents-hakemistoon tulee viite ylihakemistosta ja siitä lähtee viite ylihakemistoon. Hakemisto-olio viittaa listaolioon, jonka tietoalkiot ovat viitteitä hakemiston sisältämiin tietoihin, jotka ovat alihakemistot School ja Work sekä tiedosto todo.txt. Alihakemistoista on viitteet niiden omiin listaolioihin ja viitteet Documents-hakemistoon, joka on alihakemistojen ylihakemisto. Tiedostolla ei ole paluuviitettä hakemistoonsa. Kuvassa 1 annettu hakemistopuu on piirretty olioiden ja viitteiden muodostamana rakenteena kuvassa 15. Kuvaan ei ole piirretty näkyviin hakemisto-olioiden osaolioita. Juurihakemiston ylihakemistoviite on null-arvoinen. "Documents" "School" "todo.txt" 1000 "Work" Kuva 14: Hakemisto ja sen sisältö oliona, joka on liitetty toisiinsa viitteillä. Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 11 / 17

null "/" "pics" "temp" "cats" "dogs" "memo_backup.txt" 42 "ceiling_cat.gif" 3677 "worlds_ugliest_dog.jpg" 118088 "dangerous_kitten.jpg" 13432 Kuva 15: Hakemistopuu viitteillä yhdistettyinä olioina. Harjoitustyössä on toiminto hakemistopuun sisällön rekursiiviseen tulostukseen nykyhakemistosta alkaen (luku 2.10). Tulostus tapahtuu esijärjestyksessä (preorder). Hakemistopuussa tämä tarkoittaa sitä, että ylihakemisto tulostetaan ennen alihakemistojaan. Alla on annettu algoritmi, jossa on rekursiivisen tulostuksen keskeisin idea. Huomaa, että algoritmista puuttuu muun muassa virheenkäsittely ja tulosteen tarkempi muotoilu. Algoritmin voi muuttaa paluuarvon avulla listauksen merkkijonona palauttavaan muotoon. Algoritmi puuntulostus(hakemisto hakemisto) { // Asetetaan apuviite hakemiston tiedot säilövään listaan. sisältö hakemisto.sisältö(); // Käydään hakemiston sisältö läpi yksi tieto kerrallaan. i 0; while (i < sisältö.koko()) { // Tulostetaan tiedon merkkijonoesitys. tieto sisältö.alkio(i); tulosta(tieto); // Tulostetaan alihakemiston sisältö. if (tieto on hakemisto) puuntulostus(tieto); i++; } } Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 12 / 17

3.5. Koodin organisointi Tee luokkahierarkian luokkien lisäksi omat luokat komentojen tulkille ja käyttöliittymälle ja erillinen main-metodin sisältävä ajoluokka Oope2017HT. Ohjelmaan voi lisätä näiden lisäksi muita omia luokkia. Hakemistopuun hallinnointi on tulkkiluokan vastuulla. Tulkkiluokka toteuttaa ohjelman tuntema komennot hakemistopuuta käsittelevillä metodeilla. Kullekin komennolle on pääsääntöisesti oma metodi, joka hyödyntää mahdollisimman paljon Hakemisto-luokassa toteutettuja Komennettava-rajapinnan metodeja. Esimerkiksi rm-komento toteutetaan metodilla, joka kutsuu nykyisen hakemisto-olion kautta Hakemisto-luokan poistometodia, joka puolestaan nojaa OmaLista-luokaan tehtyyn uuteen operaatioon. Tulkkiluokassa on Hakemisto-tyyppinen attribuutti hakemistopuun juurelle, jonka kautta voidaan edetä mihin tahansa hakemistoon. Nykyisen hakemiston hakemisto-olioon liittyvä attribuutti helpottaa komentojen toteutusta. Kaikki käyttäjän antamat tiedot luetaan käyttöliittymässä ja käyttöliittymässä tehdään mahdollisimman suuri osa tulostuksista. Pääsilmukan luonteva paikka on käyttöliittymän luokka. Pääsilmukasta kutsutaan komentoja vastaavia tulkkiluokan metodeja joko suoraan tai apumetodien kautta. Sijoita kaikki luokkasi oope2017ht-nimiseen pakkaukseen. Ajoluokka on pakkauksen juurihakemistossa oope2017ht. Tee Tieto-, Tiedosto- ja Hakemisto-luokille oope2017ht.tiedot-niminen alipakkaus. Tämän pakkauksen luokat ovat ajoluokan sisältävän oope2017ht-hakemiston tiedot-nimisessä alihakemistossa (kuva 16). Voit tehdä halutessasi lisää alipakkauksia. Nämäkin pakkaukset ovat ajoluokan hakemiston alihakemistoja. +---apulaiset ---In.java ---Komennettava.java ---Ooperoiva.java +---fi +---uta +---csjola +---oope +---lista ---AbstraktiLista.java ---LinkitettyLista.java ---Lista.java ---Solmu.java +---oope2017ht ---Oope2017HT.java +---tiedot ---Hakemisto.java ---Tiedosto.java ---Tieto.java... Kuva 16: Harjoitustyön oman pakkauksen rakenne ja valmiiden pakkauksen suositeltu paikka. Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 13 / 17

Harjoitustyössä käytetään apulaiset-pakkaukseen sijoitettua In-luokkaa tietojen lukuun näppäimistöltä. Tähän pakkaukseen on liitetty myös Komennettava- ja Ooperoiva-rajapinnat (luvut 3.2 ja 3.3). Apulaiset-pakkausta ei saa muuttaa millään tavalla. Löydät apulaiset-pakkauksen kurssisivujen Opetus Harjoitustyö - kohdasta. Ohjelman kääntäminen ja suoritus on helpointa, kun valmiit pakkaukset ja ohjelmasi sisältävä oope2017ht-pakkaus ovat saman hakemiston alihakemistoina (kuva 16). Näin toimien ohjelman kääntyy komentoikkunassa pakkausten ylihakemistossa komennolla javac oope2017ht/oope2017ht.java ja on suoritettavissa komennolla java oope2017ht.oope2017ht. 4. Palautus ja tarkistus Harjoitustyössä on välipalautuspiste ennen lopullista palautusta. Välipalautuksen tavoitteena on saada kurssilaiset aloittamaan harjoitustyön teko ajoissa. Harjoitustyöstä täytyy palauttaa perjantaihin 24.3.2017 7.4.2017 klo 12.00 mennessä Javalla toteutettu luokkahierarkia (luku 3.2), OmaLista-luokka (luku 3.3) ja osittainen dokumentaatio (luku 5). Valmis ohjelma ja dokumentaatio kokonaisuudessaan on palautettava viimeistään perjantaina 21.4.2017 28.4.2017 klo 12.00. Molemmat palautukset tehdään WETO-järjestelmään, joka tarkistaa automaattisesti ratkaisujen rakennetta ja toiminnallisuutta. Rakenteen tarkistus on osittainen, mutta toiminnallisuuden tarkistus on kattavampi. Toiminnallisuutta arvioidaan vertailemalla mallivastauksen ja opiskelijoiden ratkaisujen tulosteita. Tästä syystä edellä annettuja tulostemäärittelyjä on seurattava merkilleen. Automaattinen vertailu vähentää rutiininomaista testaustyötä, jolloin opettajille jää enemmän aikaa mielekkäämpään työhön eli ohjelman rakenteen ja tyylin tutkimiseen. Opiskelijat hyötyvät tästä perusteellisempien kommenttien muodossa. Toinen välipalautuksessa käytettävistä testiluokista ja tarkemmat palautusohjeet julkaistaan kurssin verkkosivuilla. Lisäaikaa työn tekoon voi saada muutaman päivän hyvästä syystä. Lisäajasta on sovittava ohjaajan kanssa ajoissa eli viimeistään päivää tai paria ennen palautuksen takarajaa. Lisäaika estää useimmissa tapauksissa hyvityspisteiden saamisen (luku 7). Harjoitustyön ohjaaja ei välttämättä ole tavattavissa henkilökohtaisesti lisäaikana. Ennen palautusta on syytä varmistaa, että ohjelma toimii varmasti oikein viimeisimpien muutosten jälkeen. Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 14 / 17

5. Dokumentointi Harjoitustyöstä kirjoitetaan niin välipalautuksen kuin lopullisen palautuksen yhteydessä dokumentti. Molemmissa palautuksissa dokumentissa tulee olla: Kansilehdellä tekijän nimi, opiskelijanumero ja sähköpostiosoite. Sivun keskellä tulisi olla suuremmalla fontilla dokumentin nimi. Kurssin kotisivuilla julkaistaan esimerkinomainen kansilehti. UML-luokkakaavio ja sen lyhyt sanallinen kuvaus. Välipalautuksen yhteydessä kaaviossa esitetään itse tehdyt luokat tarkalla tasolla (luokkasymboleissa kaikki piirteet) ja yleisemmällä tasolla (luokkasymboleissa vain tärkeimmät piirteet) suunnitelma työn toteuttamattomasta osuudesta. Lopullisessa palautuksessa kaikki itse tehdyt luokat piirretään tarkalla tasolla. Lopullisessa palautuksessa dokumenttiin kirjataan myös omia ajatuksia. Esimerkiksi: Oliko työ helppo, sopiva tai vaikea? Miksi koit työn helpoksi, sopivaksi tai vaikeaksi? Mitä uutta opit? Oliko työstä mitään hyötyä tekijälleen? Paljonko aikaa käytit työhön? Dokumentin leipäteksti kirjoitetaan 12 pisteen fontilla ja yhdellä rivinvälillä. Valmiin tekstin lukeminen pariin otteeseen ei ole huonompi idea. Dokumentin kirjoitus tekstinkäsittelyohjelmalla sekä ohjelmasta löytyvän oikolukutoiminnon käyttäminen tekstin tarkistamiseen on myös suotavaa. Luokkakaaviossa esiintyvien luokkien väliset suhteet mallinnetaan luokkien välisinä suhteina. Piirrä periytymis- ja toteuttamissuhteiden lisäksi näkyviin luokkien väliset assosiaatiot. Jos jossakin itse kirjoitetussa luokassa A on attribuutti, jonka tyyppi on toinen oma luokka B, niin tätä attribuuttia ei esitetä luokan A laatikossa, vaan A- ja B-luokkien symboleiden välisenä assosiaatioviivana. Anna kaikille assosiaatioille nimet, suunta sekä rooli ja kertautumiset. Piirrä luokkakaavioon myös luokkien väliset riippuvuussuhteet. Riippuvuussuhde on assosiaatiota heikompi suhde luokkien ilmentymien välisen hetkellisen yhteistyön ilmaisemiseen. Jos oma luokka C hyödyntää toisen oman luokan D palveluja ilman attribuuttia, niin luokkalaatikoiden välille voi piirtää nuolen (varsi katkoviivaa) luokasta C luokkaan D riippuvuussuhteen merkiksi. Kaavioiden piirto on helpompaa erityisesti UML-kaavioiden piirtoon tehtyjä ohjelmistoja käyttäen. Dia on ilmainen ohjelma, jolla voi piirtää vuo- ja ERkaavioiden lisäksi myös UML-kaavioita. Jotkin ohjelmat osaavat muodostaa osan luokkakaaviosta automaattisesti lähdekoodin perusteella. Tällainen on UMLetohjelma, joista kerrotaan lisää kurssisivujen Opetus Harjoitustyö UML - kohdassa. NetBeans- ja Eclipse-ohjelmistojen kaltaisiin kehitysympäristöihin on saatavilla takaisinmallinnuksen hallitsevia lisäosia. Koodi dokumentoidaan lopullisessa palautuksessa kirjoittamalla lyhyet Javadockommentit jokaiselle attribuutille, metodille ja luokalle. (Rakentajia ja aksessoreita ei tarvitse kommentoida, mikäli ne ovat toiminnoiltaan tavanomaisia.) Javadoc on Java-ympäristön tarjoama menetelmä koodin puoliautomaattiseen doku- Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 15 / 17

mentoimiseen. Javadoc-kommentoinnista annetaan erilliset ohjeet kurssin verkkosivujen Opetus Harjoitustyö Javadoc -kohdassa. Javadoc-kommentit voi halutessaan kirjoittaa jo välipalautuksen yhteydessä. Muista edelleen selittää metodien sisällä normaaliin tapaan metodien keskeiset ja vaikeaselkoiset osuudet tavanomaisia kommentteja käyttäen. 6. Ohjaus Kurssin vastuuopettaja vastaa pääosin harjoitustyön ohjauksesta välipalautuspisteeseen saakka. Suurin osa mikroluokkaohjauksesta on välipalautuksen jälkeen. Ohjausten ajat ja paikat ilmoitetaan myöhemmin kurssin kotisivuilla. Ohjaukseen voi tulla omasta harjoitusryhmästä riippumatta: voit käydä ohjattavana aikana, joka sopii sinulle parhaiten. Luuppi tarjoaa ohjausta harjoitustyöhön koodauspajassaan. Vastuuopettajaa voi käydä tapaamassa myös muina aikoina. Tapaamisaika kannattaa sopia etukäteen, jos haluaa varmistaa, että vastuuopettaja on paikalla huoneessaan. Pienemmät kysymykset kannattaa esittää ohjaajille sähköpostitse. Harjoitustyön pääasiallinen sähköpostiohjaaja on mikroharjoitusryhmäsi vetäjä. Näet ryhmäsi WETO-järjestelmän Students-välilehdeltä. Kysy neuvoa sähköpostitse sopivimmaksi katsomaltasi opettajalta, jos et ole valinnut ryhmää. Kysymyksiä ja niihin annettuja vastauksia kerätään kurssin verkkosivujen Harjoitustyö-kohtaan. Ennen kysymistä kannattaa siis tarkistaa kurssin verkkosivut vastaus voi hyvinkin olla jo sivuilla. Monet ongelmat selviävät myös tehtävänantoa lukemalla ja tutustumalla verkkosivuilta löytyviin esimerkkiajoihin. Kysyminen kannattaa erityisesti, kun on epävarma suuremman mittakaavan kysymyksissä. On pienempi vaiva selvittää epäselvä kohta ajoissa ohjaajan kanssa, kuin korjata valmista ohjelmaa jälkikäteen tehtävänantoa vastaavaksi. 7. Arvostelu Arvostelu perustuu ensisijaisesti ohjelman oikeellisuuteen: ohjelman on toimittava testeissä tehtävänannossa määritellyllä tavalla. Harjoitustyö voidaan joko hylätä tai hyväksyä, jolloin työ arvostellaan asteikolla 0 4 pistettä. Pisteet lisätään harjoitushyvityspisteiden tapaan tenttipisteisiin vain, mikäli tentistä on saanut vähintään vaaditut 12 pistettä. Harjoitustyöstä voi saada pisteitä vain, jos välipalautus läpäisee WETOn automaattisen testauksen ja työ on palautettu molemmilla palautuskerroilla ilman lisäaikaa. Aikavaatimuksen osalta voidaan joustaa äärimmäisen hyvästä syystä, jollaisia ovat esimerkiksi pitkä ulkomaan matka tai kokopäivätöiden aiheuttamat ylitsepääsemättömät esteet. Työn pisteet määräytyvät lopullisen palautuksen jälkeen tehtävissä testeissä. Testauksessa on julkinen ja salainen osuus. Huomaa, että salaisissa testeissä käytetään eri syötteitä kuin kotisivuilla annetuissa esimerkeissä. Ohjelman oikeellinen toiminta esimerkkien osalta ei siksi takaa salaisten testien läpäisyä. Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 16 / 17

Hylkäyksen perusteena voi olla tehtävänannon noudattamatta jättäminen, ohjelman toimimattomuus, harjoitustyön teossa kiellettyjen Javan ominaisuuksien käyttö, huono dokumentti, hyvän ohjelmointitavan noudattamatta jättäminen ja/tai plagiointi. Plagiointiin liittyy sanktio, joka koskee molempia opiskelijoita. Toiselta opiskelijalta tämän tietämättä kopioidun koodin käyttö johtaa kopioijan koko kurssisuorituksen hylkäämiseen. Hylätyn työn voi palauttaa korjattuna pääsääntöisesti kolme kertaa. Välipisteessä hylätyn työn korjaukseen on aikaa muutama päivä. Lopullisen palautuksen korjausaikaa on useimmiten viikko työn hylkäyksestä. Pisteytys perustuu aina ensimmäiseen palautukseen. Korjauskierroksen kautta ei voi korottaa pistemääräänsä. Lähteet 1. Wikipedia-yhteisö, Command-line interface, https://en.wikipedia.org/wiki/command-line_interface (Luettu viimeksi 26.2.2017.) 2. J. Laurikkala, Lausekielinen ohjelmointi I -kurssin kotisivut http://www.uta.fi/sis/tie/laki1/ohjelmointivalineita/komentoikkuna.html (Luettu viimeksi 26.2.2017.) 3. Wikipedia-yhteisö, File system, https://en.wikipedia.org/wiki/file_system (Luettu viimeksi 26.2.2017.) 4. J. Laurikkala, Lausekielinen ohjelmointi I -kurssin luentorunko, luku 14, http://www.uta.fi/sis/tie/laki1/opetus/luennot.html (Luettu viimeksi 2.3.2017.) 5. J. Laurikkala, Lausekielinen ohjelmointi II -kurssin luentorunko, luku 7, http://www.uta.fi/sis/tie/laki2/opetus/luennot.html (Luettu viimeksi 2.3.2017.) 6. J. Laurikkala, Olio-ohjelmoinnin perusteet -kurssin luentorunko, luku 4, http://www.uta.fi/sis/tie/oope/opetus/luennot.html (Luettu viimeksi 2.3.2017.) Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala 17 / 17