Funktion (programmering)

Från Rilpedia

Hoppa till: navigering, sök
Wikipedia_letter_w.pngTexten från svenska WikipediaWikipedialogo_12pt.gif
rpsv.header.diskuteraikon2.gif

Inom programmering är en funktion, även subrutin, procedur, underprogram eller subprogram, en del av ett datorprogram. Funktionen är ett kodblock som kan anropas för exekvering, vanligen genom att skriva funktionsnamn(). En funktion innehåller ett kodblock som teoretiskt sett kan vara oändligt stort. I kodblocket kan även andra funktioner exekveras. Parametrar (även kallade argument) kan skickas till funktionen, ofta med syntaxen funktionsnamn(parameter1,parameter2,...,parameterN).

En funktion kan också returnera ett värde. En funktion som inte returnerar ett värde kallas ibland för void. I vissa programspråk, till exempel Fortran och Pascal, görs en åtskillnad mellan funktioner, som returnerar ett värde, och procedurer, som inte gör det. I andra programspråk, till exempel C och Lisp, görs inte denna åtskillnad. I objektorienterad programmering kallas en funktion som är en del av ett objekt för en metod.

Funktioner används inom strukturerad programmering för att (bland annat):

  • Slippa skriva samma sak flera gånger
  • Göra stora program lätta att överblicka
  • Slippa göra ändringar på flera ställen i ett program

Alternativet är ett program som innehåller en serie instruktioner som återkommer på flera ställen i programmet eller att anropa koden som utför en viss funktion utan att formellt utforma den som en funktion. Det förra kan utföras med hjälp av makron, genom att kopiera koden för hand eller genom att skriva om koden varje gång. Det senare kallas spaghettiprogrammering. Användande av en väldefinierad funktion eller makro är i de allra flesta fall att föredra.

Detta är ett exempel på en funktion i C++:

#include <iostream> //Inkluderingsfil
 
void print() //Deklaration av funktionen
{
    std::cout << "Detta är en funktion\n"; //Skriver ut text på skärmen
}
 
int main() //Huvudprogram
{
    print(); //anropa funktionen
    return 0; 
}

Först inkluderas en fil som innehåller kod för att hantera utskrifter på skärmen, därefter definieras funktion som sedan anropas i huvudprogrammet som följer näst i koden.

Innehåll

Metod

En metod är en funktion som antingen tillhör en klass (klassmetod) eller en instans (instansmetod).

Virtuell funktion

En virtuell funktion eller virtuell metod en funktion som definieras i en klass som kan bli omdefinierad (överskriven) av subklasser, även ifall den statiska typen av ett objekt inte är densamma som den faktiska typen.

I en del språk som till exempel C++, C# och Object Pascal måste en klass medlemsfunktioner uttryckligen deklareras som virtuella. I andra språk som Ruby och Java är alla medlemsfunktioner virtuella.

För virtuella funktioner kan hoppadressen för ett anrop inte avgöras under kompileringen eftersom den exakta typen av det objekt som är föremål för anropet inte är känt. Hoppet blir alltså indirekt, vilket ger en liten prestandaförsämring.

Exempel

I nedanstående C++-exempel har vi en klasshierarki baserad på klassen Djur, med en virtuell funktion smaka() som skriver ut hur djuret smakar. I huvudprogrammet skapar instansierar vi ett objekt av vardera klassen och anropar smaka().

 #include <iostream>
 using namespace std;
 
 class Djur
 {
 public:
    virtual void smaka() { cout << "Jag smakar som ett vanligt djur." << endl; }
 };
 
 class Gris : public Djur
 {
 public:
    void smaka() { cout << "Jag smakar som en gris." << endl; }
 };
 
 class Fisk : public Djur
 {
 public:
    void smaka() { cout << "Jag smakar som en fisk." << endl; }
 };
 
 class AnnatDjur : public Djur
 {
 };
 
 int main()
 {
    Djur *djur[4];
    djur[0] = new Djur();
    djur[1] = new Gris();
    djur[2] = new Fisk();
    djur[3] = new AnnatDjur();
 
    for (int i = 0; i < 4; i++)
       djur[i]->smaka();
 
    return 0;
 }

Här är resultatet av en körning:

Jag smakar som ett vanligt djur.
Jag smakar som en gris.
Jag smakar som en fisk.
Jag smakar som ett vanligt djur.

Trots att huvudprogrammet inte vet att djur[1] pekar på ett objekt av typen Gris – variabelns statiska typ är alltjämt Djur – så har uppenbarligen koden i klassen Gris exekverats. Detta hade inte hänt ifall smaka() inte hade markerats som virtuell; då hade i samtliga fall funktionen i basklassen Djur exekverats.


Funktioner i specifika programspråk

Personliga verktyg