web-dev-qa-db-ja.com

コールバックメソッドとは何ですか?

私はプログラミング初心者で、コールバックメソッドの背後にある概念を完全には理解していませんでした。ウィキでそれについて読んでみました、そしてそれは私の頭を越えました。誰かがこれを簡単な言葉で説明できますか?

25
noob_00

コールバックは、関数に渡すものであり、操作のある時点で何を呼び出す必要があるかを関数に指示します。関数内のコードは、関数を呼び出すタイミング(および渡す引数)を決定します。通常、これを行う方法は、関数がオブジェクトである言語で、関数自体を「コールバック」として渡すことです。他の言語では、「関数ポインタ」(または同様のもの)と呼ばれるある種の特別なものを渡す必要があるかもしれません。または、関数の名前を渡す必要がある場合があります(実行時に検索されます)。

Pythonでの簡単な例:

void call_something_three_times(what_to_call, what_to_pass_it):
    for i in xrange(3): what_to_call(what_to_pass_it)

# Write "Hi mom" three times, using a callback.
call_something_three_times(sys.stdout.write, "Hi mom\n")

この例では、関数呼び出しを繰り返すタスクと、実際に関数を呼び出すタスクを分離します。これはあまり役に立ちませんが、概念を示しています。

現実の世界では、コールバックは、スレッドが実行する作業を説明するコールバックを使用してスレッド作成関数を呼び出すスレッドライブラリなどでよく使用されます。スレッド作成関数は、スレッドをセットアップするために必要な作業を実行してから、コールバック関数が新しいスレッドによって呼び出されるように調整します。

21
Karl Knechtel

ウィキは言う:

コンピュータプログラミングでは、コールバックは実行可能コードまたは実行可能コードの一部への参照であり、他のコードへの引数として渡されます。これにより、下位レベルのソフトウェアレイヤーは、上位レベルのレイヤーで定義されたサブルーチン(または関数)を呼び出すことができます。

一般的には、必要なときにコードの一部、つまりメソッド、実行するコードの一部、つまり別のメソッドに通知するメカニズムです。
コールバックは、呼び出し元の関数のクライアントが、実行する呼び出し元の関数に対するクライアントコードの責任に属する関数を指定し、これが引数として渡されるという事実に関連しています。
例はGUIにあります。イベントが発生すると(ボタンが押されるなど)呼び出される関数を引数として渡し、イベントが発生するとこの関数が呼び出されます。
この関数は通常、イベントに最初に登録されたオブジェクトによって実装されます

12
Cratylus

コールバック関数は、関数ポインタを介して呼び出される関数です。関数のポインタ(アドレス)を引数として別の関数に渡すと、そのポインタを使用してそのポインタが指す関数を呼び出すと、コールバックが行われたと言われます。

なぜコールバック関数を使用する必要があるのですか?

通知にはコールバックを使用できます。たとえば、アプリケーションでタイマーを設定する必要があります。タイマーが切れるたびに、アプリケーションに通知する必要があります。しかし、time'rsメカニズムの実装者は、アプリケーションについて何も知りません。特定のプロトタイプを持つ関数へのポインターのみが必要であり、そのポインターを使用するとコールバックが作成され、発生したイベントについてアプリケーションに通知されます。実際、SetTimer()WinAPIは、コールバック関数を使用してタイマーの期限が切れたことを通知します(コールバック関数が提供されていない場合は、アプリケーションのキューにメッセージを送信します)。

5
0xAX

コールバックとは、コードをパラメーターとして渡すことを意味します。たとえば、ボタンを想像してみてください。ボタンを押すと、ダイアログが表示されます。

Button testBtn;
testBtn.setOnClickListener(new OnClickListener() {

  @Override
  public void onCLick() {
    JOptionPane.showDialog(testBtn, "Test button pressed");
  }
}

ここでは、ボタンがクリックされるときに何を実行するかをボタンに指示します。したがって、フレームワークは、クリックを検出すると、渡されたコードを実行します。フレームワーク内には、次のようなコードがあります。

void processEvent(Event e) {
  if (e.type == Event.CLICK) {
    e.getComponent().getOnClickListener().onClick();
  }
}

そのため、一部の基本的なコードは、適切なイベントが発生したときにリスナーをコールバックします。

PS:ここに擬似コードがあります。アイデアを説明してください。

1
Vladimir Ivanov

一般に、何かが発生したときに呼び出されるパラメーターとして関数を提供します。

Cコードでは、次のようなものを渡します。

int (callback *)(void *, long );

void *とlongの2つのパラメーターを取り、intを返す関数を意味します。

オブジェクト指向言語では、構文が単純な場合があります。たとえば、ユーザーが関数のように見えるオブジェクト、または抽象メソッド(つまり、関数をラップする)とコンテキストデータを持つオブジェクトを渡すことができるコールバックメカニズムを構築できる場合があります。

現代語では、「デリゲート」という用語を使用して、関数「パターン」を指します。これらはコールバックとして使用できます。一部の言語では、lambdaという用語も使用されます。これは本質的に名前のない関数であり、コードのブロックで「オンザフライ」で作成され、コールバックとして渡されることがよくあります。 C++11はこれらを標準に導入しました。

コールバックを使用する利点は、APIを分離する、つまりAPIを呼び出しているものから削減/分離できること、およびその逆がある程度可能であるということです。 「ハンドラー」は、どこから呼び出されたかを知る必要はありません。

たとえば、オブジェクトを生成し、生成されたときに「コールバック」するAPIを使用できます。

1
CashCow

コールバックメソッドは、イベントが発生したときに呼び出されるメソッドです。

0