5. Ohjelmointiprojekti

Tälle sivulle on koottu kaikki informaatio koskien kurssin lopputyötä, omaa ohjelmointi projektia. Projektiin liitetty loppuraportti toimii portfolioni johdantona projektille. Mikäli haluat siirtyä suoraan ohjelmakoodin, löydät sen täältä

Loppuraportti

5.1 Ohjelman kuvaus
5.2 Teknisen toteutuksen kuvaus
5.3 Vaikeudet
5.4 Projekti henkilökohtaisen kokemuksena
5.5 Mitä tekisin toisin
5.6 Yhteenveto
5.7 Ohjelmakoodi

5.1 Ohjelman kuvaus

Syksyn ja alkukevään java-ohjelmointiputken päättävä loppupuprojekti tuntui koko kurssin ajan hyvin etäiseltä asialta. Oli mahdotonta ajatella itseään suunnittelemassa ja toimeenpanemassa kokonaista ohjelmaa, sillä jo valmiiden ohjeiden noudattaminen ohjelmointiharjoitusten yhteydessä oli hankalaa. Kun projektisuunnitelman deadline siis lähestyi, ei minulla ollut pienintäkään käsitystä siitä, mitä haluaisin tehdä. Rupesin miettimään asioita, jotka ovat minulle läheisiä: musiikki, taide, konjakki ja kirjallisuus. Juuri kirjallisuudesta, tai kirjoista, muodostui ohjelmani perusta.

Opustointi on yksinkertainen ja helppokäyttöinen kirjojen tallennus- ja hakuohjelma. Kun se avataan, käyttäjän eteen ilmestyy käyttöliittymä, jonka vasemmalta puolelta löytyvät tiedot kaikista senhetkisistä ohjelmaan tallennetuista kirjoista. Katseen siirtyessä vasemmalta oikealle, silmät tavoittavat pian hakutoiminnot: tekstikenttä, ilmeisesti haun kirjoittamiseen, sekä lista erilaisista kategorioista, kuten kirjailija ja kustantaja, joista on valittava hakusanaa/-lausetta vastaava vaihtoehto. Mutta mitä ihmettä, tällainen hakukentäkategoriapari löytyy kolme kertaa käyttöliittymästä! Syy on yksinkertainen. Jotta olisi mahdollista etsiä tietyn kirjailijan tiettyä teosta tietyn kustantajan kustantamana (onhan toki mahdollista, että saman kirjan ovat kustantaneet kakis eri yritystä, joista toisen tekemä painos on selkeästi tyylikkäämpi), tarvitaan mahdollisuus sisällyttää samaan hakuun useampia kategorioita.

Kolmen eri hakutoiminnon käyttäminen antaa yleensä huomattavasti suuremman määrän löydettyjä kirjoja, sillä tuloksiksi kelpuutetaan jokainen yhdenkin hakuehdon täyttävä teos, eikä ainoastaan niitä, jotka toteuttavat kaikki kolme ehtoa. Tämän vuoksi kirjoilla on oma sisäinen laskurinsa, joka laskee, kuinka monta tulosta kyseisen kirjan haku on saanut ja asettaa löydettyjen teosten listan sen mukaisen järjestykseen. Kirjat, joiden laskurin lukema on sama, järjestetään aakkosjärjestykseen kirjailijan sukunimen mukaan.

Kirjojen poistaminen ohjelmasta toimii suoraviivaisesti: teos valitaan käyttöliittymän vasemmalla puolella sijaitsevasta kirjalistasta ja painetaan listan alta löytyvää poista-nappia. Uuden teoksen lisääminen ohjelmaan on hieman monimutkaisempaa. Vasemman yläkulman Lisää kirja-valikon lisää kirja-osiota painettaessa uusi ikkuna ilmestyy näytölle. Se on jaettu kahteen osaan vertikaalisesti ja seitsemään horisontaalisesti. Vasemman puolen komponentit kertovat kategorian, jonka tiedot kirjoitetaan oikealle puolelle. Kategorioita on kuusi kappaletta: kirjailija, teos, genre, ilmestymisvuosi, kustantaja ja alkuperäinen nimi. Seitsemäs sarake ikkunassa on varattu lisää- ja vedä-nappuloille. Lisää-nappi lisää kirjan ohjelman ajonaikana olemassa olevaan listaan. "Vedä" (eng. flush) puolestaan kirjoittaa kyseisen lista tiedostoon, joka luetaan joka kerta kun ohjelma käynnistetään, tai painetaan Vedä-nappulaa.

