Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist eine Callback-Funktion?

Was ist eine Callback-Funktion?

零下一度
零下一度Original
2017-06-28 16:16:371011Durchsuche

Was ist eine Callback-Funktion?


Machen wir einen kleinen Umweg, um diese Frage zu beantworten.

Programmierung ist in zwei Kategorien unterteilt: Systemprogrammierung und Anwendungsprogrammierung. Die sogenannte Systemprogrammierung besteht, vereinfacht gesagt, darin, Bibliotheken zu schreiben, und die Anwendungsprogrammierung besteht darin, verschiedene geschriebene Bibliotheken zu verwenden, um Programme mit bestimmten Funktionen, also Anwendungen, zu schreiben. Systemprogrammierer verlassen einige Schnittstellen, nämlich API (Application Programming Interface, Anwendungsprogrammierschnittstelle), für die Bibliotheken, die sie zur Verwendung durch Anwendungsprogrammierer schreiben. Im Abstraktionsschichtdiagramm befindet sich die Bibliothek also unterhalb der Anwendung.

Wenn das Programm ausgeführt wird, ruft das Anwendungsprogramm unter normalen Umständen häufig vorbereitete Funktionen in der Bibliothek über die API auf. Bei einigen Bibliotheksfunktionen muss die Anwendung jedoch zuerst eine Funktion übergeben, damit sie zum richtigen Zeitpunkt aufgerufen werden kann, um die Zielaufgabe abzuschließen. Die Funktion, die übergeben und später aufgerufen wird, wird als Rückruffunktion bezeichnet.

Zum Beispiel bietet ein Hotel einen Weckdienst an, verlangt aber von den Gästen, selbst zu entscheiden, wie sie geweckt werden. Sie können im Gästezimmer anrufen, einen Kellner schicken, der an die Tür klopft, oder Sie können darum bitten, dass Ihnen ein Becken mit Wasser über den Kopf gegossen wird, wenn Sie aus Angst vor Verzögerungen schlafen. Hier wird das „Weckverhalten“ vom Hotel bereitgestellt, was einer Bibliotheksfunktion entspricht, die Weckmethode wird jedoch vom Passagier festgelegt und dem Hotel mitgeteilt, was einer Rückruffunktion entspricht. Die Aktion des Passagiers, dem Hotel mitzuteilen, wie er geweckt werden soll, dh die Aktion der Übergabe der Rückruffunktion an die Bibliotheksfunktion, wird zum Registrieren einer Rückruffunktion aufgerufen. Wie in der Abbildung unten gezeigt (Bildquelle: Wikipedia):


Wie Sie sehen können, befindet sich die Rückruffunktion normalerweise auf derselben Abstraktionsebene wie die Anwendung (da welche Art von Rückruffunktion übergeben wird wird auf Anwendungsebene festgelegt). Der Rückruf wird zu einem Prozess, bei dem die höhere Schicht die untere Schicht aufruft und die untere Schicht dann die höhere Schicht aufruft. (Ich denke) Dies sollte die früheste Anwendung von Rückrufen sein und der Grund, warum sie so benannt werden.

Vorteile des Callback-Mechanismus

Wie aus dem obigen Beispiel ersichtlich ist, bietet der Callback-Mechanismus große Flexibilität. Bitte beachten Sie, dass wir die Bibliotheksfunktionen im Diagramm von nun an als Zwischenfunktionen bezeichnen. Dies liegt daran, dass Callbacks nicht nur zwischen der Anwendung und der Bibliothek verwendet werden. Wann immer Sie eine ähnliche Flexibilität wie oben wünschen, können Sie Rückrufe nutzen.

Wie wird diese Flexibilität erreicht? Auf den ersten Blick scheinen Callbacks nur Aufrufe zwischen Funktionen zu sein, aber wenn Sie genau darüber nachdenken, können Sie einen wesentlichen Unterschied zwischen den beiden erkennen: Bei Callbacks verwenden wir eine bestimmte Methode, um die Callback-Funktion wie eine an die Zwischenfunktion zu übergeben Parameter. Es versteht sich, dass die Zwischenfunktion unvollständig ist, bevor eine Rückruffunktion übergeben wird. Mit anderen Worten: Das Programm kann das Verhalten von Zwischenfunktionen entscheiden und ändern, indem es zur Laufzeit verschiedene Rückruffunktionen registriert. Dies ist viel flexibler als einfache Funktionsaufrufe. Schauen Sie sich bitte das folgende einfache Beispiel eines in Python geschriebenen Rückrufs an:

