whichをUNIVERSALに入れた理由は?

404 Blog Not Found:perl - UNIVERSAL::which

どのクラスで定義されたメソッドなのかを調べる事ができるモジュール。
DBIx::Classとか使ってるとたまにこのメソッドはいったい何処で定義されてるんだ?という要求に駆られる。
そんなとき、こいつぁは非常に便利だ。
ただ、便利なんだけどUNIVERSALなのである。
なんでUNIVERSALにする必要があったのだろうと。

僕自身Perl界についてまだまだ知識が浅いのでもしかしたら馬鹿な事言っているのかもしれないがそれにしてもUNIVERSALである意味がわからない。
ここでUNIVERSAL::whichにするメリットって一体なんだろう?

  • 記述がCoolでカコイイ!

うん、それは事実だ。(かなり主観^^)
特にUNIVERSAL::requireとかはevalを使わずに書く事ができるしステキ。

 use UNIVERSAL::require;
 my $pkg = 'Hoge::Class';
 $pkg->require or die $@; # 超Cool!

その点ではUNIVERSAL::whichも確かに同じなんだけど、

 use Hoge::Class;
 use UNIVERSAL::which;
 my $name = Hoge::Class->which('hoge');

何故か違和感を感じる。
単なる好き嫌いの問題じゃねーの?と問われればそうかもしれない。

と、納得しかけたんだけどなんとなく違和感を感じる理由がわかった。
それは使用用途にあるんではないかと思ったわけです。

UNIVERSAL::requireを使うという事は動的なロードをCoolに行いたいわけです、
これはあるクラスを設計する時点で「あー、このクラスでは動的ロードしたいからUNIVERSAL::require使かおーっと」
みたいな具合で予め使用する事がわかってる事が多いわけです。
つまり既存のクラスに対して使う事はあまりないと。

それに引き換えUNIVERSAL::whichはというと基本的にはデバッグ用途で使う事が想定されます。
という事は既存のクラスに対して使うわけで、その既存のクラスにはwhichメソッドがもうすでに存在してるかもしれません。

 package Hoge::Class;
 sub which {
     return 'uhooooooo';
 }

 use UNIVERSAL::which;
 print Hoge::Class->which('hoge'); # uhooooooo

となるとwhichメソッドを呼び出すために、

 use UNIVERSAL::which;
 print Hoge::Class->UNIVERSAL::which('hoge');

と書かなければならず、こんなのもはやCoolじゃねぇえよおおぉぉぉ(かなり主観^^)と嘆く結果になります。
てか結局の所、僕の好き嫌いの話になってますねこれ・・・。

とにかくあんまり安易にUNIVERSAL系のモジュールは増やして欲しくないなーってのが僕の個人的な思い。イヤなら使わなきゃいいじゃんってものその通りだけど実際whichは便利だし。
まぁ所詮デバッグ用なんでその場限りでしか使わないんだからUNIVERSALでもいいじゃんって思ったりもしますが。
でもそんなこと言い出したらClass::Inspectorに存在するメソッドの殆どがUNIVERSALにあったら便利だぜ!とか
もうなんでもかんでもUNIVERSALに入れれば便利じゃね?とかになって
というかUNIVERSALパッケージ内でプログラミングすれば便利じゃね?とかになって、ってなるわけねー!!!!

・・・で、結局何が言いたかったっていうとPerlハッカーな人たちから見たUNIVERSALで提供すべきメソッドとそうでないメソッドの境目ってなんなんでしょう?ってことです。
Perl凡才な僕の主観としてはrequireはUNIVERSALにあっても良いけどwhichは別クラスにする、例えばClass::Inspectorあたりにつっこまれてた方が幸せっぽいなーとか思ったりします。