Tilbakeringingsfunksjon

En tilbakeringingsfunksjon ( engelsk tilbakeringing ) referert til i informatikk en funksjon som en annen funksjon, vanligvis et ferdig bibliotek eller operativsystem, fungerer som en parameter som er sendt og kalles av dette under definerte forhold med definerte argumenter. Denne fremgangsmåten følger utformingen mønster av den inversjon av kontroll .

I de fleste tilfeller tillater den prefabrikerte funksjonen overføring av en såkalt brukerparameter lpParameter, som videreføres av den (sammen med andre argumenter) til tilbakeringingsfunksjonen, slik at sistnevnte både kan få tilgang til og lagre data i sammenheng med den opprinnelige innringeren.

Tilbakeringing i samme prosess

ProgramExecCallbackSimple-de.png

Bildet viser en samtale til en rutine i en annen sammenheng (operativsystemanrop, annen programvaremodul). En henvisning til tilbakeringingsrutinen sendes til denne samtalen. Den kalte rutinen kan deretter ringe tilbakeringingsrutinen i løpet av løpet. Tilbakekallingsrutinen lagrer til slutt data som kan brukes i den videre programsekvensen etter at den opprinnelige samtalen har kommet tilbake. I engelsk litteratur refereres dette skjemaet til å blokkere tilbakeringing eller synkron tilbakeringing .

Fordelen med denne teknologien er at tilgangen til dataene er formulert i sin egen kontekst og / eller hvilken som helst programrelatert behandling kan finne sted i tilbakeringingen: Parametrene og ringetiden bestemmes i den andre programvaremodulen, bestemmelsen av hva som utføres i tilbakeringingen er opp til egen programvaremodul.

Dette gjør det mulig å definere funksjoner generelt og atferd kan bestemmes nøyaktig når funksjonen blir ringt opp ved å spesifisere tilbakeringingsfunksjonen. En tilbakeringingsfunksjon blir ofte ikke gitt noe navn i det hele tatt, men defineres som en anonym funksjon direkte når den kalles (se også lambda-beregning ). En løs kobling mellom individuelle komponenter kan oppnås ved hjelp av tilbakeringingsfunksjoner .

Tilbakeringing fra en annen tråd

Tilbakeringing med trådkommunikasjon.png

Hvis en tilbakeringingsfunksjon er spesifisert, er det opp til den ringte funksjonen å bestemme når den skal tilbakekallingen ( inversjon av kontroll ). Det er mulig at tilbakeringingen kommer fra en annen tråd på et senere tidspunkt . Bildet motsatt viser prinsippet. Tilordningen av tilbakeringingsrutinen til sin egen kontekst er den samme som i ovenstående ordning. Siden tilbakeringing kan skje i en annen tråd, må også betingelsene for datakonsistens ( mutex ) overholdes. I engelsk litteratur kalles dette skjemaet utsatt tilbakeringing eller asynkron tilbakeringing .

Et eksempel på dette er samtalen SetTimer(hWnd, ident, milliseconds, callbackRoutine)i Windows API. Samtalen SetTimer(...)er en kort operativsystemanrop som bare initialiserer timeren i operativsystemet. Det callbackRoutinekalles bare når tiden er utløpt. Dette skjer i en tråd i operativsystemet uavhengig av rekkefølgen etter anrop SetTimer(...). Enhver kode kan utføres i tilbakeringingsrutinen som skal oppgis. Det skal imidlertid bemerkes at tilbakeringingsrutinen bare kan være kort og ikke blokkerer. Ellers er det en risiko for at hele operativsystemet eller i det minste den nåværende prosessen blokkeres. Til slutt bør tilbakeringingsrutinen bare lagre data og ikke i seg selv inneholde komplekse handlinger. Spesielt kan en hendelsesinstans genereres og lagres for hendelsesorientert programmering , som styrer videre prosesser.

Permanent tilbakeringingsrutine

En tilbakeringingsrutine kan bare gjelde for en samtale om gangen. Tilbakekallingsrutinen kan også ringes flere ganger i forhold til samtalen til den tilknyttede handlingen er avsluttet, dvs. i en begrenset periode.

Men også den permanente tildelingen av en rutine blir noen ganger referert til som en tilbakeringingsrutine , for eksempel ThreadProc tilbakeringingsfunksjon: Når du oppretter en tråd via Windows API, angis trådfunksjonen som en tilbakeringingsfunksjon .

Tildelingen av en hendelseshåndteringsrutine , for eksempel til et HTML-element <button onclick="function()" />eller til en widget innen programmering av grafiske brukergrensesnitt, følger samme skjema, men i denne sammenheng blir det vanligvis ikke referert til som tilbakeringing , men snarere som hendelsesbehandler .

