2013-04-14 8 views
7

いつコールバック関数を使用しますか?私は彼らの仕事の仕方を知っている、私はそれらを見ていると私は何度も自分自身を使用している。いつコールバック関数を使用しますか?

Cワールドの例は、データ検索のコールバックに依存するlibcurlです。

反対の例は、OpenSSLのようになります。私はそれを使用している場合は、私は、パラメータを使用します。これを使用するとき

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

私は疑問に思って?コールバックは非同期のものにのみ便利ですか?私は現在、自分のアプリケーションのAPIを設計する過程にあり、コールバックを使うのか、それともただのパラメータを使うのか不思議です。フードの下では、libcurlとOpenSSLをビルドするメインライブラリとして使用し、パラメータ "returned"はOpenSSLデータ型です。

私は戻ってくるだけでコールバックのメリットはありません。データを返すのではなく、何らかの方法でデータを処理したい場合は、これは便利ですか?しかし、私は返されたデータを処理することができました。違いはどこですか?

答えて

4

最も単純なケースでは、2つのアプローチは同等です。しかし、到着時にデータを処理するためにコールバックを複数回呼び出すことができれば、コールバックのアプローチはより大きな柔軟性を提供します。

libcurlは、新しく到着したすべてのデータのコールバックを指定できるAPIを提供しています。代わりに、あなたがそれを提示すると、を返すだけでになります。しかし、それを返す - どのように?データがメモリバッファに追加されると、データが非常に大きくなり、呼び出し側がファイルに保存したがっている可能性があります。データが呼び出し側に返されるファイルに保存されている場合、呼び出し側が実際にメモリに格納したいだけの場合は、不要なI/Oが発生する可能性があります。呼び出し元がチェックサムを計算したいだけで、データをまったく格納する必要がない場合はどちらの方法も間違っています。

コールバックアプローチを使用すると、呼び出し元は、データの基本チャンクをどのようにしてより大きな全体に組み立てるかを決めることができます。

0

すぐに値を返すことができる場合は、コールバックする必要はありません。あなたが推測しているように、何らかの理由で値にすぐに返されない状況では、コールバックは便利です(おそらく、非同期的に実行されるほうが長時間の操作なのかもしれません)。

3

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

、これらは私が遭遇した、および/またはのためのコールバック方式を実装した2つの主なパラダイムです:データが到着するか、いくつかのイベントが発生したとき、私はあなたを教えてくれます

  1. - あなたはあなたのようにそれを使用しますフィットを参照してください。
  2. 私はあなたにそれを扱う前にいくつかのデータを変更する機会を与えます。
関連する問題