Ero sivun ”Aliohjelma” versioiden välillä

Wikipediasta
Siirry navigaatioon Siirry hakuun
[katsottu versio][katsottu versio]
Poistettu sisältö Lisätty sisältö
Ipr1 (keskustelu | muokkaukset)
Ei muokkausyhteenvetoa
Ipr1 (keskustelu | muokkaukset)
pEi muokkausyhteenvetoa
Rivi 117: Rivi 117:
== Katso myös ==
== Katso myös ==
* [[Virtuaalimetodi]]
* [[Virtuaalimetodi]]

== Lähteet ==
{{Viitteet}}


[[Luokka:Ohjelmointi]]
[[Luokka:Ohjelmointi]]

Versio 27. maaliskuuta 2018 kello 16.33

Aliohjelma (kutsutaan eri yhteyksissä myös termeillä proseduuri, funktio, metodi tai rutiini) on ohjelmoinnissa itsenäinen ohjelman osa, joka suorittaa tietyn toiminnon ja jota voidaan kutsua eri puolilta pääohjelmaa tai muista aliohjelmista. Aliohjelman suorituksen jälkeen ohjelman suoritus jatkuu kutsuvassa ohjelmassa aliohjelmakutsua seuraavasta lauseesta.

Proseduraalisessa ohjelmointikielessä aliohjelmia kutsutaan funktioiksi tai proseduureiksi. Olio-ohjelmoinnissa olion funktioita nimitetään jäsenfunktioiksi tai metodeiksi.

Ohjelmoinnissa esiintyy usein tilanne, että samanlaista toimintoa tarvitaan ohjelman useassa eri kohdassa. Kirjoittamalla toiminto aliohjelmaksi voidaan se suorittaa useasta eri kohdasta. Näin säästetään työtä. Jos sama toiminto kirjoitettaisiin ohjelmaan yhä uudelleen, ohjelmakoodi pitenisi ja tulisi epäselväksi ja virheiden mahdollisuus kasvaisi. Mahdolliset korjaukset ohjelmakoodiin pitäisi tehdä useaan paikkaan. Aliohjelmat myös lisäävät ohjelman modulaarisuutta, koska ne mahdollistavat ohjelmakoodin jakamisen pienempiin itsenäisiin osiin ja parantavat siten ohjelmiston luettavuutta, testattavuutta ja ylläpidettävyyttä.

Aliohjelmaa voidaan kutsua useassa kohdassa ohjelmaa. Aliohjelman määrittelyn yhteydessä esitellään joukko aliohjelman parametreja tai argumentteja. Aliohjelmalla voi olla parametrien lisäksi paikallisia muuttujia, jotka näkyvät ja ovat käytettävissä vain aliohjelman alueella (engl. scope). Aliohjelman parametrit voivat olla muuttujia tai viittauksia muuttujiin.

Aliohjelman kutsuun on eräissä suorittimissa tuki käskytasolla: konekielinen käsky tallentaa senhetkisen ohjelmalaskurin arvon pinoon ja hyppää toiseen kohtaan ohjelmaa. Kun aliohjelma päättyy, paluuosoite haetaan pinon päältä. Kaikki kielet eivät tue pinoa: FORTRAN 77 ei tukenut pinoa vaan funktioilla oli oma muistialueensa argumenteille ja datalle.[1]

Tilaa jonne osoite tallennetaan kutsutaan aliohjelman aktivaatiotietueeksi. Siihen tallennetaan lisäksi aliohjelman käyttämät paikalliset muuttujat. Jos aliohjelma kutsuu itseään useaan kertaan, eli toimii rekursiivisesti, aktivaatiotietueita on useampi pinon päällä.

Esimerkki

Esimerkki aliohjelmasta, joka saa parametriksi numeroarvon (int eli integer) nimeltä ika ja joka palauttaa boolean-arvon (true/false) sen mukaan, onko ika alle 18 vai ei.

 public Boolean onkoHenkiloAlaikainen(int ika) {
   if(ika<18) {
       return true;
    } else {
       return false;
    }
 }

Tämän jälkeen aliohjelmaa voitaisiin kutsua esimerkiksi seuraavasti:

 if(onkoHenkiloAlaikainen(12) == true) {
    tulosta "Henkilö on alaikäinen!";
 }

Olio-ohjelmoinnissa eräissä kieli aliohjelman (metodin) eteen kirjoitetaan halutun olion nimi seuraavasti:

 if(henkilo.onkoHenkiloAlaikainen(12) == true) {
    tulosta "Henkilö on alaikäinen!";
 }

Määrittely ja toteutus

Eräät ohjelmointikielet kuten C-kieli erottavat määrittelyn (engl. declaration) ja toteutuksen (engl. definition). Määrittely kertoo miten funktiota kutsutaan ilman tarvetta tietää toteutusta toisessa osassa ohjelmaa.

void swap(int *a, int *b); /* määrittely */

void swap(int *a, int *b) /* toteutus */
{
   int t = *a;
   *a = *b;
   *b = t;
}

Paluuarvo

Yleinen tapa palauttaa aliohjelmasta tietoa on sen paluuarvon avulla. Esimerkiksi aliohjelma voi palauttaa int -tyyppisen kokonaisluvun ja sen arvona numeron 42 seuraavasti:

int anna_luku()
{
    return 42;
}

Oletusarvot

Eräissä kielissä voidaan antaa oletusarvot argumenteille, jolloin kutsuessa ei välttämättä tarvitse antaa arvoa jokaiselle argumentille. Esimerkki, joka antaa kahden muuttujan tulon:

int kertolasku(int a, int b = 1) { return a * b; }

void main()
{
  int tulo;
  tulo = kertolasku(2); /* 2 * 1 = 2*/
  tulo = kertolasku(2, 1); /* 2 * 1 = 2 */
  tulo = kertolasku(2, 2); /* 2 * 2 = 4 */
}

Parametrien välitys

Parametreja voidaan välittää kielestä riippuen kolmella tavalla aliohjelmalle:

  • arvo (call by value)
  • osoitin
  • referenssi

Osoittimen ja referenssin tapauksessa aliohjelma voi palauttaa tietoa annettuihin muuttujiin tai olioihin. Esimerkiksi funktio, joka laskee kaksi arvoa yhteen, palauttaa summan sekä merkitsee muuttujan todeksi mikäli jompikumpi parametri ylittää maksimin.

void summa(int a, int *b, bool &maksimi)
{
    maksimi = false;
    if (a > INT_MAX || *b > INT_MAX)
    {
        maksimi = true;
    }
    *b = a + *b;
}

Parametrien määrä

C-kieli ja sen johdannaiset tukevat muuttuvaa määrää parametreja ellipsis (...) määrittelyllä. Tällöin aliohjelmassa itsessään on oltava tuki muuttujaluettelon käsittelyyn. Tyypillinen tapaus on printf() -funktio, jonka määrittely on muotoa:

int printf(const char *format, ...)

Käyttö:

printf("Hei maailma\n");
printf("Numero: %d\n", 42);

Ylikuormitus ja ylikirjoittaminen

Eräät ohjelmointikielet tukevat ylikuormittamista (vaihtoehtoisia kutsutapoja ja toteutuksia) sekä ylikirjoittamista (ks. virtuaalimetodi). Ylikuormittamisessa samalle aliohjelmalle voi olla rinnakkaisia toteutuksia eri tietotyypeillä kuten neliöjuuren laskentaan:

float sqrt(float val);
double sqrt(double val);

Katso myös

Lähteet

  1. Understanding the Stack cs.umd.edu. Viitattu 29.9.2017. (englanniksi)