Toteutusdokumentti Olutkortisto Juuso Hyvönen juuso.hyvonen@cs.helsinki.fi Ohjaaja Pekka Mikkola HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Ohjelmoinnin harjoitustyö (Java), 24.10.2010
Sisällys 1 Käyttöohje...3 1.1 Ohjelman tarkoitus ja yleiskuvaus...3 1.2 Ajo-ohje ja laitteistovaatimukset...3 1.3 Kortiston käyttäminen...3 1.3.1 Oluen lisäys...3 1.3.2 Oluiden selailu...4 1.3.3 Oluen esitysmuoto...4 1.3.4 Oluen haku...5 1.4 Olutkortiston sulkeminen...6 2 Ohjelman toiminta ja rakenne...6 2.1 Ohjelman yleiskuvaus...6 2.2 Luokkarakenne...6 2.3 Luokkien kuvaus...7 2.4 Muutoksen suunnitteludokumenttiin nähden...7 2.5 Ohjelman toiminta...8 2.5.1 Ohjelman käynnistyminen...8 2.5.2 Oluen lisäys...9 2.5.3 Oluen haku kortista ja oluen esitys...10 2.5.4 Ohjelman sulkeminen...11 2.6 Ohjelman rajoitusten poisto ja parannusehdotuksia...11 2.6.1 Vain yksi arvosana...11 2.6.2 Ei mahdollisuutta muokata oluen tietokenttiä...11 2.6.3 Oluita ei voi poistaa...12 2.6.4 Oluiden lajittelu...12 3 Testaus...12 3.1 JUnit-testit...12 3.1.1 Havaitut virheet...12 3.2 Muuta...12 1
1 Käyttöohje 1.1 Ohjelman tarkoitus ja yleiskuvaus Olutharrastajat pitävät usein kirjaa maistamistaan oluista. He kirjoittavat lyhyitä sanallisia arvioita ja ottavat talteen oluesta kaikenlaisia oleellisia tietoja kuten alkoholiprosentin ja katkerot sekä tietysti panimon nimen. Vanhoja arvioita on mukava lukea ja niille on myös mukava kirjoitella uudempia arvioita verrokiksi. Olutkortisto on komentoriviohjelma, joka mahdollistaa tälläisen olutkortiston ylläpidon mukavasti komentoriviltä. Kortistoon lisätään olut ja sille syötetään olennaiset tiedot: nimi, panimo, tyyli, arvosana, alkoholiprosentti, kantavierre, katkerot ja väri. Näiden lisäksi olueen voi liittää sanallisia arvioita. Ohjelman käyttöliittymä on tekstipohjainen ja kaikki syötteet annetaan näppäimistöllä. 1.2 Ajo-ohje ja laitteistovaatimukset. Ohjelma on suunniteltu toimimaan Java Standard Edition 6 -ympäristössä. Ohjelma toimii käyttöjärjestelmästä riippumatta millä tahansa nykyaikaisella tietokoneella, johon Javan SE 6:n saa asennettua. Hiirtä ei tarvita. Ohjelma käynnistetään komentamalla ohjelman juurihakemistossa java KaynnistaOlutkortisto. 1.3 Kortiston käyttäminen Ohjelman käynnistyksen jälkeen päävalikko näyttää seuraavalta: Oluita yhteensa: 4 kappaletta Panimoita yhteensa: 3 Uusin olut: Juuson superpanimo Happo-olut (4) (L)isaa (S)elaa (H)ae (P)oistu Valinta: Ensimmäinen rivi kertoo oluiden kokonaismäärän kortistossa. Toinen rivi kertoo panimoiden kokonaismäärän. Kolmas rivi kertoo uusimman oluen nimen sekä tämän tunnisteen, joka löytyy suluista nimen perästä. Näiden alta löytyy neljä valintaa, joista ensimmäinen (L)isää oluen kortistoon. (S)elaa tulostaa listan kaikista kortiston oluista. (H)ae antaa mahdollisuuden hakea tiettyä olutta. (P)oistu sulkee ohjelman. Haluttu toiminto valitaan painamalla toimintoa kuvaavaa kirjainta näppämistöltä ja painamalla ENTER-näppäintä. Ohjelma hyväksyy valinnoissa sekä isot, että pienet kirjaimet. 2 1.3.1 Oluen lisäys Oluen lisäys tapahtuu painamalla L ja ENTER. Ohjelma kysyy seuraavaksi
3 Oluen nimi: Nyt syötetään oluen nimi ja painetaan Enter-näppäintä. Seuraavaksi ohjelma kysyy panimon nimeä. Tällöin syötetään panimo nimi ja painetaan Enternäppäintä. Jos saman niminen olut olit jo lisätty kortistoon, antaa ohjelma ilmoituksen Olut on jo kortistossa. Jos olut lisättiin kortistoon, kyselee ohjelma loputkin tiedot oluesta. Oluen tyyli annetaan vapaamuotoisena tekstinä. Oluen arvosanaksi kelpaa kokonaisluku väliltä 0-50 ja alkoholiprosentiksi luku väliltä 0-100. Muihin kohtiin kelpaa mikä tahansa luonnollinen luku. Tietojen kyselyn jälkeen ohjelma palaa päävalikkoon. Nyt uusimpana oluena näkyy juuri lisätty olut. Olutkortisto tallentaa lisätyt oluet automaattisesti ohjelman sulkemisen yhteydessä ja lataa tallennetut oluet automaattisesti käynnistyksen yhteydessä. 1.3.2 Oluiden selailu Kortistossa olevista oluista saa listauksen valitsemalla (S)elaa, Ohjelma tulostaa listan kaikista kortiston oluista. Oluen nimen perässä näkyy tunniste, jonka avulla olutta pääsee tarkastelemaan. Oluen tarkastelu tapahtuu syöttämällä tämä tunnistenumero ja painamalla ENTER-näppäintä. Selailusta poistutaan tarkastelematta olutta, syöttämällä 0 ja painamalla ENTER-näppäintä. Jos kortistossa ei ole oluita, ilmoittaa ohjelma "Kortistossa ei oluita." 1.3.3 Oluen esitysmuoto Seuraavassa on esiteltynä oluen esitystapa kortistossa. Juuson superpanimo Hieno olut (1) Arvosana: 43 Alkoholi: 5,9% Tyyli: India Pale ale Katkerot: 40,0 EBU Kantavierre: 23.0% Vari: 35.0 EBC Arviot: 22.9.2010: Läpikuultavan tumman ruskea väri. Pieni pitsinen vaahto. Tuoksu herkullisen leipäinen ja hedelmäinen. Maku on hedelmäinen ja hieman havumetsää. Ripaus greippiä ja sopivan kirpeä katkeruus. Suutuntuma keskitäyteläinen. Oikein mukava ruis-ipa tämä. 31.1.2010 Väri läpikuultavan tumman ruskea. Vaahto tiivistä ja pitsiäkin jää. Miedohkossa tuoksussa humala selkeästi esillä. Maku on hieman havuinen ja selkeän greippin kuoren katkeroinen. Maussa tuntuu
4 myös hieman maltaista pyöreyttä päättyen kuitenkin täysin kuivaan loppuun. Suutuntuma on keveähkö ja raikas. (L)isaa arvio Valinta: (P)oistu Ensimmäiseltä riviltä löytyy panimo sekä oluen nimi. Panimoa ja oluen nimeä ei erotella minkäänlaisin välimerkein, sillä oluita on tapana kutsua panimo + nimi -yhdistelmällä. Toiselta riviltä löytyy arvosana, joka on kokonaisluku väliltä 0-50 sekä alkoholiprosentti. Kolmas rivi kertoo oluen tyyliin ja katkeropitoisuuden. Neljäs rivi kertoo kantavierteen sekä värin. Näiden jälkeen tulevat oluelle lisätyt arviot, joista kerrotaan päivämäärä ja tämän jälkeen itse arvio. Alariviltä löytyvät valinnat (L)isää arvio ja (P)oistu. Oluelle lisätään arvio valitsemalla (L). Tämän jälkeen kortisto pyytää käyttäjältä tekstimuotoisen arvion. Päivämäärä tallentuu automaattisesti. (P) poistuu oluen tarkastelutilasta päävalikkoon. 1.3.4 Oluen haku Oluita haetaan kortistosta valitsemalla päävalikossa (H)aku. Jos kortistossa ei ole oluita, ilmoittaa ohjelma "Kortistossa ei oluita." Jos kortistossa kuitenkin oli oluita, aukeaa seuraavanlainen näkymä: Hakuperuste: (N)imi (P)animo (T)unniste Valinta: Valinta (N) tarjoaa haun nimen perusteella. Kortisto pyytää ensin hakuperusteen ja listaa tämän jälkeen kaikki oluet, joiden nimeen tämä hakusana sisältyy. Tämän jälkeen käyttäjä voi valita haluamansa oluen syöttämällä tunnistenumeron ja painamalla ENTER-näppäintä. Valinta (P) tarjoaa panimohaun. Haku tuottaa listan kaikista haetun panimon oluista. Tämän jälkeen käyttäjä voi valita haluamansa oluen syöttämällä tunnistenumeron ja painamalla ENTERnäppäintä. Valinta (T) tarjoaa suoran tunnistehaun, jossa käyttäjä vain syöttää oluen tunnistekoodin. Tämän jälkeen käyttäjä voi valita haluamansa oluen syöttämällä tunnistenumeron ja painamalla ENTERnäppäintä. Valitsemalla 0, joko hakuperustevalikossa tai haun jälkeen, poistutaan takaisin päävalikkoon.
5 1.4 Olutkortiston sulkeminen Kortisto suljetaan valitsemalla päävalikossa (P)oistu. Ohjelma tallentaa lisätyt oluet automaattisesti tiedostoon ja sulkee itsensä. Kun ohjelma taas seuraavan kerran käynnistetään, lataa kortisto oluet automaattisesti tiedostosta. 2 Ohjelman toiminta ja rakenne 2.1 Ohjelman yleiskuvaus Ohjelman rakenne on hyvin yksinkertainen. Olutkortisto toimii käyttöliittymänä ja sen alla toimivat työkaluja tarjoava Kalut-luokka sekä itse kortisto-ominaisuuden tarjoava Kortisto-luokka. Kortiston puolestaan luo ilmentymiä Olut- ja Panimo-luokista omiin taulukoihinsa. Panimo-luokka tallentaa tiedot oluistaan omaan taulukkoonsa. Olut-luokka tallentaa taulukkoon Arvio-luokasta luotuja ilmentymiä, jotka ovat oluen arvioita 2.2 Luokkarakenne Luokkakaavio Olutkortisto koostuu kuudesta luokasta: Olutkortisto luo ohjelmalle tekstipohjaisen käyttöliittymän. Se ottaa käyttöönsä ilmentymät Kalut-
6 luokasta sekä Kortisto-luokasta. Kalut tarjoaa syötteen lukemiseen ja kirjoittamiseen tarvittavia toimintoja, jotka eivät sujuvasti kuulu mihinkään muuhun luokkaan. Kortisto on koko Olutkortiston ydin. Se pitää kirjaa oluista ja panimoista omissa ArrayListeissään. Oluet ovat ilmentymiä Olut-luokasta ja panimot ilmentymiä Panimo-luokasta. Tietovarastona toimimisen lisäksi Kortisto tarjoaa oluen- ja arvion lisäyksen sekä oluen haun nimen- tai tunnisteen perusteella sekä panimon haun. Panimo pitää ArrayListissä kirjaa oluista, joita panimoon kuuluu. Se tarjoaa mahdollisuuden lisätä uusi olut panimoon sekä tarjoaa listan panimon kaikista oluista. Olut on yksittäinen olut. Se sisältää tiedot oluen nimestä, panimosta, tyylistä, arvosanasta, alkoholiprosentista, kantavierteestä, katkeroista ja väristä. Oluella on myös uniikki tunnistenumero, joka lasketaan kaavalla: oluiden määrä + 1. Lisäksi oluella on lista siitä tehdyistä arvioista. Arviot ovat ilmentymiä Arvio-luokasta. Luokka tarjoaa mahdollisuuden muuttaa kaikkia muita arvoja paitsi oluen tunnistenumeroa. Arvio on yksittäinen arvio. Se sisältää yhden sanallisen, enintään 500 merkkiä pitkän arvion sekä aikaleiman, jossa arvion päivämäärä. 2.3 Luokkien kuvaus Katso Javadoc. 2.4 Muutoksen suunnitteludokumenttiin nähden Olutkortiston toteutus sujui hyvin pitkälti suunnitellusti. Suurin muutos alkuperäiseen suunnitelmaan on Kalut-luokan lisäys. Yleiskäyttöisiä syötteenlukumetodeja ja kortiston tallennusja latausmetodit on selkeyden vuoksi siirretty omaan luokkaansa. Joitain turhia attribuutteja kuten int oluidenmaara on tiputettu pois, sillä esimerkiksi tämän tiedon saa kaivettua suoraan ArrayListin size()-metodilla.
7 2.5 Ohjelman toiminta 2.5.1 Ohjelman käynnistyminen Sekvenssikaavio: Olutkortiston käynnistyminen
8 2.5.2 Oluen lisäys Sekvenssikaavio: Oluen lisäys kortistoon
9 2.5.3 Oluen haku kortista ja oluen esitys Oluen haku ja -esitys
10 2.5.4 Ohjelman sulkeminen Sekvenssikaavio: Olutkortiston sulkeminen 2.6 Ohjelman rajoitusten poisto ja parannusehdotuksia 2.6.1 Vain yksi arvosana Kortistoon on mahdollista lisätä vain yksin arvosana. Tämän voisi korjata esimerkiksi lisäämällä oman arvosanataulukkonsa, josta lasketaan esimerkiksi keskiarvo ja suurin ja pienin arvo. Toinen vaihtoehto olisi lisätä jokaisen sanallisen arvion yhteyteen arvosana. 2.6.2 Ei mahdollisuutta muokata oluen tietokenttiä Oluelle lisäämisen yhteydessä annetut arvot ovat lopullisia. Tämä ongelma, jos lisäyksen yhteydessä sattuu huolimattomuusvirhe. Olut-luokalla on jo olemassa metodit oluen kenttien muokkaamiseen. Jotta käyttäjä pystyisi muokkaamaan kenttiä, täytyisi vain toteuttaa yksinkertainen käyttöliittymä, jolla näitä metodeita pääsee käyttämään.
2.6.3 Oluita ei voi poistaa Kerran lisätty olut on ja pysyy. Yksi poistoon liittyvä ongelma on tunnistenumeron laskenta poiston jälkeen lisättäville oluille. Tämän voisi ratkaista muuttamalla tunnisteen laskentaan käytettyä kaavaa muodosta oluiden määrä + 1, muotoon suurin tunnistenumero + 1. Toinen mahdollisuus olisi tutkia olutlista läpi ja katsoa mikä numero välistä puuttuu ja vasta täyden listan jälkeen jatkaa taas tunnistenumeroiden suurentamista. 11 2.6.4 Oluiden lajittelu Oluita olisi mukava selata kauniisti ryhmiteltynä. Esimerkiksi arvosanan mukaan järjestäminen ja panimoittain listaaminen olisi kätevää. Toteutus onnistuu helposti oluiden kenttiä vertailemalla. 3 Testaus 3.1 JUnit-testit Ohjelmasta testattiin JUnit-testeillä luokat Kalut, Kortisto, Olut ja Panimo. Luokasta Kalut testattiin tiedoston tallennus ja lataus sekä tiedoston. Tiedoston latauksessa testattiin myös latausalgoritmin toimivuus, jos ladattavaa tiedostoa ei löydy. Luokasta Kortisto testattiin oluen lisäys, saman oluen lisäys uudelleen sekä oluen, jolla on tyhjä nimi- tai tyhjä panimo-kenttä lisäys. Samalla testattiin myös uuden panimon syntyminen, jos panimoa ei vielä oltu luotu. Kortistosta testattiin myös arvion lisäyksen toimiminen oikean muotoisella arviolla, tyhjällä arviolla ja liian pitkällä arviolla. Luokasta Olut testattiin settereiden toiminta kunnollisilla, negatiivisilla ja liian suurilla arvoilla. Arvion lisäys olueen testattiin samalla tavalla. Luokasta Panimo testattiin oluen lisäyksen toimivuus. 3.1.1 Havaitut virheet Testit suoritettiin melko myöhäisessä vaiheessa ohjelman toteutusta, joten merkittäviä virheitä ei löytynyt. Turhia päällekkäisiä syötteentarkistuksia löytyi jokunen ja ne poistettiin. Esimerkiksi arvion pituus tarkistettiin ensin Olutkortisto-luokassa, sitten Kortisto-luokassa ja tämän jälkeen vielä Olut-luokassa. Nyt tarkistus tapahtuu enää Olutluokassa ja muut luokat reagoivat saamansa boolean-arvon mukaan. 3.2 Muuta Olutkortisto-luokkaa ei testattu erillisillä testeillä, sillä se havaittiin toimivaksi lukuisilla
ohjelman käyttökerroilla sekä Kimmo Heikkisen suorittamalla näppäimistön satunnaisella mätkimisellä. 12