永井@知能.九工大です.

From: Urabe Shyouhei <shyouhei / ruby-lang.org>
Subject: [ruby-dev:37989] Re: proposal: Module#method_adding
Date: Fri, 13 Feb 2009 12:19:50 +0900
Message-ID: <4994E72A.9070301 / ruby-lang.org>
> フックが呼ばれる度にMethodオブジェクトを生成するというのが著しく非効率
> という話を聞きます。
> method_addedが少々遅いくらいがどうした、というのも見識の一つとは思いますが。

method_added が定義されていない限りは
Method オブジェクトは作らなくてもいいですよね.
Method の有無を確認した後で Method オブジェクトを作ればいいはずです.

method_added の有無を調べるステップはいずれにせよ一度は必要なので,
先に有無を調べておくこと自体はコストアップにはならないと思います.

method_added を本当に呼ぶことはさほど頻繁にはないでしょうから,
本当に呼ぶ必要があるときに少しくらい遅くても問題はないでしょう.

symbol だけを受け取る method_adding/method_added の場合には,
method_adding では定義される予定の method が得られず,
method_added では再定義前の method が得られません.
method_adding/method_added の両方での操作が必要になるかもしれません.
その場合,旧 method の Method オブジェクトを
method_adding から method_added に引きわたすための変数も
用意しなければならないかもしれません.
一つのメソッドで両方の Method オブジェクトを受け取れるなら,
ユーザは楽ができます.(^_^)

とはいえ,method 定義時に内部で
 (1) hook の有無を検査
 (2) hook が存在したなら,旧メソッドの Method オブジェクトを生成
 (3) method を定義
 (4) hook が存在したなら,新メソッドの Method オブジェクトを生成して
     hook の呼び出し
というステップを経なければいけないのは面倒なので,
method_adding と method_added とを組み合わせてなんとかできるなら
それで十分だろうという主張も理解できます.

私は Method オブジェクトを受け取れる方が嬉しいように思えますが,
「そうあるべき」とまで強くは主張しません.
判断はお任せします.

# ...って,無責任 (^_^;
-- 
永井 秀利  (nagai / ai.kyutech.ac.jp)
九州工業大学 大学院情報工学研究院 知能情報工学研究系