Enkel tilbakeringingsfunksjon eller objektorientert tilbakeringing

De såkalte tilbakeringingsfunksjonene i Windows API er hver enkel C-funksjon. Windows API leveres som et C-grensesnitt. I fora er det ofte spørsmål om muligheten for å tilordne C ++ - funksjoner. Det er her nødvendig å kapsle inn C ++ -anropet i en C-funksjon som kjenner datainstansen.

Det er forskjellig i objektorienterte tilnærminger til en tilbakekalling. I stedet for å spesifisere en funksjonspeker, overføres referansen til et dataobjekt for tilbakeringingen. Dataobjektet må implementere et grensesnitt beregnet for tilbakeringing . Grensesnittet inneholder da flere mulige tilbakeringingsfunksjoner i tabellen over virtuelle metoder i datainstansen og kjenner samtidig dataene som er nødvendige for å utføre tilbakeringingen. Grunnskjemaet er nøyaktig det samme som vist i ordningene ovenfor.

Eksempler

Vi ønsker å apply_toskrive en funksjon som bruker en hvilken som helst annen funksjon i en liste over verdier og returnerer en liste med resultatene. En implementering i pseudokode :

function apply_to (rückruffunktion, werte):
    var ergebnis; // Liste für die Ergebnisse
    foreach w in werte do // für alle Werte ...
        e = rückruffunktion (w); // rufe die Rückruffunktion ...
        ergebnis[] = e;   // und hänge das Resultat an die Ergebnisliste an.
    end;
    return ergebnis;
end apply_to;

Denne funksjonen kan nå brukes som følger:

function verdoppeln (wert): // dies ist eine Rückruffunktion
    return wert*2;
end verdoppeln;
function quadrat (wert): // dies ist eine andere Rückruffunktion
    return wert*wert;
end quadrat;
// Anwenden der Funktionen auf eine Liste:
werte = (1, 2, 3, 4);
doppelte_Werte   = apply_to(verdoppeln, werte); //ergibt (2, 4, 6, 8)
quadrierte_Werte = apply_to(quadrat, werte);    //ergibt (1, 4, 9, 16)

Eller, kortere, i lambda-notasjon :

werte = (1, 2, 3, 4);
doppelte_Werte   = apply_to(lambda x: x*2, werte); //ergibt (2, 4, 6, 8)
quadrierte_Werte = apply_to(lambda x: x*x, werte); //ergibt (1, 4, 9, 16)

JavaScript

Callbacks brukes til å implementere programmeringsspråk som JavaScript , inkludert støtte for JavaScript-funksjoner som tilbakeringing via js-ctypes og i komponenter som addEventListener.

I det følgende eksemplet defineres først en funksjonsberegning med en parameter beregnet for tilbakeringing : tilbakeringingsfunksjon . Deretter defineres en funksjon som kan brukes som tilbakeringing til beregningen: beregneSum . Andre funksjoner kan brukes til tilbakeringingsfunksjonen , f.eks. B. beregne produkt . I dette eksemplet kalles compute (...) to ganger, en gang med computeSum som tilbakeringing og en gang med computeProduct . Funksjonene returnerer summen eller produktet av, og advarselen viser dem på skjermen.

function berechne(zahl1, zahl2, rueckruffunktion)
{
    return rueckruffunktion(zahl1, zahl2);
}

function berechneSumme(zahl1, zahl2)
{
    return zahl1 + zahl2;
}

function berechneProdukt(zahl1, zahl2)
{
    return zahl1 * zahl2;
}

// Gibt 20, die Summe von 5 and 15, aus
alert(berechne(5, 15, berechneSumme));

// Gibt 75, das Produkt von 5 und 15, aus
alert(berechne(5, 15, berechneProdukt));

C #

public class Hauptklasse 
{
    static void Main(string[] args)
    {
        Nebenklasse objekt = new Nebenklasse();
        
        // Ruft die Methode von Nebenklasse mit Rückruffunktion als Parameter auf
        objekt.Aufrufmethode(Rueckruffunktion);
    }
    
    // Diese Rückruffunktion gibt den im Rückruf angegebenen Text aus
    static void Rueckruffunktion(string text)
    {
        Console.WriteLine("Der Rückruf lautet:" + text);
    }
}

public class Nebenklasse
{
    // Diese Methode hat eine andere Methode als Parameter und ruft diese auf
    public void Aufrufmethode(Action<string> rueckruf)
    {
        // Ruft die Methode Rueckruffunktion in Hauptklasse mit der der angegebenen Textnachricht aus
        rueckruf("Ich komme sofort zurück.");
    }
}

Se også

weblenker

Individuelle bevis

  1. msdn.microsoft ...