.
Mitä tässä luvussa käsitellään?
· ohjelman kommentointi
· ohjelman jakaminen osiin
· .jar-tiedostot (ei vielä kirjoitettu)
· HUOM! Luku on vielä pahasti kesken
"Löysin vuosi sitten kirjoittamani kolmen rivin aliohjelman. Siinä ei ollut yhtään kommenttia. Miten se hoiti tehtävänsä? Mietin asiaa kaksi päivää ja sitten ymmärsin miksi tehtävä oli triviaali eikä tarvinnutkaan kommenttia." (Vapaa käännös verkossa olleesta kirjeestä / vl).
Kommentoimme jatkossa aliohjelmat huolellisesti. Seuraavana on kuvattu eräs tapa. Tietenkin on miljoona muutakin tapaa, mutta ainakin seuraavan tavan ajatus kannattaa pitää mielessä.
Mikäli käytetty editori ei tue automaattisesti kommentointia, kannattaa kirjoittaa aina tarvittavat kommentit vaikka tiedostoihin a.t (alku) ja m.t (metodi) ja opetella käyttämään editorin "lisää tiedosto" toimintoa.
Javassa käytetään JavaDocin mukaista kommentointia:
/** Palauttaa merkkijonon jossa on n kappaletta välilyöntejä
* @param n montako välilyöntiä tarvitaan
* @return jono, jossa on n kpl välilyöntejä
*/
public static String tyhja(int n) {
...
Itse ohjelmakoodi kommentoidaan seuraavasti:
· selviä kielen rakenteita ei saa kommentoida. Ei siis
i=5; // sijoitetaan i on 5 /* TURHA! */
· kuitenkin mikäli lauseella on selvä merkitys algoritmin kannalta, kommentoidaan tämä
i=5; // aloitetaan puolestavälistä
· ryhmitellään lauseet tyhjien rivien avulla loogisiksi kokonaisuuksiksi. Tällaisen kokonaisuuden alkuun voidaan laittaa kommenttirivi, joka kuvaa kaikkien seuraavien lauseiden merkitystä.
· mikäli tekee mieli kommentoida lauseryhmä, kannattaa miettiä voitaisiinko koko ryhmä kirjoittaa aliohjelmaksi. Aliohjelman nimi sitten kuvaisi toimintaa niin hyvin, ettei kommenttia enää tarvittaisikaan. Kuitenkin jos näin suunnitellulle aliohjelmalle tulee iso kasa (liki 10) parametrejä, täytyy asiaa ajatella uudestaan.
· muuttujien nimet valitaan kuvaaviksi. Kuitenkin mitä lokaalimpi muuttujan käyttö, sitä lyhyemmäksi nimi voidaan jättää. i ja j sopivat aivan hyvin silmukkamuuttujien nimiksi ja p yms. osoittimen nimeksi (lokaalisti).
· globaaleja muuttujia vältetään 'kaikin keinoin'
· olioiden ansiosta globaalit muuttujat voidaan yleensä välttää kokonaan!
· vakiotyyliset (alustetaan esittelyn yhteydessä eikä ole tarkoitus ikinä muuttaa) globaalit muuttujat on sallittu sellaisenaan ja niiden nimet kannattaa ehkä kirjoittaa isolla.
· funktioiden paluuarvolle valitaan tietty tyyli, joka pyritään säilyttämään koko ohjelman ajan. Esimerkiksi true = onnistui ja false epäonnistui.
Aiemmin rakensimme joukon merkkijonojen käsittelyssä tarvittavia apuohjelmia. Nämä aliohjelmat voitaisiin kopioida suoraan myös kerhorekisteriimme. Käytännössä näin ei kuitenkaan kannata tehdä, sillä valmiiksi testatut aliohjelmat olisivat mukana vain turhaan lisäämässä käännösaikaa.
Tämän takia aliohjelmat kirjoitetaan omaksi tiedostokseen, vaikkapa nimelle Mjonot.java.
Kirjastossa on mm. wildmat–aliohjelma merkkijonojen samaistamiseksi, kun jonossa saa esiintyä jokerimerkkejä * ja ? (vrt. MS–DOS).
Tehtävä 15.1 wildmat (opettavainen)
Pöytätestaa wildmat–aliohjelma syötöllä Kissa ja *ss*. Ohje: Kirjoita normaalin pöytätestin mukainen taulukko. Koska funktio kutsuu itseään, kannattaa jokaista uutta itseään kutsumista varten kirjoittaa oma uusi sarake uuden kutsukerran muuttujista. Osoittimet s ja m kannattaa säilyttää muodossa, jossa ne näyttävät loppumerkkijonon. Esimerkiksi:
aluksi s = "Kissa"; *s='K'
s++ –> s = "issa" *s='i'
s++ –> s = "ssa" *s='s'
Kirjastojen testaamista varten kannattaa kirjoittaa tiedostoon main-metodi, jossa kutsutaan testiarvoilla kirjaston rutiineja.
Kirjoittamisen ja ylläpidon kannalta voi olla helpompi jakaa ohjelma muutamaan loogiseen osaan. Nyt on valmiiksi kirjoitettuna jäsenrekisterin runko–osa. Tällä rungolla voidaan testata tietorakenteiden toimivuus: Rungossa meillä on käytössä alkeellinen näytölle tulostava aliohjelma.
Suurimmaksi osaksi kannattaa kirjoittaa niin, että kukin luokka muodostaan yhden tiedoston.
On turha toivo, että keksisimme kaikki määritykset ja aliohjelmat kerralla. Tehtävää täytyy hahmotella palanen kerrallaan. Kun jokin homma tuntuu venyvän liian pitkäksi tai monimutkaiseksi, määrittelemme tehtävän useampaan alatoimintoon ja toteutamme nämä toiminnot sitten aliohjelmina/luokkina. Aliohjelmien/metodien parametrit saattavat vielä myöhemmin muuttua, kun huomataan saman tehtävän käyvän sekä tähän että tuohon tehtävään. Esimerkiksi etsiminen ja selailu käy samalla myös korjailuun ja poistoon. Ainoana erona on, että korjaus– ja poistonäppäimet eivät ole pelkässä etsimisessä sallittuja.