`even.py`
#回调函数1#生成一个2k形式的偶数def double(x):    return x * 2    #回调函数2#生成一个4k形式的偶数def quadruple(x):    return x * 4
`callback_demo.py`
from even import *#中间函数#接受一个生成偶数的函数作为参数#返回一个奇数def getOddNumber(k, getEvenNumber):    return 1 + getEvenNumber(k)    #起始函数,这里是程序的主函数def main():        k = 1    #当需要生成一个2k+1形式的奇数时    i = getOddNumber(k, double)    print(i)    #当需要一个4k+1形式的奇数时    i = getOddNumber(k, quadruple)    print(i)    #当需要一个8k+1形式的奇数时    i = getOddNumber(k, lambda x: x * 8)    print(i)    if __name__ == "__main__":    main()


Führen Sie „callback_demp.py“ aus. Die Ausgabe lautet wie folgt:

3
5
9


Im obigen Code werden verschiedene Rückruffunktionen an „getOddNumber“ übergeben, und auch ihre Leistungen sind unterschiedlich. Dies ist der Vorteil des Rückrufmechanismus. Es ist erwähnenswert, dass die dritte Rückruffunktion oben eine anonyme Funktion ist.

Der Dritte, der leicht ignoriert wird

Aus der obigen Diskussion können wir ersehen, dass die Zwischenfunktion und die Rückruffunktion zwei notwendige Teile des Rückrufs sind, aber die Leute ignorieren oft den dritten wichtigen Teil Rolle im Rückruf, der der Aufrufer der Zwischenfunktion ist. In den meisten Fällen kann dieser Aufrufer mit der Hauptfunktion des Programms gleichgesetzt werden, aber um den Unterschied auszudrücken, nenne ich ihn hier die Startfunktion (wie in den Kommentaren im Code oben gezeigt).

Der Grund, warum ich diesen Dritten besonders hervorhebe, ist, dass ich beim Lesen relevanter Artikel im Internet den Eindruck gewonnen habe, dass viele Menschen es einfach als ein Hin- und Hergespräch zwischen zwei Personen verstehen. Wenn beispielsweise viele chinesische Webseiten „Rückruf“ erklären, erwähnen sie diesen Satz: „Wenn Sie mich anrufen, rufe ich Sie zurück.“ Ich habe die englische Quelle dieses Satzes nicht gefunden. Ich persönlich vermute, dass viele Leute die Anfangsfunktion und die Rückruffunktion als eins betrachten. Erstens kann der Name „Rückruf“ irreführend sein. Zweitens: Welche Art von Rückruffunktion wird an die Zwischenfunktion übergeben? in der Startfunktion bestimmt. Tatsächlich handelt es sich bei dem Rückruf nicht um die Interaktion zwischen „Du und mir“, sondern um die Drei-Parteien-Verbindung von ABC. Mit diesem klaren Konzept ist es weniger wahrscheinlich, dass es bei der Implementierung von Rückrufen in Ihrem eigenen Code zu Verwirrung und Fehlern kommt.

Darüber hinaus gibt es tatsächlich zwei Arten von Rückrufen: blockierende Rückrufe und verzögerte Rückrufe. Der Unterschied zwischen beiden besteht darin, dass bei blockierenden Rückrufen die Rückruffunktion ausgeführt werden muss, bevor die ursprüngliche Funktion zurückkehrt, während bei verzögerten Rückrufen die Rückruffunktion möglicherweise nach der Rückkehr der ursprünglichen Funktion aufgerufen wird. Wir werden diese beiden Wahrscheinlichkeiten hier nicht näher diskutieren. Der Grund, warum sie erwähnt werden, besteht darin, die Bedeutung der Betonung der Startfunktion zu veranschaulichen. In vielen Artikeln im Internet wird bei der Erwähnung dieser beiden Konzepte im Allgemeinen nur gesagt, dass der blockierende Rückruf erfolgt, bevor die Hauptaufruffunktion zurückkehrt, es wird jedoch nicht klargestellt, ob die Hauptaufruffunktion die Startfunktion oder die Zwischenfunktion ist, was die Leute unweigerlich verwirrt. also Hier ist eine besondere Erklärung. Beachten Sie außerdem, dass es sich bei den Beispielen in diesem Artikel um blockierende Rückrufe handelt. Bei verzögerten Rückrufen handelt es sich normalerweise um Multithreading. Ich habe es noch nicht vollständig verstanden, daher werde ich hier nicht mehr sagen.

Lassen Sie mich hier zusammenfassen. Normalerweise schreiben wir eine Funktion, die verschiedene API-Funktionen im System verwendet, und rufen dann bei Bedarf die Funktion auf, die wir geschrieben haben. Jetzt ist die Situation umgekehrt Rufen Sie nicht die System-API auf, sondern rufen Sie dann die bereits geschriebene Funktion über die System-API auf, sodass die von uns geschriebene Funktion zur Rückruffunktion wird.


Das obige ist der detaillierte Inhalt vonWas ist eine Callback-Funktion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn