メッセージとバインド

オブジェクトに送られるメッセージは、オブジェクトの具体的挙動であるメソッドを励起します。これによって、オブジェクトはデータを適切に処理し、必要な結果をもたらします。

メッセージは、それ単独では具体的な挙動を定めるものではありません。例えば、同じGET:という名前のメソッドが二つ以上のクラスに備わっていた場合、同じGET:というメッセージでも、どのクラスのインスタンスにメッセージが送られたかによって、引き起される具体的な処理は異なるからです。

メッセージを特定のメソッドと結びつけ、それを具体的なインスタンスの挙動として特定することをバインド(束縛などと訳されます。)といいます。これなしには、実際の動作は不定のままです。

このようなバインドを、ワードなどの定義としてロードした時点、つまりコンパイルの時点で行う方法を静的束縛(Static Binding)、あるいは早期束縛(Early Binding)と呼びます。他方、コンパイル時ではなく、プログラムの走行中にメッセージが送られた時点でバインドを行う方法を動的束縛(Dynamic Binding)、あるいは晩期束縛(Late Binding)といいます。Mopsでは、どのオブジェクトに付いても、どちらの方法でのバインドでもできるようになっています(状況によっては動的束縛しかできない場合もありえますが、Mopsの機構としての制約ではありません。)。

静的バインドのシンタックスは、
メッセージ:   オブジェクト         \ 名前のあるオブジェクトについて
(パラメタ) オブジェクトアドレス  セレクタ:   class_as>  クラス名    \ 名前のないオブジェクトについて
となります。名前のあるオブジェクトに付いても、後者の方法が使えます。オーバーライドされているにもかかわらず、上位クラスのメソッドを強制的にバインドしたいときに便利といえます。

動的バインドについても、基本的には2つのシンタックスがあります。
メッセージ:   [ オブジェクトアドレスを取る式 ]    \ 括弧内はオブジェクト名でもよい
(パラメタ)  オブジェクトアドレス  セレクタ:  **    \ **は[]でもよい
動的バインドはランタイム時にメソッドを検索するので、一般に動作が遅くなります。ですが、Mopsの検索は非常に速く、特に何らかの描画を伴うものなら、描画の方がずっと遅いので、全く速度を気にする必要はありません。また、繰り返しメッセージを送る場合にはキャッシュを有効利用する(らしい)ので、特に速度を重視しなければならない部分を除けば、普通に使ってかまいません。現実問題としては、ループなどによる再帰的処理を含んだ部分に使っても平気なくらい高速です。

補遺

上の記述法でいう "メッセージ:" は、パラメターとセレクターを合わせたものを意味しています(語彙分類のページ参照)。
なお、具体的な利用例は、文字列オブジェクトのページを参照してください。


関連項目:






最終更新:2020年01月03日 23:32