Laatinut Jari Juslin, Jari.Juslin@iki.fi

Yleisohje ohjelmointiin

Erilaisia käytännön opettamia tai kavereilta kuultuja ohjeita ja vinkkejä ohjelmointiin.

Tämä sivu täydentyy sitä mukaa kun jotain lisättävää tulee.
----------

0. Yleistä

Yksinkertaisuuden vuoksi esimerkeistä on puuttuvat sekä tavalliset että dokumentti-kommentit.
----------

1. Yleisiä suuntaviivoja koodin kirjoittamiseen

Ohjelman muuntamiseen suunnitelmasta toimivaksi koodiksi on monta tapaa. Selostan tässä pääasiassa omaa tapaani, joka saattaa olla ristiriitainen joidenkin muiden kanssa. Olen kuitenkin sillä tähän asti saanut ohjelmani kirjoitetuksi ja sitä vuosikausia pähkäillyt ja hionut, joten rohkenen tarjota sitä yhdeksi malliksi uudelle koodaajanalulle.

Oletan että alkaessasi kirjoittaa koodia, sinulla on ainakin hahmotelma siitä mitä luokkia ohjelmassasi tulee olemaan, ja miten ne kommunikoivat keskenään. Ellei ole, mars takaisin suunnittelupöydälle. Koodia voi kirjoittaa tietämättä mitä tekee, mutta mahdollisuudet saada jotain valmiiksi heikkenevät kummasti.

1.1. Kirjoita toimivia kokonaisuuksia

Käännä usein. Testaa usein. Mitä pienempi määrä koodia on muuttunut edellisen käännöksen ja testauksen jälkeen, sitä helpompi sinun on etsiä virhettä koodistasi kun sellainen löytyy.

Aloita koodaaminen luokasta, joka joko tuntuu helpolta tai sellaiselta joka käyttää mahdollisimman vähän muita luokkia. On siis tavallaan lehdessä jos piirrettäisiin kutsupuu.

Pyri koodaamaan aina sellaisia osioita, jotka saat kääntäjästä läpi ja testattua toimiviksi. Virheitä tulee aina, ja ne on helpompi etsiä kun koodin edes pitäis toimia sellaisenaan.

Sitä mukaa kun intoa riittää, voit kirjoittaa luurankoja ja niitä osia muista luokista jotka tuntuvat helpolta. Kannattaa kuitenkin koodata luurankoja ja muita luokkia sellaisilta osin, kun ne liittyvät toisiinsa, tällöin saat testattua niiden keskinäistä toimivuutta sitä mukaa.

Luuranko on luokka, johon on kirjoitettu metodien ja konstruktorien määrittelyt, mutta ei toteutusta.

1.2. Testiajuri ei ole huono idea

Kuten varmasti tiedätkin, jokaisessa Java-luokassa voi olla oma main-metodi, jolla se voidaan käynnistää itsenäisesti. Ei ole lainkaan huono idea kirjoittaa sellaisillekin luokille, jotka sitä eivät muuten tarvitse, testiajoa suorittava main-metodi. Tuo testi-main voisi esimerkiksi luoda ilmentymän luokasta ja ajaa sille testiajoja.

Jos kirjoitat ohjelmasi lähes valmiiksi, ja alat vasta sitten testiajaa, huomaat että pienenkin virheen etsimiseen tuosta laajasta massasta menee aikaa, ja ennen pitkää hermot loppuvat.

1.3. Syntaksivirheisiin kannattaa suhtautua varauksella

Syntaksivirheiseet voi jakaa kahteen osaan: Kirjoitus- ja ajatusvirheisiin.

Kirjoitusvirheet, esim. puuttuva aaltosulku tai unohtuneet sulut metodin kutsusta, aiheuttavat usein suuren läjän virheilmoituksia. Esimerkiksi aaltosulun puuttuminen saa yleensä kääntäjän jäsentäjän täysin sekaisin, ja saat läjän täysin käsittämättömiä ja aiheettomia virheilmoituksia.

Aloita käännösvirheiden korjaaminen alkupäästä. Korjaa alusta muutama selkeä virhe ja käännä uudestaan. Usein, jos virheilmoitus viittaa puuttuvaan sulkuun tai johonkin muuhun virheeseen joka sekoittaa kääntäjän, iso osa lopuistakin virheistä katoaa ja voit keskittyä jäljelle jääneisiin.

Ajatusvirheet ovat virheitä, joissa olet ajatellut tai suunnitellut koodin väärin. On onnellista, että Java-kääntäjä huomaa osan näistäkin. Niiden korjaamiseen auttaa vain asian ajatteleminen uusiksi.

2. Virheitä sietävää ohjelmointia

Kaikissa ohjelmissa on virheitä. Normaaleilla ohjelmistonkehityksen resursseilla ei ole mahdollista päästä missään yli tuhannen rivin ohjelmassa täysin virheettömään koodiin. Siksi on hyvä tietää joitakin niksejä joilla voi välttää ohjelman joutumisen käyttökelvottomaan tilaan virheen ilmetessä ja myös ehkä kirjoittaa ohjelmakoodia josta virheiden etsintä on helpompaa.

1.1. Toistolauseiden lopetusehto

Esimerkki 1, älä tee näin:
for (i=0; i != 10; i++) {
  if (ongelmia()) {
    //  Hypätään ongelmakohdan yli
    i++;
    //  Jos i sattui olemaan 9,
    //  sen arvoksi tulee ensi
    //  vertailuun 11, ja jäämme
    //  ikuiseen silmukkaan.
  }
}
Esimerkki 2:
for (i=0; i <= 10; i++) {
  if (ongelmia()) {
    //  Hypätään ongelmakohdan yli
    i++;
  }
}

Toistolauseiden lopetusehto on yksi pieni, mutta joskus harvinaisen merkittävä osa koodia. Jokainen toisto on haara ohjelman suorituksessa, josta voidaan lähteä uudestaan toistettavaan lohkoon tai edetä sen jälkeiseen osaan koodia.

Lopetusehto kannattaa siis valita siten, että vaikka toistettavan lohkon sisällä tapahtuisi virhe, ohjelma ei jää ikuiseen silmukkaan. Toisaalta lopetusehdosta olisi hyvä nähdä nopeallakin silmäyksellä millaisissa tilanteissa se toistoa jatkaa.

Yksi keino parantaa virheellisten arvojen sietokykyä on laittaa lopetusehtoon suurempi- tai pienempi-kuin -vertailuja yhtäläisyyden vertaamisen sijasta. Jos haluat esimerkiksi silmukassa kasvattaa laskuria kunnes se saavuttaa arvon kymmenen, laita lopetusehdoksi (laskuri <= 10). Lopetusehdolla (laskuri == 10) voit "ajaa ohi" ja jäädä ikuiseen silmukkaan, jossa laskuria kasvatetaan kohti ääretöntä.


----------

etusivu - Java-sivu - yleisohje

----------