Voisimme jatkaa pääohjelman selkeyttämistä. Tavoite voisi olla aluksi vaikkapa kirjoittaa pääohjelma muotoon:
ohjeet(); matka_mm = Syotto.kysy_int("Anna matka millimetreinä",0); matka_km = mittakaava_muunnos(matka_mm); tulosta_matka(matka_km);
Tällainen pääohjelma tuskin tarvitsisi paljoakaan kommentteja.
Edellä on käytetty kolmen eri tyypin aliohjelmia (funktioita)
Valmis ohjelma, jossa myös aliohjelmat on esitelty, näyttäisi seuraavalta (rivien numerointi on myöhemmin esitettävää pöytätestiä varten):
/** * Ohjelmalla lasketaan mittakaavamuunnoksia 1:200000 kartalta * @author Vesa Lappalainen * @version 1.0 / 05.01.2003 */ public class Matka_a3 { static final double MITTAKAAVA = 200000.0; static final double MM_KM = 1000.0*1000.0; /** * Tulostaa ohjelman käyttöohjeet */ private static void ohjeet() { System.out.println("Lasken 1:" + MITTAKAAVA + " kartalta millimetreinä mitatun matkan"); System.out.println("kilometreinä luonnossa."); } /** * Muuttaa mm mittakaavan mukaisesti kilometreiksi * @param matka_mm muutettavat millit * @return mittakavan mukaiset kilometrit */ private static double mittakaava_muunnos(int matka_mm) { return matka_mm*MITTAKAAVA/MM_KM; } /** * Tulostaa matkan kilometreinä * @param matka_km tulostettava kilometrimäärä */ private static void tulosta_matka(double matka_km) { System.out.println("Matka on luonnossa " + matka_km + " km."); } /** * Varsinainen pääohjelma matka kysymiseksi ja laskemiseksi * @param args ei käyttöä */ public static void main(String[] args) { int matka_mm; double matka_km; ohjeet(); matka_mm = Syotto.kysy_int("Anna matka millimetreinä",0); matka_km = mittakaava_muunnos(matka_mm); tulosta_matka(matka_km); } }
Edellä olevasta huomataan, että aliohjelmat jotka eivät palauta mitään arvoa nimessään, esitellään void- tyyppisiksi.
mittakaava_muunnos on reaaliluvun palauttava funktio, joten se esitellään double - tyyppiseksi.
Seuraavaksi pöytätestaamme ohjelmamme toiminnan:
|
main
|
mi..muunnos
|
tulosta
|
|
||
lause
|
matka_mm
|
matka_km
|
matka_mm
|
tulos
|
matka_km
|
tulostus
|
46
ohjeet()
|
??
|
??
|
|
|
|
|
13-17
System
|
|
|
|
|
|
Lasken
1:200000
|
47
matka_mm=
|
352
|
|
|
|
|
Anna
matka ...
|
48
matka_km
|
|
|
352
|
|
|
|
26
return
|
|
|
|
70.4
|
|
|
48
matka_km
|
|
70.4
|
|
|
|
|
49
tulosta
|
|
|
|
|
70.4
|
|
33-36
System
|
|
|
|
|
|
Matka
on luo..
|
50
}
|
|
|
|
|
|
|
Emme enää käyneet läpi sitä, mitä Syotto.kysy_int tekee, koska se oli testattu erikseen ja sen jälkeen aliohjelma voidaan käsittää "valmiina kieleen kuuluvana käskynä".
Mikäli kukin "omatekoinen" aliohjelmakin olisi testattu erikseen, riittäisi meille pelkkä pääohjelman testi:
|
main
|
|
|
lause
|
matka_mm
|
matka_km
|
tulostus
|
46
ohjeet()
|
??
|
??
|
Lasken
1:200000
|
47
matka_mm=
|
352
|
|
Anna
matka ..
|
48
matka_km
|
|
70.4
|
|
49
tulosta
|
|
|
Matka
on luo..
|
50
}
|
|
|
|
Tämä on testaustapa, johon tulisi pyrkiä. Isossa ohjelmassa ei ole enää mitään järkeä testata sitä jokainen aliohjelma kerrallaan. Koodiin liitettyjen aliohjelmien tulee olla testattuja kukin erillisinä ja lopullinen testi on vain viimeisimmän mallin mukainen!