Lyhyen käyttöohjeen saa näkyville klikkaamalla hiirellä poista-napin vieressä olevaa komponenttia, jossa lukee "manuaali". Ohjelma suljetaan vaihtoehtoisesti painamalla joko oikeassa yläkulmassa olevaa rastia tai valitsemalla Kirjastointi-valikosta lopeta.

5.2 Teknisen toteutuksen kuvaus

Misään vaiheessa projektia en tehnyt kokonaisvaltaista, siitä hetkestä loppuun asti ulottuuvaa suunnitelmaa niistä ohjelmointiteknisistä ratkaisuista, joita päädyin käyttämään. Yritin aluksi, mutta muutaman tuloksettoman tunnin jälkeen päätin aloittaa Kirja-luokan ohjelmoimisen, sillä sen rakenteesta minulla oli melko selkeä käsitys, joka ei muuttunut misään vaiheessa projektin edetessä.

Kirja-luokka Kirjalla on oltava perusominaisuudet, joiden avulla ohjelma jäsentää ja vertailee sitä muihin kirja-olioihin. Nämä ominaisuudet, attribuutit, annetaan konstruktorille parametreina uutta kirjaa luotaessa. Luontimetodi on siis tämän näköinen:

public Kirja(String kirjailija, String nimi, String genre, String vuosi, String kustantaja, String
           alkupNimi) {
} 

Jokaiselle attribuutille on olemassa anna-metodi, jonka avulla niihin päästään muista luokista käsiksi, erityisesti hakualgoritmia ohjelmoitaessa. Poikkeuksellisen tärkeä asema Kirja-luokassa on toString-metodilla. Se palauttaa luontimetodissa parametroidut attribuutit merkkijonona, jonka käyttäjä näkee selatessaan kirjalistaa tai suorittaessaan haun. Se on siis ainoa asia Kirja-luokasta, mikä tulee käyttäjälle tutuksi.

Myöhemmin, kun ohjelmoin teosten etsimisessä käytettyä hakualgoritmia, lisäsin Kirjalle vielä kaksi uutta attribuuttia. Laskurin, jonka avulla teokset asetetaan oikeaan järjestykseen, sekä JPopupMenusta periytyvän lisäTiedot-komponentin, johon oli tarkoitus voida tehdä vapaamuotoisia kommentteja kirjasta. Aika ei kuitenkaan riittänyt jälkimmäiseen, mutta siitä on jäänyt viite lähdekoodiin.

Kuva käyttöliittymää esittävästä visiostani projektisuunnitelmassani, sekä suunnitelman kommentit komponenteista

