10

コールバック関数はいつ使用しますか? 私はそれらがどのように機能するかを知っており、それらが使用されているのを見てきました。

C の世界の例はlibcurl、データ取得のためにコールバックに依存するものです。

反対の例は OpenSSL です。私が使用した場合は、out パラメータを使用します。

ret = somefunc(&target_value);
if(ret != 0)
    //error case

いつどれを使うか迷っています。コールバックは非同期のものにのみ役立ちますか? 現在、アプリケーションの API を設計中ですが、コールバックを使用するか、単に out パラメータを使用するかを考えています。内部的には、libcurl と OpenSSL をビルドのメイン ライブラリとして使用し、「返される」パラメータは OpenSSL データ型です。

戻るだけに比べて、コールバックの利点は見当たりません。これは、単にデータを返すのではなく、何らかの方法でデータを処理したい場合にのみ役立ちますか? しかし、返されたデータを処理できました。違いはどこにありますか?

4

4 に答える 4

8

最も単純なケースでは、2 つのアプローチは同等です。ただし、コールバックを複数回呼び出して、到着したデータを処理できる場合は、コールバック アプローチの方が柔軟性が高く、この柔軟性は非同期のユース ケースに限定されません。

libcurl はその良い例です。新しく到着したすべてのデータに対してコールバックを指定できる API を提供します。あなたが提示したように、代わりに data を返すだけです。しかし、それを返します—どのように? データがメモリ バッファーに収集されると、バッファーが非常に大きくなる可能性があり、呼び出し元はそれをダウンローダーなどのファイルに保存したいだけである可能性があります。データがファイルに保存され、その名前が呼び出し元に返される場合、呼び出し元が実際にデータをメモリに保存したいだけである場合、Web ブラウザーが画像を表示するように、不要な IO が発生する可能性があります。チェックサムを計算するなど、呼び出し元がデータをストリーミングしながら処理する必要があり、データを保存する必要がまったくない場合、どちらのアプローチも最適ではありません。

コールバック アプローチにより、呼び出し元は、データの個々のチャンクをどのように処理するか、またはより大きな全体にアセンブルするかを決定できます。

于 2013-04-14T21:58:01.750 に答える
4

コールバックは、非同期通知に役立ちます。API にコールバックを登録すると、イベントが発生したときにそのコールバックが実行されることが期待されます。同じように、データ処理パイプラインの中間ステップとして使用できます (オーディオ/レコーディング業界に精通している場合は「挿入」に似ています)。

要約すると、これらは私が遭遇した、および/またはコールバックスキームを実装した2つの主要なパラダイムです。

  1. データが到着したとき、または何らかのイベントが発生したときにお知らせします。必要に応じて使用してください。
  2. データを処理する前に、一部のデータを変更する機会を与えます。
于 2013-04-14T21:56:45.040 に答える
1

値をすぐに返すことができる場合は、はい、コールバックは必要ありません。ご想像のとおり、コールバックは、何らかの理由で値をすぐに返すことができない状況で役立ちます(おそらく、非同期で実行する方が適切な長時間実行される操作です)。

于 2013-04-14T21:55:14.043 に答える