コールバック (情報工学)
コールバックを使う意義を理解するため、連結リスト上の各要素に対して様々な処理を行うという問題を考える。ひとつの手法として、リスト上でのイテレータで各オブジェクトについて処理をするという方法がある。これは実際、最も一般的な手法だが、理想的な方法というわけではない。イテレータを制御するコード(例えば for 文)はリストを辿る処理が存在すると、その度に複製が必要となる。さらに、リストの更新が非同期プロセスで行われている場合、イテレータでリストを辿っている間に要素を飛ばしてしまったり、リストを辿れなくなったりする可能性がある。
代替手法として、新たにライブラリ関数を作り、適当な同期を施して必要な処理を行うようにする。この手法でもリストを辿る必要が生じる度に同様の関数を呼び出す必要がある。この方式は様々なアプリケーションで使われる汎用ライブラリにはふさわしくない。ライブラリ開発ではあらゆるアプリケーションのニーズを予測することはできないし、アプリケーション開発ではライブラリの実装の詳細を知る必要がないのが望ましい。
コールバックが、この問題の解決策となる。リストを辿るプロシージャを書くとき、そのプロシージャがアプリケーションが各要素についての処理を行うコードを提供するようにする。これにより、柔軟性を損なわずに明確にライブラリとアプリケーションを区別することができる。
コールバックは実行時束縛の一種と見ることもできる。
コールバック関数は、例外処理を実現する手段としてもよく使われ、状況によって副作用を伴う処理を可能としたり、何らかの処理途中の情報を収集するのに使われたりする。割り込みハンドラは、オペレーティングシステム (OS) でハードウェアの何らかの状況に対応するのに使われる。また、シグナルハンドラはアプリケーションが OS に登録し、OS が呼び出す。イベントハンドラは、プログラムが受信した非同期的な入力を処理する。
副作用のないコールバック関数を「純粋コールバック関数; pure callback function」と呼ぶ。場合によっては、純粋コールバック関数が必要とされることもある。
特殊なコールバックとして「述語コールバック; predicate callback」がある。これは純粋コールバック関数の一種で、引数は1つだけで、リターン値はブーリアン型である。これは、データの集まりからある条件に適合するものだけを選別するときに使われる。
イベント駆動型プログラミングでは、Observer パターン的な方式がよく使われ、マルチキャスト型のコールバックが可能となっている。この場合、コールバックは予め登録され、対応するイベントが発生したときに呼び出される。プログラミング言語によっては、この機構を直接サポートしている場合もある(例えば、.NET の delegate、Qt の signal と slot)。