Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

8.5.2 Funktiot ja parametrit

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)

1.
ohjeet();- parametriton aliohjelma
2.
mittakaava_muunnos(matka_mm); - funktio, joka palauttaa tuloksen nimessään
3.
tulosta_matka(matka_km); - aliohjelma, jolle vain viedään arvo, mutta mitään arvoa ei palauteta

Valmis ohjelma, jossa myös aliohjelmat on esitelty, näyttäisi seuraavalta (rivien numerointi on myöhemmin esitettävää pöytätestiä varten):

java-muut\Matka_a3.java - erilaisia funktioita

	/**
	 * 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!


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys