ホームページ  >  記事  >  バックエンド開発  >  コールバック関数とは何ですか?

コールバック関数とは何ですか?

零下一度
零下一度オリジナル
2017-06-28 16:16:371010ブラウズ

コールバック関数とは何ですか?


この質問に答えるために、少し回り道をしてみましょう。

プログラミングは、システム プログラミングとアプリケーション プログラミングの 2 つのカテゴリに分類されます。いわゆるシステムプログラミングは、簡単に言うとライブラリを書くことであり、アプリケーションプログラミングは、書かれたさまざまなライブラリを使用して、特定の機能を備えたプログラム、つまりアプリケーションを書くことです。システムプログラマは、アプリケーションプログラマが使用するために作成したライブラリ用のいくつかのインターフェイス、つまり API (アプリケーションプログラミングインターフェイス、アプリケーションプログラミングインターフェイス) を残します。したがって、抽象化レイヤー図では、ライブラリはアプリケーションの下にあります。

プログラムの実行中、通常の状況では、アプリケーション プログラムは API を通じてライブラリ内の事前に用意された関数を呼び出すことがよくあります。ただし、一部のライブラリ関数では、ターゲット タスクを完了する適切なタイミングで呼び出すことができるように、最初にアプリケーションに関数を渡す必要があります。渡されて後で呼び出される関数は、コールバック関数と呼ばれます。

たとえば、ホテルはモーニングコールサービスを提供していますが、どのように目覚めるかは旅行者が決定する必要があります。客室に電話したり、ウェイターを呼んでドアをノックさせたり、あまりに眠くて仕事が遅れるのが怖い場合は頭に水をかけてもらうこともできます。ここで、「ウェイクアップ」動作はホテルが提供するものであり、ライブラリ関数に相当するが、ウェイクアップ方法は乗客が決定してホテルに伝えるものであり、コールバック関数である。乗客がホテルに起こし方を伝えるアクション、つまりコールバック関数をライブラリ関数に渡すアクションが呼び出され、コールバック関数が登録されます。以下の図に示すように (画像出典: Wikipedia):


ご覧のとおり、コールバック関数は通常、アプリケーションと同じ抽象化層にあります (どのような種類のコールバック関数が渡されるかはアプリケーション レベルで決定されるため) 。コールバックは、上位層が下位層を呼び出し、さらに下位層が上位層を呼び出す処理となる。 (私はそう思います) これはコールバックの最も初期のアプリケーションであり、その名前が付けられた理由です。

コールバック メカニズムの利点

上記の例からわかるように、コールバック メカニズムは優れた柔軟性を提供します。これ以降、図内のライブラリ関数を中間関数と呼ぶことに注意してください。これは、コールバックがアプリケーションとライブラリの間でのみ使用されるわけではないためです。上記の状況と同様の柔軟性が必要な場合はいつでも、コールバックを利用できます。

この柔軟性はどのようにして実現されているのでしょうか?一見すると、コールバックは単なる関数間の呼び出しのように見えますが、よく考えてみると、この 2 つの重要な違いが見つかります。コールバックでは、コールバック関数を中間関数に渡すために特定のメソッドを使用します。パラメータ。コールバック関数が渡される前は、中間関数が不完全であることがわかります。つまり、プログラムは実行時にさまざまなコールバック関数を登録することで、中間関数の動作を決定および変更できます。これは、単純な関数呼び出しよりもはるかに柔軟です。 Python で書かれた次の簡単なコールバックの例を見てください:

`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()


`callback_demp.py` を実行すると、出力は次のようになります:

3
5
9


上記のコードでは、異なるコールバック関数が `getOddNumber` に渡されており、そのパフォーマンスも異なります。これがコールバック メカニズムの利点です。上記の 3 番目のコールバック関数は匿名関数であることに注意してください。

見落とされやすいサードパーティ

上記の議論から、中間関数とコールバック関数がコールバックの 2 つの必要な部分であることがわかりますが、コールバックの 3 番目に重要な部分、つまり呼び出し元は無視されることがよくあります。中間関数。ほとんどの場合、この呼び出し元はプログラムの main 関数と同等と見なすことができますが、違いを表現するために、ここではこれを開始関数と呼びます (上記のコードのコメントに示されているように)。

私がこの第三者機関を特に強調する理由は、オンラインで関連する記事を読んだときに、多くの人が単に 2 人の個人の間で行われる電話のやり取りとして理解しているという印象を受けたからです。たとえば、多くの中国語の Web ページで「コールバック」について説明するとき、「電話をかけてくれたら、折り返し電話します。」という文が記載されていますが、この文の英語のソースは見つかりませんでした。私個人としては、多くの人が初期関数とコールバック関数を 1 つとして考えているのではないかと考えています。理由はおそらく 2 つあります。1 つ目は、「コールバック」という名前が誤解を招く可能性があることです。2 つ目は、中間関数にどのようなコールバック関数が渡されるのかということです。開始関数で決定されます。実際、コールバックは「あなたと私」の間の対話ではなく、ABC の三者連携です。この明確な概念により、独自のコードにコールバックを実装するときに混乱やエラーが発生する可能性が低くなります。

さらに、実際には、ブロック コールバックと遅延コールバックの 2 種類のコールバックがあります。 2 つの違いは、ブロック コールバックでは、初期関数が戻る前にコールバック関数が発生する必要があるのに対し、遅延コールバックでは、初期関数が戻った後にコールバック関数を呼び出すことができることです。これら 2 つの確率についてここで詳しく説明するのは、開始関数を強調することの重要性を説明するためです。インターネット上の多くの記事では、これら 2 つの概念について言及する際、ブロッキング コールバックはメインの呼び出し関数が戻る前に発生すると一般的に述べているだけで、メインの呼び出し関数が開始関数なのか中間関数なのかが明確になっていないため、必然的に人々が混乱します。ここでは特別な説明をします。この記事の例はコールバックをブロックしていることにも注意してください。遅延コールバックには通常、マルチスレッドが関係します。私はまだ完全には理解していないので、ここでは詳しく説明しません。

ここで要約しましょう。通常、システム内のさまざまな API 関数を使用する関数を作成し、必要に応じて作成した関数を呼び出します。ここでは状況が逆転し、最初にシステムを呼び出さない関数を作成します。 API を作成し、システム API を介して既に作成された関数を呼び出します。これにより、作成した関数がコールバック関数になります。


以上がコールバック関数とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。