委譲と転送の違い

前にちらっと書いた委譲と転送の違いですが、自分の中ではすっきりしてきたので備忘録がてら書き残します。
話の出元はEffective JavaGoFデザインパターン本で、コンポジションと転送の組み合わせが間違えて委譲と呼ばれる事がある、とか、真の委譲、とかって言葉がでてきてて、それが何をいみしてんのかさっぱりだったので色々調べてました。
あくまで 現時点での僕の理解 なので正しい保証はないです、はい (*ノωノ)


What is (Not) Delegation


最初はここの図が何を意味してるのかはっきりわかりきって無かったんですが、簡単に日本語で書いてしまえば

委譲とは、message receiverの情報を使いつつ、method holderが色々と処理を行える状態の事。
転送とは、message receiverが後の事は完全しらんぷりで、method holderに処理を丸投げする事。

かなーと。
委譲は、一連の流れのコンテキストはmessage receiverにありますが、転送の場合はmethod holderに処理が丸投げされた段階でコンテキストがmethod holderに移る、みたいな。
ようは、あくまでも処理を委譲してるだけなので、method holderからみた際もthis自体はmessage receiverであるべきよね? という事かなという感じ。


んでんで、ここら辺の話を調べてると true delegation ってう言葉が出てきたので、なんじゃそりゃ?と思って調べてみたら、上述の委譲で必要となる、method holderでthisをみるとmessage receiverが見える、といった状態の事を指すらしいです。
サポートしてる言語としては

Self Home Page

とかがあるとの事。
(参考にしたURL: | 株式会社オージス総研)


ここまで来てからJavaを見てみると、Javaは true delegation をサポートしてないですね。
つまり、委譲をしたい場合は転送を使って委譲擬きを作るしかない。
なんとなくですが、これこそが委譲と転送がごっちゃごっちゃに説明されてしまっている原因な気がします。
Javaでみたら、委譲(擬き)も結局の所は転送ですしねー。


とかとか、こんな話を id:beyondseeker さんとお昼ご飯食べつつ話してたら、そもそもとして true delegation ってどうなのよ? みたいな話になったのですが、それはまた別問題ということでお茶を濁します (*ノωノ)