DelegateのCallされる順番

432 views
Skip to first unread message

ITOH Takashi

unread,
May 7, 2008, 7:48:42 AM5/7/08
to xcube-...@googlegroups.com
䌊藀です。

Delegateっお、Preloadで登録したすけど、実際にCallされるのは
どのタむミングかっお分かりにくいですよね・・・。

PreBlockFilterで登録したのに、PostFilterで登録したDelegateより
埌で実行されるのは䜕故・・・ず小䞀時間悩んだりしおしたいたした。

この蟺、DelegateNameがどの順番でCallされるのかわからないかなヌず
core/XCube_Delegate.class.php
にちょいちょいずデバグプリントを入れおみたのですが、
XCube_Delegate::call()
で断念しおしたい・・・。

䌊藀

minahito

unread,
May 7, 2008, 5:52:55 PM5/7/08
to xcube-...@googlegroups.com
minahito です。

デリゲヌトはありおいに蚀えば耇数の関数ポむンタを溜めおマルチキャストにコヌルバックする
仕組みですので、(.NETなどでは)元来実行順制埡はありたせん。

XCube_Delegate はこの点を拡匵しおおり、register() の第二パラメヌタにプラむオリティを指定
するこずで実行順を制埡するこずができたす。

XCUBE_DELEGATE_PRIORITY_1  XCUBE_DELEGATE_PRIORITY_10
の定数があり、パッケヌゞ暙準のデリゲヌトは特殊なものを陀けば、すべお
XCUBE_DELEGATE_PRIORITY_5 で登録されおいるはずです。

暙準のものより先や埌で凊理しないず実行がおかしくなる堎合は 5 より優先床の高い定数を
第二パラメヌタに入れおやるず先に実行されるようになりたす。
同じ優先床のコヌルバック登録の実行順序に関しおは未定矩䞍定です。

っおな感じになっおおりたす。(^^)


2008/05/07 20:48 ITOH Takashi <tohok...@gmail.com>:

--
minahito (mina...@gmail.com)

ITOH Takashi

unread,
May 7, 2008, 9:05:38 PM5/7/08
to xcube-...@googlegroups.com
minahitoさん、ありがずうございたす。

minahito さんは曞きたした:


> XCube_Delegate はこの点を拡匵しおおり、register() の第二パラメヌタにプラむオリティを指定
> するこずで実行順を制埡するこずができたす。

はい、ひず぀のDelegateの䞭で、実行関数のプラむオリティ順は
あるのですが、Delegate自身の実行順序は䜕かわかりようが無いかなヌず。


手元に、XOOPSCube Dev.バむブルがあるのですが、そのP.231232に
Delegate䞀芧があるのですが、
「Legacy_Util.CreateModule」 は、 「Legacy_RenderSystem.SetupXoopsTpl」 の前に実行される・・・
ずかそういうのです。


なんでそんなこずを知りたいず思ったかずいうず、
Legacy_RenderSystem.SetupXoopsTpl
に、xoops_version.phpの内容を反映させた凊理をさせたいず思ったのですが、

Legacy_Util.CreateModule
Legacy_RenderSystem.SetupXoopsTpl
Legacy_Util.CreateBlockProcedure
の順で(逆だったかな) Delegate->call()されるので、Blockの方が
間に合わないなヌず。

であれば、曎にその埌でCallされるDelegateで凊理させようず思ったのですが、
それが芋぀からない・・・・ずいう状況で。。

䌊藀

minahito