1. Ohjelman valikko

  • lopeta, ohjeet, piristysruiske (värikäs käyttöliittymä + dorkat ääniefektit)

  • 2. Pääpaneli
  • paikka, johon perustiedot haun tuloksista tulevat. Mahdollista scrollata ylös ja alas

  • 3. Valitse-nappi
  • valitaan pääpanelista haluttu kohta ja klikataa valitse-nappia, jolloin pop-up kertoo tarkempia tietoja valitusta teoksesta

  • 4. Katergoriat
  • nimi, kirjoittaja, ilmestysvuosi, genre, kustantaja. Kategorioita on 3 kpl jotta olisi mahdollista etsiä esim. Tietyn kustantajan teokset tietyltä vuodelta

  • 5. Hakukenttä
  • kenttä, johon syötetään haluttu haku

  • 6. Etsi-nappula
  • kun kategoriat on valittu ja haku kirjoitettu, painetaan etsi-nappulaa varsinaisen haun suorittamiseksi
  • Yhtä tyylikäs kuva kaaviokuva lopullisesta käyttöliittymästä

    Ikkuna-luokka

    Ohjelman keskeisin ja ylivoimaisesti laajin (n. 1300-riviä koodia) luokka on JFramesta periytyvä Ikkuna. Siinä muodostetaan käyttöliittymä, käsitellään kirjalistan sisältävää tekstitiedostoa ja sen avulla suoritetaan teosten haku. Ikkuna on Opustoinnin (tai Kirjastoinnin) pääohjelmaluokka.

    Graafinen käyttöliittymän asettelijana toimii GridBagLayout ja säiliönä JPanel. Paneeliin lisätään kaikki liittymän komponentit (javax.Swingistä periytyvät JButton, JMenu, JMenuBar, JMenuItem sekä java.awt:stä periytyvät List ja TextField), jotka asetellaan oikeille paikoilleen GridBagConstraints-olion avulla. Kaikki ohjelman napit on toteutettu JButton-luokan avulla. List-luokan jälkeläisiä ovat oikealla sijaitsevat kategorialistat, sekä vasemmalta löytyvä suuri kirjat näyttävä komponentti. Tekstikentät, joihin kirjoitetaan hakuteksti ovat TextFieldin instansseja, sillä kyseisellä luokalla on metodeja, joiden avulla on helppo lukea komponentin sisältämää tekstiä. Kategorialistat on määritelty staattisiksi, jotta niistä olisi helppo saada tietoa Kuuntelija-luokasta.

    Ikkunalla on suuri määrä sisäluokkia, jotka toimivat kaikki kuuntelijoina toteuttaen ActionListener-liittymän: Ikkuna_lopeta, Ikkuna_etsi, Ikkuna_lisääKirja ja Ikkuna_poista. Näistä ensimmäinen sulkee ohjelman. Sen instanssi on lisätty Ikkunan Kirjastointi-valikon lopeta kohtaan. Ikkuna_etsi suorittaa hieman myöhemmin esiteltävän etsi-metodin. Ikkuna_lisääKirja avaa Lisääkirja-ikkunan ja Ikkuna_poista poistaa halutun kirjan ohjelman listasta sekä ylikirjoittaa päivitetyn listan tekstitiedostoon.

    Kirjoja haetaan Ikkunan etsi-metodilla. Se on laajin ja mahdollisesti vaativin osa koko projektia. Ikkunan luonnin yhteydessä luodaan ArrayList-tyyppinen olio, kirjaLista. KirjaLista sisältää tiedot kaikista kirjoista, jotka ohjelma tunnistaa. Etsi() pilkkoo kaikki hakutekstit taulukoksi välimerkin kohdalta. Tämän jälkeen tutkitaan, mikä hakukategoria on ollut valittuna ja käydään for-silmukalla läpi jokaisen kirjaListan alkion valitun kategorian tiedot anna-metdilla ja pilkotaan se niin ikään välimerkin kohdalta taulukoksi. Verrataan kummankin taulukon jokaista sanaa keskenään ja mikäli löytyy vastaavuus, kyseinen kirjaListan alkio lisätään uuteen ArrayList-tyypiseen löydetyt-listaan. Jos "löydetyt" sisältää jo kyseisen Kirja-olion, ts. sama kirja täyttää useamman hakuehdon, lisätään teoksen listassaLkm-attribuutin arvoa, eli kasvatetaan kirjan sisäistä laskuria yhdellä. Lopuksi iteroidaan löydetyt-lista ja tutkitaan alkioiden listassaLkm:arvoja. Siinä tapauksessa, että ehoja on täyttymyt kolme tai enemmän, se lisätään lista3-listaan. Kahdella vastaavuudella pääse lista2:een ja vain yhden kerran haussa esiintynyt kirja joutuu tyytymään lista1:een. Teokset on nyt laitettu paremmuusjärjestykseen, mutta ne voivat vielä esiintyä keskenään täysin kaaottisessa "hujanhajan"-järjestyksessä. Siirretään lista1, 2 ja 3:n alkiot taulukkoihin 1, 2 ja 3. Sitten kutsutaan Arrays.sort-metodia, joka asettaa teokset luonnolliseen järjestykseen, eli tässä tapauksessa aakkosjärjestykseen. Jäljelle jää enää taulukoiden tietojen lisääminen käyttäjän nähtäviksi.

    Ikkunassa määritty lue metodi on hyvin tärkeä ohjelman toimivuuden kannalta. Siinä avataan tietovirta lukemaan tiedostoa kirjas.txt, joka sisältää uusimman version kirjaListasta. Luokalla ObjectInputStream voidaan lukea virrasta olioita ja luoda ne uudestaan täsmälleen samanlaisina. ArrayListKirja kirjaLista siis luodaan uudestaan tietovirrasta käsin. Tämän jälkeen kutsutaan yleensä järjestä-metodia, joka laittaa kirjaListan-alkiot aakkosjärjestykseen ja näyttää ne käyttäjälle. Lopuksi virta suljetaan.

    Lisääkirja-luokka

    Lisääkirja, kuten Ikkunakin, on JFramen jälkeläinen. Se on tehty GridLayoutia hyväksikäyttäen, kuten raportin ensimmäisessä osassa kerrottiin. Periaate on se, että kun käyttäjä kirjoitta oikealle sarakkeelle oikeat tiedot kirjasta, sarakkeen teksti luetaan ja luodaan uusi kirja niillä parametreilla, jotka juuri kirjoitettiin. Kirja lisätään kirjaListaan ja halutessa kirjoitetaan uusi lista kirjas.txt-tiedostoon kirjoita-metodilla: avataan titovirta, kutsutaan ObjectOutoutStream-luokan writeObject-metodia, kirjoitetaan olio ja suljetaan virta.

    Lisääkirjan luontimetodi ottaa parametrina Ikkuna-olion. Näin luokasta voidaan kutsua Ikkunan annaKirjaLista-metodia, jolloin kirjaListaan voidaan lisätä juuri luotu kirja, sekä järjestä-metodia, jotta lista pysyisi järjestyksessä.

    Kuuntelija-luokka

    Kuuntelija toteuttaa liittymän MouseListener. Jos hiiren oikeaa nappia painetaan Ikkunan kategoria-komponenttien päällä Kuuntelija-olio poistaa kaikki kategoria-valinnat. MouseListenerin muut neljä metodia paitsi mouseClicked on jätetty tyhjiksi.

    BeethovenKuuntelija-luokka

    Kirjojen rutiininomainen haku ja niiden tylsähkö lisääminen/poistaminen eivät tarjoa riittävästi viihdettä pitääkseen käyttäjän milenkiintoa yllä kovin pitkään alkuihastuksesta eteenäpäin. Niinpä ohjelman avulla on mahdollista kuunnella korkeatasoista musiikkia.

    Hiiren oikea näpäytys valitun teoksen yllä, jonka toString-metodi sisältää sanan Beethoven aiheuttaa Beethovenin kuuluisan Kuutamosonaatin op.27 no2, cis-molli soittamisen miditiedostona. Se on toteutettu niin, että kun hiireno oikeaa nappia painetaan, MouseEvent-luokan getComponent hakee tapahtuman aiheuttaneen komponentin. Instanceof-lauseella tutkitaan, mikäli tapahtuman lähde on List-tyyppinen olio. Jos näin on, selvitetään Listin getSelectedIndex-metodilla, mikä kirja liityy valittuun indeksiin ja katsotaan, sisältääkö sen toString-metodi sanan Beethoven. Vastauksen ollessa kyllä, luodaan uusi sekvenssi Midisystem.getSequence():lla kappaleen tiedostoon. Asetetaan Midisystem.getSequencer-oliolle luotu sekvenssi. Tarkistetaan, soitetaanko tiedostoa jo: jos soitetaan, lopetetaan musiikin toisto, muutoin aloitetaan se. Aloittaminen ja lopettaminen hoituvat start- ja stop-metodeilla.

    MozartKuuntelija

    Täsmälleen samanlainen kuin BeethovenKuuntelijakin, ainoana erona se, että soitettu kappale on kolmas osa "Rondo Alla Turca" Wolfgang Amade Mozartin C-duuri pianosonaatista.

    Käsitekartta projektistani

    5.3 Vaikeudet

    Minulla ei siis ollut kovinkaan laajaa ennaltapohdittua suunnitelmaa projektin kulusta, joten todellisuuden ja utopian vertaaminen toisiinsa ei siltä osin ole mahdollista. Sen sijaan, käytin useaan otteeseen pari tuntia aikaa ennen jonkin tietyn osan koodaamista pohtiakseni eri vaihtoehtoja osan ohjelmoimiseen kynän ja paperin kanssa, Kalakirjaan [1] ja java APIin tukeutuen. Ensimmäinen "suunnittelutuokio" oli graafisen käyttöliittymän miettiminen: millainen ja miten? Visualisointi oli helppoa, olinhan näyttänyt OLO-ryhmälleni jo paljon aikaisemmin Microsoftin Paintilla tehdyn kuvan tulevasta käyttöliittymästäni. Teknisen puolen suunnittelu lähti yllättävän hyvin käyniin. Ei mennyt montaa minuuttia, parikymmentä ehkä, kun olin valmis raskaaseen urakkaan, GridBagLayoutin kanssa painimiseen. Ottelusta tuli jännittävä, välillä toinen pääsi niskan päälle, sitten tilanne tasoittui ja ehkä kääntyi päälaelleen. Lopullista tulosta ei saatu (ellei sitten kilpailun virittämässä yhteiskunnassamme pidä tasapeliä tuloksena), sillä käyttöliittymästä tosiaankin tuli juuri sellainen kuin olin ajatellut, mutta ikkunaa pienennettäessä komponentit asettuivat, ja asettuvat vieläkin, sangen oudolla tavalla.

    Ylivoimaisesti suurimmat ongelmat ja nopeimmat sydämen tykytykset aiheutuivat Ikkuna-luokan etsi-metodin ohjelmoimisesta. Aluksi kaikki meni suhteellisen hyvin. Olin yllättynyt, kuinka vaivattomasti sain useiden sisäkkäisten silmukoiden järjestelmän suunnitelluksi ja vielä yllättyneempi siitä, että sana-taulukoiden alkioiden vertailu toisiinsa näytti toimivan juuri niin kuin piti: oikeat kirjat tulivat näkyville, toistaiseksi summittaisessa järjestyksessä. Olin vakuuttunut, että oikean järjestyksen aikaansaaminen ei veisi kovinkaan paljon aikaa, joten päätin pyhittää loppupäivän Richard Wagnerin tuotannolle. Seuraavana aamuna jatkoin virkistyneenä ja levollisena, iltapäivällä olin uupunut ja hermostunut. Mietin pääni puhki, miten saada ArrayList-tyyppinen lista aakkosjärjestykseen: luin kalakirjasta Comparable-liittymästä ja sen compareTo-metodista ja selailin java APIa. Koodasin hienon, aukottoman algoritmin mutta EI! Mikään ei toiminut. Iteraattori, jollaisen olin tehnyt viisi kertaa aikaisemmin, antoi virheilmoituksen. Kokeilin siis for-silmukkaa: sama virheilmoitus. Epätoivoisena, noin 9-tuntisen työpäivän jälkeen lopetin. Kun jatkoin projektia aamulla, kaikki sujui mutkattomasti. Pyyhin edellisen päivän koodi-rivit pois ja aloitin puhtaalta ruudulta. Löysin Arrays-luokasta metodin sort, joka järjestää taulukon luonnolliseen järjestykseen, String-muuttujat siis aakkosjärjestykseen. Yksi for-silmukka, kolme riviä koodia, joka kopio kirjaListan alkiot taulukkon ja komento Arrays.sort(taulukko). Siinä kaikki, kirjat olivat hyvässä järjestyksessä! Vasta muutaman päivän kuluttua ymmärsin, mitä varten metodi oli tuottanut niin suuria vaikeuksia. En ollut erikseen määritellyt kulmasuluilla, että ArrayList sisältää Kirja-olioita. Luulin, että kulmasulut ovat varmistuskeino välttämättömyyden sijasta.

    Etsi-metodin laskuri, jota ryhdyin ohjelmoimaan vasta aivan loppuvaiheissa, osoittautui niin ikään hankalaksi tehtäväksi. Tunteja tuntien perään yritin ja yritin. Deadline päivänä, sunnuntaina 8.1.2006, luovutin henkisesti. Päätin, että en saa sitä tehtyä eikä se ole maailman loppu. Vielä viimeisen kerran kokeilin uudenlaista ratkaisua ja shokki oli valtaisa, kun ratkaisu toimi. Se oli kuitenkin vasta pieni kokeilu, pienessä osassa metodia, eikä sen vuoksi riittänyt. Adrenaliini sai ruumiistani yliotteen ja ryhdyin kilpajuoksuun aikaa vastaan. Tällä kertaa voittaja saatiin: ehdin tehdä kaikki tarvittavat muutokset metodiin niin, että muutamalla testikerralla ohjelman ajo onnistui täydellisesti. Valitettavasti huolellista debuggausta en ehtinyt tehdä, joten täytyy vain toivoa parasta. Miten laskuri yht’äkkiä, viimeisten tuntien aikana selveni minulle, en tiedä. En vieläkään ymmärrä, mitä eroa aikaisemmissa yrityksissäni oli lopulliseen versioon nähden. En ehkä haluakaan ymmärtää, sillä tämänpäivän nerous tuo enemmän tyydytystä kuin eilisen typeryys.

    Kirjojen lisääminen ja poistaminen suoraan ohjelmasta käsin ilman tarvetta kajota lähdekoodiin oli jo ennen ohjelmoinnin aloittamista yksi keskeinen asia, jonka halusin saavuttaa. Tietovirtaan kirjoittaminen ja tietovirrasta lukeminen eivät kurssin neljännessä harjoitutyössä sujuneet minulta hyvin, joten päätin välttää turhia riskejä ja aloittaa ohjelman tekemisen niin, että teokset lisätään ja poistetaan lähdekoodissa ja myöhemmin, jos aikaa riittää, tehdä vaadittava parannus. Jälkiviisaana päätös oli väärä, sillä osoittautui, että kyse ei ollut lisäyksestä vaan korvaamisesta. Vanha koodi oli pyyhittävä kokonaan pois ja korvattava se täysin uudella ratkaisulla. Aikaa kului niin paljon, että jos olisin aloittanut suoraan tietovirrasta, olisin todennäköisesti ehtinyt ohjelmoimaan joitakin lisäyksiä, jotka nyt jäivät pois.

    Internetistä löytyivät selkeät ohjeet sarjallisestamisesta ja olioiden kirjoittamisesta tiedostoon. Lähdin kuitenkin liikkelle väärällä tavalla. Ajattelin, että voisin säilyttää aikaisemmin ohjelman ”muistiin” lisäämäni teokset koskemattomina ja kirjoittaa tekstitiedostoon ainoastaan uudet, ohjelmaa ajettaessa lisätyt kirjat. Tämä osoittautui hankalaksi: koska etukäteen ei tiedetty, kuinka monta kirjaa lisätään, ei ollut tietoa ObjectOutputStreamin writeObject-metodin kutsujen määrästä. Hetken mietittyäni totesin, että kutsjujen lukumäärällä ei ole merkitystä, mikäli jokaisen kirjan luonnin jälkeen tutkitaan, onko uuden teoksen synnyttäminen vielä mahdollista. En kuitenkaan saanut tietovirtaan kirjoittamiseen tarkoitettuja metodeita toimimaan niin, että ne kirjoittaisivat aina tiedoston loppuun vaan tiedosto ylikirjoitettiin joka kerta kokonaan. Vastaus löytyi kuin löytyikin muutaman tunnin ajatustyön tuloksena: kirjoitetaan koko ArrayList-tyyppinen kirjaLista tiedostoon ja luetaan se aina sieltä uudestaan kun ohjelma käynnistetään tai listaan tehdään muutoksia.

    [1]: Jorma Kyppö ja Mika Vesterholm – Java-ohjelmointi, tunetaan kalakirjana

    5.4 Projekti henkilökohtaisena kokemuksena

    Edellisen osan synkistä tunnelmista on hyvä siirtyä, jo pelkästään vaihtelun vuoksi, hieman positiivisempiin asioihin. Projekti antoi kokonaisvaltaisesti melko hyvän olon. Kurssin aikana opin, että java-ohjelmointi ei ole minua varten. En missään vaiheessa kiinnostunut siitä, eikä ohjelmointi oikein ottanut sujuakseen. Loppityön tumma pilvi varjosti joulua edeltäneitä viikkoja, mutta kun lopulta ryhdyin tekemään sitä, ei olo enää ollut niin kurja. Kurssin harjoitustöiden kaavamaisen ohjeiden noudattamisen, toisen ajatusmaailmaan tunkeutumisen sijasta tuntui mukavalta saada itse miettiä omat ratkaisunsa alusta loppuun. Usko itseensä kasvoi roimasti kun huomasi, että suurin osa ideoista toimi sangen moitteettomasti.

    Vaikka olio-ohjelmointi aiheena ei vieläkään ole kauneinta... kaunista musiikkia korvilleni, uskon kasvaneeni henkisesti (clichéisen naiviltahan tuo kuullostaa mutta kuitenkin) kurssin ja erityisesti projektin aikana. Koskaan ennen en ole joutunut tekemään valtavaa määrää työtä sellaisen asian eteen, joka aiheuttaa inhonväristyksiä selässäni. Yleisesti sanotaan: ”ei niin hyvää, ettekö jotain huonoakin”. Kirjastointi-ohjelmaa tehdessäni opin kääntämään ajatuksen päälaelleen. Mitä groteskeimmassakin on vääjäämättä jotain hyvin kaunista, jotain erityisen esteettistä ja tarpeellista. Esimerkkinä käy matematiikan opiskelu, mikä tuntui usein hauskalta, sillä vertasin sitä javaan.

    Harvoin elämässäni olen kokenut yhtä rauhoittavan tunteen kuin sunnuntaina 8.1.2006 noin kello 22.30, jolloin istuin nojatuolissa, nauttien konjakkia ja mitä hienointa musiikkia, sillä olin kymmenen minuuttia aikaisemmin palauttanut java projektini. Neljän kuukauden uurastamisen palkinto ei ollut yhtä ulsopäin suuntautunut kuin olin ajatellut. En pomppinut sängyllä, en viettänyt railakasta baari-iltaa ystävien seurassa, mutta ilmplisiittisellä tasolla olin onnellisempi tai ainakin rauhoittuneempi kuin pitkään aikaan. Kiitos tuosta tunteesta Studio1!

    5.5 Mitä tekisin toisin

    Tekisi mieli painottaa sunnittelemisen tärkeyttä ohjelmoinnissa, mutta en ole ollenkaan vakuuttunut, että projektini lopputulos loistaisi korkeatasoisuudellaan, mikäli yksityiskohtainen suunnitelma olisi ollut valmis ennen koodaamista. Voi olla, että tapahtuisi päinvastainen: valtava määrä aikaa kuluisi suunnitelman hiomiseen, huonon suunnitelman hiomiseen.

    Googlen hyödyntämisen sitä vastoin aloittaisin paljon aikaisemmassa vaiheessa. Kun en millään saanut kirjojani aakkosjärjestykseen, kirjoitin googlen hauksi ”sort alphabetically + java”, löysin keskustelupalstalta vinkin Arrays-luokan sort-metodin käytöstä eikä kulunut montaakaan minuuttia kun ongelma oli ratkaistu. Tietovirran soveltamiseen olioiden sarjallistamisessa internet ja erityisesti google antoivat myös paljon apua. Opin käyttämään writeObject- ja readObject-metodeita, joita ilman projektini ei olisi kovinkaan kummoinen. Midi-tiedostojen soittamiseen ei kalakirja apua tarjoa, java API on sekava ja java tutorial mahdoton ymmärtää. Oikeat hakusanat googleen niin kyllä apu löytyy!

    5.6 Yhteenveto

    Aloittaessani java-projektini tekemisen en ollut koskaan aikaisemmin toiminut ohjelmoinnin kolmijaon diktaattorina: suunnitellut, toimeenpannut ja debugannut koknaista ohjelmaa alusta loppuun. Hermostuneisuutta ja uskonpuutetta ilmeni ennen työhön ryhtymistä, mutta hyvin pian, jo ensimmäistä luokkaa koodatessani jännitys katosi ja muuttui toivoksi. Yhteensä noin sata tuntia (suunnittelemista 15-, käyttöliittymän ja Kirja-luokan ohjelmoimista 15-, kuuntelijoita 8-, haku- ja järjestysalgoritmeja 25-, tietovirran hallitsemista 15- ja muuta 20-tuntia, mm Ikkuna- ja Lisääkirja- luokkien täydennystä) vaatinut projekti ei toivosta huolimatta sujunut ongelmitta. Erityisesti hakualgoritmi ja olioiden käsittely tietovirrasta käsin tuottivat monia ylimääräisiä tunteja päätteen äärellä, mitkä olisin kernaasti viettänyt muualla.

    Ikkuna-luokalla on ihjelmassani tärkein asema. Siinä on määritelty sekä keskeinen etsi-metodi, että koko ohjelman pääkäyttöliittymä. Se sisältää vaadittavan informaation kirjojen lukemiseen tiedostosta ja on samalla pääohjelmaluokka, eli ohjelma ajetaan sen avulla. Koska Kirjastointi perustuu kirjojen tallentamiseen, on seuraavaksi tärkein se luokka, jossa kirjat määritellään. Kirja-luokalla on attribuutteina kaikki tarvittavat ominaisuudet uuden teoksen luomiseksi, mikä yleensä tapahtuu Lisääkirja-ikkunan avulla. Valoa harmaaseen arkeen tuotetaan yhteistyössä kuuntelijoiden kanssa, jotka mahdollistavat virkistävän hetken joko Ludwig Van Beethovenin tai Wolfang Amadé Mozartin kanssa.

    Vaikka ohjelmointityöstä oli todella suuri vaiva ja se asettui ikävällä tavalla päällekkäin joululoman kanssa, jäi puurtamisesta paljon hyviä muistoja. Kun on aikansa taistellut epäonnistuneen koodin kanssa ja saanut sen vihdoin viimein toimimaan, tietää mitä hyvän olon tunne on. Kevään tuodessa uudenlaiset kurssit (ainakin filosofiaa, estetiikkaa, matematiikkaa, julkaisutekniikkaa, työpsykologiaa...) mukanaan on hieno pysähtyä hetkeksi ja katsella taaksepäin mielessään rauhoittavat sanat: ”se on menneisyyttä!”.

    5.7 Ohjelmakoodi

    Päästäksesi selailemaan projektini lähdekoodia, klikkaa tästä