クラスを作成しました。そのクラスには、オブジェクト、メッセージ、および引数の配列を受け取るメソッド'sendMessage:to:withArgs:'があります。このメソッドは、オブジェクトにメッセージを送信し、いくつかのアルゴリズムを実行するために使用されます。このメソッドを使用するには、作成したクラスのインスタンスxを作成し、x sendMessage:'+' to: '7' withArgs:'#(5)'のようにする必要があります。これにより、メッセージ'+'がパラメーター5を使用してオブジェクト7に送信され、さらに私のアルゴリズムが実行するものがいくつか送信されます。しかし、私が欲しいのは、アルゴリズムがすべてのメソッド呼び出しで使用されることです。つまり、7 + 5は私の'sendMessage:to:withArgs:'を呼び出します。どうやってやるの?または、少なくとも、すべてのオブジェクトに送信される各メソッドで呼び出されるものはありますか?
4 に答える
ちょっとおかしいです、私たちはSqueakircチャンネルでそれについて話し合っていました。おそらく、ObjectViewerを覗いてみてください。
あなたの例では、SmallIntegerに送信されるメッセージをインターセプトしたいとします。おかしなことに、ObjectViewerはほとんどすべてのクラスで動作しますが、SmallIntegerで動作します。
したがって、myObjectへのメッセージ送信をインターセプトするには、これを実行します。
クラスIntercepterを作成し、おそらくObjectTracerから継承させます。あなたに役立つ何かにdoesNotUnderstandを変更します:
doesNotUnderstand: aMessage
"do Mojo to aMessage as you describe it"
次に、作業を進めるために、インターセプターを作成します。
myIntercepter := Intercepter on: myObject.
その後
myObject become: myInterceptor.
Squeakで、クラスObjectTracerを参照してください。クラスコメントはそれを使用する方法を説明します。それで、または少なくともそれをモデルとして使用して、必要なことを達成できるはずです。
反射率を見てください。
残念ながら、一部の紙のリンクが機能しておらず、頭のてっぺんからの正確な呼び出しを覚えていませんが、コードを必要に応じてインストルメント化するのは非常に簡単で、実行時にも実行できます。クラスを使用して例を探しLink
ます。
メソッドラッパーを使用できます。メソッドラッパーが何であるかを確認するには、「Wrapperstotherescue」という論文を探すことができます。すでにメソッドラッパーを実装しているsqueakのパッケージがあると思います。さらに、Pharoの最後のバージョンでは、一種のメソッドラッパーを使用してテスト実行中に評価されるメソッドを確認するため、テストコードカバレッジ分析がどのように行われるかを確認できます。乾杯、ガボト