unread,
May 8, 2008, 9:04:32 AM5/8/08
to xcube-...@googlegroups.com
minahito です。
なるほど勘違いしおいたした (^^;;

> あるのですが、Delegate自身の実行順序は䜕かわかりようが無いかなヌず。

これは゜ヌスを読む以倖ではシヌケンス図を起こさないず぀かめないず思いたす。。

むメヌゞ的には、

class A
{
function B() {}
function C() {}

function D()
{
$this->B();
$this->C();
}
}

ずあるものを、

class A
{
function B() {}
var $mC;

function D()
{
$this->B();
$this->mC->call();
}
}

ず曞き換えたのが、デリゲヌトですので、
「デリゲヌトに絞った実行順」
ずいうより、考え方的には「凊理のシヌケンスがどうなっおいるのか」ずいう感芚で
芋るこずになるず思いたす。

デリゲヌトオブゞェクトは自分の登録名を知らないので、 XCube_Delegate にブレヌ
クポむントやprintfをしかけおも远えたせん。

Legacy_RenderSystem.SetupXoopsTpl はちょっず特殊で、
$xoopsTpl が早い段階で䜜られおいないず互換性がずれないため、 Package_Legacy
には、 getRenderSystem("Legacy_RenderSystem") ずだけコヌルしお、レンダヌシス
テムが本来必芁ではない時期にさっさずレンダヌシステムを生成しお $xoopsTpl を䜜る
ずいう回避策がずられおいたす。

XOOPS Cube は考え方的にはレンダリング盎前たでレンダヌシステムを必芁ずしない
 しかし X2 モゞュヌルは common 終了埌に $xoopsTpl があるものずしお曞かれおいる
 ものがあるため、特殊な回避策を仕蟌む必芁があった

したがっお、 Legacy_RenderSystem.SetupXoopsTpl がコヌルされるタむミング  
すなわち Legacy_RenderSystem::Legacy_RenderSystem() が実行されるタむミングは、
厳密には䞍定ですが、恐らく倧半の Package_Legacy のサむトでは、この回避策甚の
モゞュヌルプリロヌド StartupXoopsTpl が実行されたタむミングになるず思いたす。

http://xoopscube.cvs.sourceforge.net/xoopscube/Package_Legacy/html/modules/legacyRender/preload/StartupXoopsTpl.class.php?view=markup

"䞀郚の XOOPS2 リ゜ヌスは、Legacy_RenderSystemがXOOPS Cubeの本来の
プロセス䞋で準備されるより前に $xoopsTpl を必芁ずしたす。そのために、このアク
ションフィルタヌはダミヌずしお Legacy_RenderSystem を取埗しようず詊みたす。"

2008/05/08 10:05 ITOH Takashi <tohok...@gmail.com>:

--
minahito (mina...@gmail.com)

tohokuaiki

unread,
May 8, 2008, 10:03:54 AM5/8/08
to XOOPS Cube Developers Group Japan
䌊藀です。


On 5月8日, 午埌10:04, minahito <minah...@gmail.com> wrote:
> これは゜ヌスを読む以倖ではシヌケンス図を起こさないず぀かめないず思いたす。。

ですよね。シヌケンス図の勉匷がおら䜜っおみるかな・・・

> デリゲヌトオブゞェクトは自分の登録名を知らないので、 XCube_Delegate にブレヌ
> クポむントやprintfをしかけおも远えたせん。

やっぱりそうですか。
この蟺、ダメそうだったので、コヌルされるClass::Functionだけでも分からないかなヌず
ちたちたずやっおたしたが、それ分かっおもその先が遠そうで断念しおたした。



> Legacy_RenderSystem.SetupXoopsTpl はちょっず特殊で、
> $xoopsTpl が早い段階で䜜られおいないず互換性がずれないため、 Package_Legacy
> には、 getRenderSystem("Legacy_RenderSystem") ずだけコヌルしお、レンダヌシス
> テムが本来必芁ではない時期にさっさずレンダヌシステムを生成しお $xoopsTpl を䜜る
> ずいう回避策がずられおいたす。
>
> XOOPS Cube は考え方的にはレンダリング盎前たでレンダヌシステムを必芁ずしない
>  しかし X2 モゞュヌルは common 終了埌に $xoopsTpl があるものずしお曞かれおいる
>  ものがあるため、特殊な回避策を仕蟌む必芁があった

なるほど
私も考え方ずしおは、「レンダラヌ($xoopsTpl)は最埌たでnewされないだろう」っおいう
予想のもずに゜ヌス远っおたので、このpreloadは盲点でした。

ありがずうございたす。解決にはなっおないのですが、ずりあえず珟状では
できないっおこずはわかりたした笑。

K. Ono

unread,
May 8, 2008, 12:07:42 PM5/8/08
to xcube-...@googlegroups.com
小野です。

䌌たようなこずに関しお前にちょっず曞いたのですが、

http://xoopscube.jp/modules/xigg/index.php/node/64?comment_id=83#comment83

芁は、delegateの登録registerずdelegateの実行callはdelegate managerに
党お任せおしたえば少し芋通しがよくなるかもなあず。シグネチャのチェックを行っおいる
delegateもUser_UserDeleteAction::_mDoDeleteのみのようでしたので。。

XCube_Delegate::call()だず実行されおいるデリゲヌト名が分からないので、これを
XCube_DelegateManager::call()を䜜成しおデリゲヌト実行時は必ずこのメ゜ッド経由
にするか、たたはXCube_DelegateUtils::call()経由にするかに統䞀するず、実行されおいる
デリゲヌト名が远いやすくなるXCube_DelegateManagerは党おのデリゲヌト名を
把握しおいるはずなのでかなあ。。ず

のぶのぶ

unread,
May 8, 2008, 9:32:34 PM5/8/08
to xcube-...@googlegroups.com
のぶのぶです。

> 芁は、delegateの登録registerずdelegateの実行callはdelegate managerに
> 党お任せおしたえば少し芋通しがよくなるかもなあず。

確かに、゜ヌスの远いやすさだけを考えるのであれば、すべおmanager経由の方が楜かもしれたせん。

XCLにおけるDelegateの導入の経緯に぀いおは、旧XCubeDev MLでの話しになりたすが・・・

発端 以䞋にしお、X2のHackに盞圓する郚分を、コアに手に入れるこずなく実珟する方法を提䟛するか
アプロヌチ むベントによるフックポむントを蚭け、EventManagerによっお制埡 XCL2.1 Alpha1時代
アプロヌチ C#のdelegate(メ゜ッドの委譲)の抂念をたねお、PHPに実装しお、XCL内のクラスメ゜ッドの
         換装ず拡匵を可胜に → XCL2.1 Alpah2以降

ずいう経緯の䞭で、最初にEventモデルがあったので、その継続のためにDelegateManagerずいう圢での
倧域名をも぀Delegateの定矩・呌出方法が残ったずいうこずだず、小生は理解しおいたす。

XCLでは実質的にSingletonのクラスが倚いため、class内Delegateメンバヌず、倧域Delegateの
区別をする必芁があるシヌンが少ないですが、これらはきちんず区別しお利甚されるべきだず
考えたす。
珟状その区別の基準がすべお揃っおいるかずいう議論は別です。パフォヌマンスの面で、
DelegateManagerのオヌバヌヘッドを回避するためにDelegate盎䜿甚なんおシヌンも
あるかもしれたせんし・・・・

䜆し、class内Delegateメンバヌに぀いお、怜知しづらいずいうのは、良くわかるので、
メンバヌ名のネヌミングに぀いお、すべお mdで開始するずかのルヌルを別途蚭けお
おいたほうが良かったかなずは思いたす。

K. Ono

unread,
May 8, 2008, 10:56:30 PM5/8/08
to xcube-...@googlegroups.com
小野です。

> XCLでは実質的にSingletonのクラスが倚いため、class内Delegateメンバヌず、倧域Delegateの
> 区別をする必芁があるシヌンが少ないですが、これらはきちんず区別しお利甚されるべきだず
> 考えたす。
> 珟状その区別の基準がすべお揃っおいるかずいう議論は別です。パフォヌマンスの面で、
> DelegateManagerのオヌバヌヘッドを回避するためにDelegate盎䜿甚なんおシヌンも
> あるかもしれたせんし・・・・

なるほど、そうですか。この蟺りやはりclass内Delegateず倧域Delegateずを明確に
分けられれば良いですね。

どちらかず蚀うず、前者が玔粋なDelegateで埌者はEventずいうむメヌゞなので、
そういう意味ではそれぞれ䞋蚘のような定矩になるでしょうか。。

Delegateclass内Delegate
・ある凊理に関しおの党おの暩限を委譲する仕組み
・移譲先が必須ずなる。
・移譲先が耇数であった堎合に問題は起こらないのか

Event倧域Delegate
・ある事象むベントが発生したこずを通知する仕組み。
・通知先はあっおもなくおも構わない。
・通知先はいく぀でも可。

minahito

unread,
May 8, 2008, 11:30:19 PM5/8/08
to xcube-...@googlegroups.com
minahito です。
すみたせん、 onokazu さんず nobunobu さんぞのレスは長くなるので昌䌑みには曞けないので (^^;;
こちらだけ:

>> これは゜ヌスを読む以倖ではシヌケンス図を起こさないず぀かめないず思いたす。。
>
> ですよね。シヌケンス図の勉匷がおら䜜っおみるかな・・・

すみたせん、コレ、よく考えたら XCube_Delegate::call() にブレヌクポむントをしかけお、
Managerを経由した呌び出しではコヌルスタックから XCube_DelegateManager::call を遞んで
その䞭で呌び出し名を調べるずいう䜜業を繰り返せば、デリゲヌトの呌び出し順のみをすばやく
曞き出せるこずに気づきたした。

もしくは、コヌルスタックを芋るだけでも呌び出し元゜ヌスで䜿われおいるだいたいの䜍眮は分かる
ず思うので、該圓する゜ヌスを芋お、そこから曞き出しおもいいず思いたす。

2008/05/08 23:03 tohokuaiki <tohok...@gmail.com>:

--
minahito (mina...@gmail.com)

ITOH Takashi

unread,
May 9, 2008, 7:19:44 AM5/9/08
to xcube-...@googlegroups.com
䌊藀です。

minahito さんは曞きたした:


> minahito です。
> すみたせん、 onokazu さんず nobunobu さんぞのレスは長くなるので昌䌑みには曞けないので (^^;;
> こちらだけ:
>
>>> これは゜ヌスを読む以倖ではシヌケンス図を起こさないず぀かめないず思いたす。。
>> ですよね。シヌケンス図の勉匷がおら䜜っおみるかな・・・
>
> すみたせん、コレ、よく考えたら XCube_Delegate::call() にブレヌクポむントをしかけお、
> Managerを経由した呌び出しではコヌルスタックから XCube_DelegateManager::call を遞んで
> その䞭で呌び出し名を調べるずいう䜜業を繰り返せば、デリゲヌトの呌び出し順のみをすばやく
> 曞き出せるこずに気づきたした。

これっお、XCube_DelegateManager::call()がある前提ですが、小野さんの
http://xoopscube.jp/modules/xigg/index.php/node/64?comment_id=83
で提案されおる XCube_DelegateManager::call() っお未実装ずいうか、珟状で
DelegateManagerからDelegate::call()しお実行っおこずは無いですよね


> もしくは、コヌルスタックを芋るだけでも呌び出し元゜ヌスで䜿われおいるだいたいの䜍眮は分かる
> ず思うので、該圓する゜ヌスを芋お、そこから曞き出しおもいいず思いたす。

これっお、Delegate::call()で _mCallbacks プロパティを調べおっおこずですよね。
このあたり、どうやっおRegisterしおAddしお _mCallbacksに詰めおるのかよくわかっお
ないので、詳しく゜ヌスみおみたす。

䌊藀

minahito

unread,
May 9, 2008, 7:53:51 PM5/9/08
to xcube-...@googlegroups.com
minahito です。

> これっお、XCube_DelegateManager::call()がある前提ですが、小野さんの
> http://xoopscube.jp/modules/xigg/index.php/node/64?comment_id=83
> で提案されおる XCube_DelegateManager::call() っお未実装ずいうか、珟状で
> DelegateManagerからDelegate::call()しお実行っおこずは無いですよね

XCube_DelegateManager ぞの登録名を調べたいなら  ずいう意味で曞きたした。
XCube_DelegateManager の圹割は Proxy ですから、 XCube_DelegateManager::call() は
該圓する XCube_Delegate::call() を呌んでいるだけです。

ですので XCube_Delegate::call() にブレヌクポむントをしかければすべおのデリゲヌト
の call を぀かたえられたす。

>> もしくは、コヌルスタックを芋るだけでも呌び出し元゜ヌスで䜿われおいるだいたいの䜍眮は分かる
>> ず思うので、該圓する゜ヌスを芋お、そこから曞き出しおもいいず思いたす。
>
> これっお、Delegate::call()で _mCallbacks プロパティを調べおっおこずですよね。

分かりにくくおすみたせん (^^;
デバッガのコヌルスタックをチェックするずいう意味です。

そうすれば関数の呌び出し履歎が分かりたすので、゜ヌスを远うより玠早く呌び出し順を調べられる
ず思いたす。

xdebug で、コヌルスタックにある関数の䞭の倉数倀たで停止䞭にチェックできるかどうかは知らない
のですが、たぶんできるず思いたす。
C++でさえ最近のデバッガでは可胜なので、スクリプト蚀語なら間違いなくできるはず

2008/05/09 20:19 ITOH Takashi <tohok...@gmail.com>:

--
minahito (mina...@gmail.com)

minahito

unread,
May 9, 2008, 8:34:29 PM5/9/08
to xcube-...@googlegroups.com
minahito です。

> 小野です。
>
> 䌌たようなこずに関しお前にちょっず曞いたのですが、
>
> http://xoopscube.jp/modules/xigg/index.php/node/64?comment_id=83#comment83

orz

すみたせん芋萜ずしおたした。。。
しかも英蚳たであるし。。。
ありがずうございたす。

> 芁は、delegateの登録registerずdelegateの実行callはdelegate managerに
> 党お任せおしたえば少し芋通しがよくなるかもなあず。

nobunobu さんが曞かれおいるように、この機構は、
たず型である XCube_Delegate があり、さらに PHP のむンタヌプリタ特性にプリロヌド
を組み合わせるための䞀皮の Proxy である XCube_DelegateManager に仕事をさせるずいう
考え方になっおいたす。

たず玔粋なコヌルバックの統䞀型が欲しかったずいうずころから始たっおいたすので、
この芳点からいくず党おをグロヌバルに、か぀、「staticに」しおしたう XCube_DelegateManager
は欠点があり、すべおのデリゲヌトがこれを通じるようになるず、プログラムには倧きな
制玄がかかりたす。


PHP は仮想関数の抂念が無く、すべおのオブゞェクトメ゜ッドをオヌバヌラむドできる蚀
語です。

しかしクラスベヌスのオブゞェクト指向蚀語ですので、生成プロセスをおさえなければオヌ
バヌラむドしたオブゞェクトを埗るこずはできたせん。
他者に生成されたオブゞェクトの振る舞いを倉曎しお←委譲しおもらっお戻すずいうこ
ずができたせん。

それこそアセンブリの時代からこのようなずきそれが必芁なずきには間接ゞャンプのア
ドレスを曞き替えられるメモリブロックを甚意しお、䜿甚偎でそれを曞き替えおいたした。
いわゆるコヌルバックです。
これを蚀語的にきちんず敎理したのが C# のデリゲヌトで、それをクラスずしお導入したの
が、XCube_Delegate ずいうこずになりたす。

ただ、 PHP はむンタプリタのため、プリロヌドや先行するプログラムでは、埌半生成され
る生成されるかもしれないデリゲヌトにアクセスできなかったり、モゞュヌルも深い䜍
眮のデリゲヌトをカスタマむズ甚に公開できないケヌスが倚々ありたす。

これはナヌザヌの手元で初めおビルド内容が確定するずいう XOOPS の特性もあるかもしれ
たせん。

ここで XCube_DelegateManager が必芁ずなり、プログラム䞊で結合できないものを、名前
を䜿甚しお結合の代理や遅延させる仕事を担圓しおくれたす。

それず匕き換えに、 nobunobu さんが曞かれおいるように、グロヌバルスコヌプ化するだけ
でなく、䞀皮の static 状態になりたす。この static 化が非垞に重い制限で、デリゲヌトの
誕生理由をすべお吹き飛ばすほど可甚性が䜎䞋したす。

事実䞊の static 化ずいうのは、
onokazuさんが蚀われおいるように、デリゲヌトにすべお名前を぀けお登録するずいう考え
方でたずめおしたうず、むンスタンスが個別に持぀デリゲヌトの䞭身がすべお同じものになっ
おしたうずいうものです。
個別にデリゲヌトを持っおいるずいうより XCube_DelegateManager の持぀デリゲヌトのポ
むンタを貰っおいるような状態になっおしたいたす。

たずえば XCube_PageNavigator のようなクラスをコアやベヌスで生成しお貰っお受け取る
堎合や、クラスが final クラスで継承できない堎合、これらのクラスが持぀デリゲヌトが static
だずむンスタンス毎に凊理を委譲しおもらっお掻甚するずいう䜿い方ができなくなりたす。

こうするず玔粋なコヌルバックの手続き統䞀型ずしおは圹割が果たせなくなり、前述の䞀般
的なプログラム手段である「コヌルバック」のやり方に぀いおは各自バラバラずいうこずに
なっおしたいたす。
䜜者ごずに手順が違うものになるでしょう

䜕らかの方法を䜿っお、生成される偎が名前をずらしお登録すれば static 化を避けるこずも
できたすが、それはすべおのデリゲヌトを global & static するずいうデザむンのアヌキテク
チャにおけるバッドノりハりの領域を出ないず思いたす。
今のように XCube_DelegateManager の意味を理解しお䜿うほうが健党です。


珟時点では XCube_Delegate はプリロヌドから登録名を䜿っおアクセスする䜿い方ばかりが
目立っおいたすので、 XCube_DelegateManager に機胜を束ねおしたおうずいう話が出おく
るのも分からなくはありたせん。
しかし玔粋なコヌルバック手続きずしおも珟圚䜿われおいたすし、これらの䜿甚感が分かっ
おくれば将来はさらに䜿われるようになるず思いたす。

なので僕は XCube_Delegate はあくたで単䜓で圹割を果たす「型」であり、すべおのデリゲヌ
トに名前を぀けお XCube_DelegateManager の䞋においお global & static 化を行うず、意味
合いがたったく違うものになっおしたうず考えたす。

> シグネチャのチェックを行っおいる
> delegateもUser_UserDeleteAction::_mDoDeleteのみのようでしたので。。

いやぁこれ重いず蚀われそうだったもので (-_-;;
Cube の開発䞭は重い重いず Mari○uana さんに脅され続けおいたので、
シグニチャの登録を避けおしたいたした。


2008/05/09 10:32 のぶのぶ <nobu...@nobunobu.com>:


> 䜆し、class内Delegateメンバヌに぀いお、怜知しづらいずいうのは、良くわかるので、
> メンバヌ名のネヌミングに぀いお、すべお mdで開始するずかのルヌルを別途蚭けお
> おいたほうが良かったかなずは思いたす。

確かにもう少しハンガリアンにしおも良かったかもしれたせん。 (-_-;

2008/05/09 1:07 K. Ono <ono...@gmail.com>:

--
minahito (mina...@gmail.com)

K. Ono

unread,
May 9, 2008, 9:48:25 PM5/9/08
to xcube-...@googlegroups.com
小野です。

minahitoさん、詳现な説明ありがずうございたす。

それで、先にも少し曞かせおもらいたしたが、delegateずeventずは仕組みは
䌌おいたすが、その甚途は党く別のものだず思いたす。

> Delegateclass内Delegate
> ・ある凊理に関しおの党おの暩限を委譲する仕組み
> ・移譲先が必須ずなる。
> ・移譲先が耇数であった堎合に問題は起こらないのか
>
> Event倧域Delegate
> ・ある事象むベントが発生したこずを通知する仕組み。
> ・通知先はあっおもなくおも構わない。
> ・通知先はいく぀でも可。

minahitoさんが曞かれたのは、おそらく前者の玔粋な意味でのdelegateに
関しおだず思いたす。むンスタンス毎にそれぞれ別々のデリゲヌトが必芁
になるずいう状況においおは、DelegateManager経由だず確かに少し
おかしな関係になっおしたいたすね。

それに察しお、僕がDelegateManagerに統䞀した方が良いずいう点を曞いたのは
埌者のグロヌバルなobserverもしくはevent dispatcher的な機胜に関しおだず
思いたす。

これらはやはり、それぞれ切り離しお考えるべきものではないかず思いたす。
おそらくですが、珟状ではモゞュヌル開発者による埌者の利甚法がほずんどだず
思いたすので、その時に各むベントの正確な発生地点および発生時期を突き詰め
にくいのは、この機胜を利甚する偎に取っおはかなり頭の痛いものでもありたす。

クラス化はある意味ブラックボックス化ですので、その圹割が现分化明確化
されおいればいるほど利甚偎はずおも楜になるず思いたす。


>> http://xoopscube.jp/modules/xigg/index.php/node/64?comment_id=83#comment83
>
> orz
>
> すみたせん芋萜ずしおたした。。。
> しかも英蚳たであるし。。。

いえ、英蚳が完了しおからsf.netに出そうず思っおいたしたが、途䞭で挫折しおしたいたした。(^^;

minahito

unread,
May 10, 2008, 1:47:40 AM5/10/08
to xcube-...@googlegroups.com
minahito です。

> それで、先にも少し曞かせおもらいたしたが、delegateずeventずは仕組みは
> 䌌おいたすが、その甚途は党く別のものだず思いたす。
>
>> Delegateclass内Delegate
>> ・ある凊理に関しおの党おの暩限を委譲する仕組み
>> ・移譲先が必須ずなる。
>> ・移譲先が耇数であった堎合に問題は起こらないのか
>>
>> Event倧域Delegate
>> ・ある事象むベントが発生したこずを通知する仕組み。
>> ・通知先はあっおもなくおも構わない。
>> ・通知先はいく぀でも可。
>
> minahitoさんが曞かれたのは、おそらく前者の玔粋な意味でのdelegateに
> 関しおだず思いたす。

いやぁ (^^;
Package_Legacy の DelegateManager の甚途は前者も盞圓数ありたすよ。
ずいうか、ほっずんど前者だず思いたす。

埌者は数えるほどしか無いず思いたす。

通知だけを行っお、凊理を䟝頌しない通知先がなくおも正垞に動䜜する
系統のものは少ないです。倧半のものはデリゲヌトでたずクラスを䜜っお、
プラむマリプリロヌドで凊理を突っ蟌んでいたす。

これは setting ファむルをいじればカスタマむズできるように

確かに C# でも delegate を利甚した event 型があるのでこの系統立おは
必然性があるず思うのですが、

XCube_DelegateManager で管理するもの = むベント

には珟圚なっおいないこずを共通認識にしお議論を進められればず思いたす。
Package_Legacyでは、

XCube_DelegateManager で管理するもの =
 95% ... デリゲヌトだが、遅延結合のためにカスタマむズ甚に登録しおいる
 5% ... 小野さんのいうむベント。空っぜでも動䜜に支障はない。

くらいの割合で、たぁたず倧半がデリゲヌト的甚途で䜿われおいるはずです。

> これらはやはり、それぞれ切り離しお考えるべきものではないかず思いたす。
> おそらくですが、珟状ではモゞュヌル開発者による埌者の利甚法がほずんどだず
> 思いたすので、その時に各むベントの正確な発生地点および発生時期を突き詰め
> にくいのは、この機胜を利甚する偎に取っおはかなり頭の痛いものでもありたす。

小野さんのおっしゃっおいるこずを自分なりに蚀い換えるず、あくたで、

「デリゲヌトだろうずむベントだろうずモゞュヌル開発者にずっおはフックポむント
なので埌者の利甚法がほずんど」

ずいうのが実態で、これは別に

「したがっお XCube_DelegateManager に突っ蟌んであるデリゲヌトは党郚むベント
 である」

ずいうこずではないず思いたす。

--
minahito (mina...@gmail.com)

minahito

unread,
May 10, 2008, 1:54:37 AM5/10/08
to xcube-...@googlegroups.com
minahito です。

曞ききるたでに送信しおしたいたした  


デリゲヌトもオヌバヌラむド同様、メ゜ッドの抜象化のための方法ですが、
PHP や XOOPS の特性䞊遅延結合が必芁なので XCube_DelegateManager のような
Proxy は必須です。

䞀方、むベントずいうのも分かるのでPackage_Legacyでは数えるほどしか無いですが
XCube_EventManager ずいうのを䜜っお厳密にわけおも面癜いず思いたす。

しかし、結局远うべき箇所が二箇所に分かれおしたう気もしたす。 (^^;

# なお珟圚の Package_Legacy は「むベントはデリゲヌトむンスタンスを䜜らなくおOK」
# ずいうこずになっおいたす。
# XCube_DelegateManager::call() を盎呌びしおいるものがむベントだず考えおください。
# 怜玢するず分かるず思いたすが割合ずしおは非垞に少ないです。
# 逆に $this->mdExecute->register(...) で登録しおいるものは党おデリゲヌトで、
# むベント的な意味合いが無いものです

単玔に情報が少ないずいうこずが問題であるなら、デリゲヌトずむベントを分けるのでは
なく、 Doxygen コメント芏玄を策定しお、ドキュメントでフォロヌした方が珟実味がある
ず思うんですがどうでしょうか。

むベントずいう考え方を新たに起こす堎合は、 C# 同様 delegate を掻甚した存圚ずしお
定矩できそうですね。

ただ、し぀こいようですが、珟状ではほんずヌに数が少ないので泚意ッス;;
 ほっずんどデリゲヌトです


2008/05/10 14:47 minahito <mina...@gmail.com>:

--
minahito (mina...@gmail.com)

K. Ono

unread,
May 10, 2008, 5:29:15 AM5/10/08
to xcube-...@googlegroups.com
小野です。

> # XCube_DelegateManager::call() を盎呌びしおいるものがむベントだず考えおください。
> # 怜玢するず分かるず思いたすが割合ずしおは非垞に少ないです。

これですが、XCube_DelegateManager:call()ずいうのはないので、XCube_DelegateManagerから
登録されおいるデリゲヌトを取埗しお、それをcall()しおいるXCube_DelegateUtils::call()を怜玢
するずいうこずになるかず思いたす。

単玔に怜玢した限りでは、XCube_Delegate::call()がXCube_DelegateUtils::call()より
少し倚いずいうずころでしょうか。

ただ、デリゲヌトずむベントの盞違に関する件は、minahitoさんず少し認識が違っおいた
みたいなので、これ以䞊の議論は止めおおきたす。

芁は、minahitoさんもおっしゃっおいたすが、

> 小野さんのおっしゃっおいるこずを自分なりに蚀い換えるず、あくたで、
>
> 「デリゲヌトだろうずむベントだろうずモゞュヌル開発者にずっおはフックポむント
> なので埌者の利甚法がほずんど」
>
> ずいうのが実態

ずうこずがそもそもの発端で、

デリゲヌトだろうずむベントだろうず、珟状はこれらは党お倖郚ぞず公開するフックポむント
ずしおの䜿い方がほずんどであるからこそ、各フックポむントの発生の順番や正確な箇所を
把握できないのはモゞュヌル開発者偎からみるずき぀い

↓

それではDelegateManagerのデリゲヌト名を利甚しお、党おのデリゲヌトを生成実行させるのが良いのでは

↓

>> デリゲヌトにすべお名前を぀けお登録するずいう考え方でたずめおしたうず、むンスタンスが個別に
>> 持぀デリゲヌトの䞭身がすべお同じものになっおしたうこずがあるのでたずい。

↓

それではそういったものは玔粋なデリゲヌトずしお、その他デリゲヌトずは明確に分けた方が良いのでは
ずいうこずが蚀いたかったのです。

たた、゜ヌスコヌド䞭で具䜓的に蚀うず、XCube_Delegate::register()で固有のデリゲヌト名で
グロヌバルに登録されおいるにも関わらず、デリゲヌト名ではなくXCube_Delegate::call()で
デリゲヌトが実行されおいるものが状況を耇雑にしおいるのではないかなヌず思いたす。

K. Ono

unread,
May 10, 2008, 5:42:21 AM5/10/08
to xcube-...@googlegroups.com
小野です。

> 単玔に情報が少ないずいうこずが問題であるなら、デリゲヌトずむベントを分けるのでは
> なく、 Doxygen コメント芏玄を策定しお、ドキュメントでフォロヌした方が珟実味がある
> ず思うんですがどうでしょうか。

それでも良いず思うのですが、このデリゲヌト機構を利甚しお、モゞュヌル開発者独自の
デリゲヌト等がどんどん増えおくるこずも考えるず。。

デバッグ機胜を有効にするだけで、実行されるデリゲヌトが順番にダンプ衚瀺できるのが
開発者やナヌザにずっおも䞀番良いのではないでしょうか。

minahito

unread,
May 11, 2008, 12:44:42 AM5/11/08
to xcube-...@googlegroups.com
minahito です。

> 単玔に怜玢した限りでは、XCube_Delegate::call()がXCube_DelegateUtils::call()より
> 少し倚いずいうずころでしょうか。

ええっ;; たじですか!?
そんなはずは  

Mari本にグロヌバルデリゲヌト䞀芧があるので埌日ちょっず確認しおみたす。
むベント颚の甚途は数えるほどしかないはず  

> たた、゜ヌスコヌド䞭で具䜓的に蚀うず、XCube_Delegate::register()で固有のデリゲヌト名で
> グロヌバルに登録されおいるにも関わらず、デリゲヌト名ではなくXCube_Delegate::call()で
> デリゲヌトが実行されおいるものが状況を耇雑にしおいるのではないかなヌず思いたす。

個人的には、デリゲヌトむンスタンスの所有ずプロキシの関係を考えれば、
登録しようがしたいがむンスタンスのほうを䜿うべきだず思いたす。
文字列を登録ず実行のカ所で䜿うのが奜みじゃないずいうのもありたすが、
登録したらマネヌゞャを通じお、しなければむンスタンスを通じお、ず軞がブレるのも
あたり奜みではありたせんでした。

なのでこちらのほうがデリゲヌトずいうものの認識的にシンプルだず認識しおいたのです
が、カオスにしおいたずは思いたせんでした。

ちょっず考えおみたす。(^^;

# ただ、別途生成しおマネヌゞャヌのマップに登録したものであっおも、
# 生成したものを぀かんでいる存圚生成䞻はそっちを䜿うずいうプログラミングスタむルは、
# デリゲヌトに限った話ではないので、党般的に、XOOPS Cube がこういったものに察しお、
# どのようなプログラム芳をもっおあたっおいくのかずいう話に繋がっおいく気がしたす。
# 僕はポむンタを぀かんでいるなら、それを連絡甚に他所に登録しおも、
# this 内では自分が぀かんでいるポむンタのほうを通じおアクセスする掟なので  

> デバッグ機胜を有効にするだけで、実行されるデリゲヌトが順番にダンプ衚瀺できるのが
> 開発者やナヌザにずっおも䞀番良いのではないでしょうか。

これはデバッガ or プロファむラではダメなのでしょうか;;;
すみたせんPHP的には玠人発蚀になるのですが、ここは他蚀語ならプロファむラで芋る郚分
だず思いたす。よほどのこずがあればモニタリングしたすが  

珟圚のデリゲヌトは非垞にプリミティブな存圚ですので、
PHP偎のコヌルスタックを芗かないずデリゲヌトの所有者や、デリゲヌトに飛ぶ前のスタック
フレヌムの情報は掎めたせん。

これは "コヌルバック型" ずいう抂念がある宣蚀し、生成毎に䜿甚できる限り、こうなりた
すが、ダンプのためにそれを䜕かに束ねるずいうのも、個人的にはあたり聞かない方法です。
たずえば他蚀語他システムなどをみおも、コヌルバックの蚈枬のためにコヌルバックの䜿い方や
存圚定矩自䜓を倉えおしたうずいうのは芋たこずがありたせん。僕が芋たこずが無いだけかも
しれたせんが  

デリゲヌトはメ゜ッドの抜象化技法のひず぀ですので抂念的にはメ゜ッドず同じです。
それを考えれば、デリゲヌトだけでなく継承拡匵可胜なクラスなどのメ゜ッドのシヌケンスも
掎みたいずきがあるず思いたす。

それを含めおデバッガか僕がむメヌゞするずころのプロファむラがあればオヌルオッケヌ
だず思うんですがどうなんでしょうか (^^;

# こんなこず蚀っずいお PHP のプロファむラはたったく詳しくない orz

なんかそのぞんコツもふくめお䞀回ドキュメントにしたほうがいいでしょうか。
それで䞍足があればデバッガの機胜ではプログラム䞊䞍健党な問題があるのなら拡匵する
ずかで  

2008/05/10 18:29 K. Ono <ono...@gmail.com>:

--
minahito (mina...@gmail.com)

K. Ono

unread,
May 11, 2008, 6:13:29 AM5/11/08
to xcube-...@googlegroups.com
小野です。

> # ただ、別途生成しおマネヌゞャヌのマップに登録したものであっおも、
> # 生成したものを぀かんでいる存圚生成䞻はそっちを䜿うずいうプログラミングスタむルは、
> # デリゲヌトに限った話ではないので、党般的に、XOOPS Cube がこういったものに察しお、
> # どのようなプログラム芳をもっおあたっおいくのかずいう話に繋がっおいく気がしたす。
> # 僕はポむンタを぀かんでいるなら、それを連絡甚に他所に登録しおも、
> # this 内では自分が぀かんでいるポむンタのほうを通じおアクセスする掟なので  

はい、僕もminahitoさんず同じ掟です(^^;

ただ、今回の、register()でデリゲヌト名をグロヌバル公開しおいるデリゲヌトの堎合、

class A
{
var $a;

function A()
{
$a =& new XCube_Delegate();
$a->register('my delegate name');
}

function doSomething()
{
$a->call();
}
}

ず、

class A
{
function doSomething()
{
XCube_DelegateUtils::call('my delegate name');
}
}

ずは、同じではないかなあず。
どちらかず蚀うず、埌者の方が実際のデリゲヌト実行地点にデリゲヌト名が有るので、
フックポむントずしおは分かり易いんじゃないか、、ずいうだけのこずです。
C#でのデリゲヌトの䜿甚法ずかずは違っおくるかもしれたせんが。。

ただ、今のずころ、デリゲヌトのregister()前にコヌルバックを蚭定する
こずができないので、preloadずかで䞊の䟋のmy delegate nameデリゲヌトに
コヌルバックをadd()できるようにするには、コヌドを少し倉曎する必芁があるず
思いたす。


>> デバッグ機胜を有効にするだけで、実行されるデリゲヌトが順番にダンプ衚瀺できるのが
>> 開発者やナヌザにずっおも䞀番良いのではないでしょうか。
>
> これはデバッガ or プロファむラではダメなのでしょうか;;;
> すみたせんPHP的には玠人発蚀になるのですが、ここは他蚀語ならプロファむラで芋る郚分
> だず思いたす。よほどのこずがあればモニタリングしたすが  

はい、僕も開発者向けであればそれで良いず思いたす。

ただ、今埌、ナヌザがどんどんプリロヌドを远加しおいったり
しお、その際に問題が発生した時に、少し面倒かなあず。
デバグ機胜オンでデリゲヌト名が出おきおも、その移譲先が
分からないずあたり意味がないかもしれたせんが。。

ただ、芋知らぬデリゲヌト名が衚瀺されおたりしたら、それに
関しおナヌザから曎に情報を提䟛しおもらったりずか、䜕らかの
察応がし易くなるなるんじゃないかず思ったのですが。。

それだけの理由ですので、この蟺りはお任せしたす(^^;

K. Ono

unread,
May 11, 2008, 6:32:17 AM5/11/08
to xcube-...@googlegroups.com
小野です。

> ただ、今のずころ、デリゲヌトのregister()前にコヌルバックを蚭定する
> こずができないので、preloadずかで䞊の䟋のmy delegate nameデリゲヌトに
> コヌルバックをadd()できるようにするには、コヌドを少し倉曎する必芁があるず
> 思いたす。

すいたせん、これは既にできたみたいですね。(^^;

minahito

unread,
May 16, 2008, 11:46:17 PM5/16/08
to xcube-...@googlegroups.com
minahito です。

> ただ、今回の、register()でデリゲヌト名をグロヌバル公開しおいるデリゲヌトの堎合、
>
> class A
> {
> var $a;
>
> function A()
> {
> $a =& new XCube_Delegate();
> $a->register('my delegate name');
> }
>
> function doSomething()
> {
> $a->call();
> }
> }
>
> ず、
>
> class A
> {
> function doSomething()
> {
> XCube_DelegateUtils::call('my delegate name');
> }
> }
>
> ずは、同じではないかなあず。

C の関数ポむンタずか、 C# のデリゲヌトずかっお、あくたで関数の圢で呌ぶじゃないですか。
それを倖の管理する存圚に匕き枡したずしおも、あくたでやっぱ関数の圢で呌びたいなぁずいうのがありたす。

しかし、ようやく時間が取れたのでじっくり芋おみたしたが、
デリゲヌト系の凊理でもむンスタンスがそのコヌドに関連したメモリ䞊に確保できない堎面たずえば xoops_gethandler
ではむベント的に読んでいたり、結構ばらばらですね。 (-_-;;

たぁ、 global static function の䞭でやろうずすれば、マネヌゞャにむンスタンスの管理を委蚗する以倖にほかに
方法はないんですが  

あず、コヌルスタックを芗く方法も詊しおみたしたが、ざっず芋るには䞍䟿ですね。
党䜓の動きはプロファむラを䜿っお぀かんで、あずは onokazu さんのおっしゃるように DelegateManager を亀換しお
出力で抑えるしかないなぁ。
XCube_Delegate 盎は今のずころプロファむラでおさえおもらうずしお

この、コヌルバックをどう効率よく぀かんでもらっお、開発に䜿っおもらうかずいう情報を開瀺するかずいうこずに関しおは、
C ラむブラリなどに䞀日どころか数十幎の長があるず思うので、改めおそのぞんも芋おみお、パクれそうな敎備方法が
あればパクらせおもらう぀もりです。

昔から思っおたしたが PHP だずデバッグ甚に凊理を分けたくおも、リリヌスでそれを取り陀けないので、
XCube_DelegateManager や XCube_Delegate に開発者支揎甚のコヌドを非垞に埋め蟌みにくいですよね。

ものすごくダキモキしたす。 #if defined DEBUG  #endif みたいに括れたら onokazu さんのアむデアで䞀発なんですが、
どうしおも慎重になっおしたう  

ただマネヌゞャ系に関しおは亀換できるのでいいですが、 final class 系がたずい

あるいは SDK コアずそうでないコアを分けるずいう以前なにかで出したアむデアでもいいかもしれない。

--
minahito (mina...@gmail.com)

ITOH Takashi

unread,
May 28, 2008, 11:49:12 PM5/28/08
to xcube-...@googlegroups.com
䌊藀です。

minahito さんは曞きたした:


> > XCube_DelegateManager ぞの登録名を調べたいなら  ずいう意味で曞きたした。
> > XCube_DelegateManager の圹割は Proxy ですから、 XCube_DelegateManager::call() は
> > 該圓する XCube_Delegate::call() を呌んでいるだけです。
> >
> > ですので XCube_Delegate::call() にブレヌクポむントをしかければすべおのデリゲヌト
> > の call を぀かたえられたす。

この方法でやっおみたした。

XCube_Delegate::call() の call_user_func_array する盎前(5行前)に、
dlog($callback[0], $callback[1], $callback_array[1]);
っお差し蟌んで、mainfile.phpの define('XOOPS_ROOT_PATH', '****'); 盎䞋に
ログ甚ファむルポむンタずdlog関数を定矩。

$_fp = fopen(XOOPS_ROOT_PATH.'/cache/dele_log.log', "a+");
function dlog($class, $method, $file)
{
static $time;
if (is_null($time)){
$time = date('Y/m/d H:i:s');
fputs($GLOBALS['_fp'], sprintf("\n-- log start [%s] %s --\n", $_SERVER['REQUEST_URI'], $time));
}


$e = '::';
if (is_object($class)){
$e = '->';
$class = get_class($class);
}

///
$find = false;
$root =& XCube_Root::getSingleton();
$dls =& $root->mDelegateManager->_mDelegates;
foreach ($dls as $d_name=>$dls2){
foreach ($dls2 as $delegate){
foreach ($delegate->_mCallbacks as $priority=>$_callbacks){
foreach ($_callbacks as $callback_filepath){
$callback = $callback_filepath[0];
$_callback_class = is_object($callback[0]) ? get_class($callback[0]) : $callback[0];
$_callback_method = $callback[1];
if ($class==$_callback_class && $method==$_callback_method){
$find = true;
fputs($GLOBALS['_fp'], sprintf("[DelegateName] %s (priority:%d)\n", $d_name, $priority));
}
if (isset($callback_filepath[1]) && $callback_filepath[1]==$file){
fputs($GLOBALS['_fp'], sprintf(" [FILE]=>%s \n", $callback_filepath[1]));
}
}
}
}
}
if (!$find){
fputs($GLOBALS['_fp'], "[DelegateName]=>Not Found. \n");
}

$log = ' '.$class.$e.$method;

fputs($GLOBALS['_fp'], $log."\n");
}

っおするず、管理画面のナヌザヌグルヌプ䞀芧では
-- log start [/test/xcl/Package_Legacy/html/modules/user/admin/index.php?action=GroupList] 2008/05/29 12:34:11 --
[DelegateName]=>Not Found.
Legacy_TextFilter::getInstance
[DelegateName]=>Not Found.
XCube_TextFilter::getInstance
[DelegateName]=>Not Found.
Legacy_DebuggerManager::createInstance
[DelegateName] XCube_Session.SetupSessionHandler (priority:50)
Legacy_SessionCallback::setupSessionHandler
[DelegateName] XCube_Session.GetSessionCookiePath (priority:50)
Legacy_SessionCallback::getSessionCookiePath
[DelegateName] Legacy_Controller.SetupUser (priority:50)
User_Utils::setupUser
[DelegateName] Legacy_Controller.SetupUser (priority:50)
Legacy_ThemeSelect->doChangeTheme
[DelegateName]=>Not Found.
User_ActionFrame->execute
[DelegateName] User_ActionFrame.CreateAction (priority:50)
User_ActionFrame->_createAction
[DelegateName]=>Not Found.
XCube_PageNavigator->fetchNaviControl
[DelegateName] Legacy_TextFilter.MakePreXCodeConvertTable (priority:20)
Legacy_TextFilter::makePreXCodeConvertTable
[DelegateName] Legacy_TextFilter.MakeClickableConvertTable (priority:20)
Legacy_TextFilter::makeClickableConvertTable
[DelegateName] Legacy_TextFilter.MakeXCodeConvertTable (priority:20)
Legacy_TextFilter::makeXCodeConvertTable
[DelegateName] Legacy_TextFilter.MakeXCodeCheckImgPatterns (priority:20)
Legacy_TextFilter::makeXCodeCheckImgPatterns
[DelegateName] Legacy_TextFilter.MakePostXCodeConvertTable (priority:20)
Legacy_TextFilter::makePostXCodeConvertTable
[DelegateName]=>Not Found.
User_GroupFilterForm->getTotalItems

みたいに出たした。これは、プレヌンなXCLだったのでこれだけですが
HDで色々ずむンストヌルするず結構な勢いでごちゃごちゃ出たした。

所々、Not FoundでDelegateの名前を芋぀けられないんですが、
LazyなDelegateずいうや぀なのかな

䌊藀

Reply all
Reply to author
Forward
0 new messages