このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

デレゲーションとフォーワーディング

「デレゲーション」って言葉(今日の日記の見出し)で思い出したことが……:

どこかで、メソッド呼び出し/メッセージ・パッシングにおけるデレゲーションとフォーワーディングは違うんだ、という話を読んだことがあります。どこだかは忘れた。

JavaScriptだと、この違いをわかりやすく説明できます。

Barクラス(「クラスもどきの継承もどき」の意味での「クラス」)のオブジェクトが、目的(target)のFooクラス・オブジェクトにデレゲート/フォーワードするコードはこんな感じ:


/*
* Foo
*/
function Foo(name) {
this.name = name;
}

Foo.prototype.hello = function() {
print("Hello, my name is " + this.name + ".");
};

/*
* Bar
*/
function Bar(name) {
this.name = name;
}
Bar.target = new Foo("John");

Bar.prototype.delegatedHello = function() {
(Bar.target.hello).apply(this, []);
};

Bar.prototype.forwardedHello = function() {
Bar.target.hello();
};

この状況で実験:


js> var bob = new Bar("Bob")
js> bob.delegatedHello()
Hello, my name is Bob.
js> bob.forwardedHello()
Hello, my name is John.
js>

レゲーションとは相手(target)の「力を借りる」ことで、フォーワーディングとは相手に「まる投げする」ことですね。

「力を借りる」ときは、メソッド実行コード(計算/処理)だけは借りるけど、thisが指すモノは自分自身。一方、「まる投げ」では、相手の“ところ”で相手の計算/処理が走ります。

このような言葉の使い分けが一般的かどうかは知らないけど、違いはあるでしょ。