C3アルゴリズムはDBIx::Class、PythonやPerl6でも使われているMRO (Method Resolution Order)を決定するための仕組みです。 Class::C3はどんな挙動をするのか、SUPERやNEXT.pmとの違いはなんなのかから、簡単にClass::C3を使ってコンポーネント化されたフレームワークを作る事に関して。
Summary? You can do it! I wrote a test script to try this: package A; sub a { print "A->a\n" } package B; use Class::C3; @B::ISA = ('A'); sub a { print "B->a\n"; $_[0]->next::method(); } At this point, everything is fine. B->a prints B->a, A->a. Now, let's add NEXT to the mix: package C; use NEXT; @C::ISA = ('A'); sub a { print "C->a\n"; $_[0]->NEXT::a; } package D; use NEXT; @D::ISA = ('B', 'C');
Class::C3 を使うと継承順がかなりセンシティブになる。 たとえば、普段から Class::Accessor::Fast と Class::Data::Inheritable を同時に継承する場合にどちらが先かというのは、そんなに意識しないと思います。(僕はしません) でも、Class::C3 を使う場合は、同じツリー内に継承順の矛盾があると実行できなくなってしまいます。(d:id:amachang:20061007:1160232763) たとえば、以下のクラス郡とクラス群は同時に Class::C3 で呼べないことになる。 Class::Data::Inheritable が先 http://google.com/codesearch?q=Class%3A%3AData%3A%3AInheritable%5Cs%2BClass%3A%3AAccessor%3A%3AFast Cl
しばらくぶりにCatalystを触っていたら、なにやらちょこちょこ変更されつつあるようなので、自作プラグインもちょこちょこ書き換えました。 configに使うキーにモジュール名を使う Catalyst::Plugin::ConfigLoader - Load config files of various types - metacpan.org "file" config parameter has been deprecated in favor of "$c->config->{ 'Plugin::ConfigLoader' }->{ file }" とか言われるようになったので、設定ファイルを書き換えた。 Catalyst::Plugin::ConfigLoaderで環境毎に設定ファイルを用意する - ヒルズで働く@robarioの技ログもちょっと修正した。 自作プラグインの設定も
はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28
最近Develop版が頻繁にアップされていたClass::C3ですが、とうとう正規版がアップされましたね。 Class-C3-0.16 Class-C3-XS-0.02 ちなみにhttp://d.hatena.ne.jp/fbis/20070319/1174296128もFIXされてます。 ってことで速度的にどれくらいパワーアップしたのか気になったのでベンチとってみました。 ソースはこんな感じ。とりあえず比較のために普通にSUPER使った場合とのベンチ。 use Benchmark qw(cmpthese timethese :hireswallclock); package MyBase; sub new { bless {} , shift } sub hoge { } package MyChildNext; use base qw/MyBase/; use Class::C3; s
CatalystとかDBICを理解しようとすると頻繁に出てくるClass::C3。継承ツリーをどうにかするものらしいけど、挙動を把握するのは難しそうだなーという印象でした。 「CatalystもそのうちNEXTからClass::C3ベースに変わるし」なんて話題が出ても、そもそもどっちも分かってないのでちんぷんかんぷんです。 したら、牧さんが去年のYAPCでClass::C3について語ってるじゃありませんか。これすげー、めちゃめちゃ分かりやすい。 (Ab)?using Class::C3 - YAPC::Asia 2007 Tokyo Sessions PHPは多重継承サポートしてないし、それ以前にPerl使ってたころはそもそもOOP自体ちゃんと理解できてなかったので、多重継承なんて考えたのは初めて。そんな自分の印象としては、むしろNEXTの挙動の方が不自然なように思えます。 具体的にはこん
DBIx::Class を少し使ったことがあったので Class::C3 をなんとなくで理解していたんです。(ふーん幅優先版の NEXT モジュールでしょ?みたいな感じで。) でも、これは絶対にちゃんと細かい挙動まで勉強しといたほうがいいと思いました。 多重継承とか mixin とかに強くなりたいなと C3 C3 というのは Python 2.3 のドキュメントに書いてある MRO(Method Resolution Order 多重継承したときにどんな感じでメソッドを探索するかという順番) を決めるアルゴリズムで。Algorithm::C3 っていうのがそのアルゴリズムの Perl 実装なんです。 それに! Parrot でも使えるみたいだし! ちなみに MRO ってこんな感じね A には add というメソッドがある B にも add というメソッドがある C は A と B を多重継
DBIC関連の基底クラスとも言えるモジュールがClass::C3::Componentisedです。 C3ベースのコンポーネント化されたクラスモジュールを作る際のベースですね。 1.0003をテキストとします。 load_components() sub load_components { my $class = shift; my $base = $class->component_base_class; my @comp = map { /^\+(.*)$/ ? $1 : "${base}::$_" } grep { $_ !~ /^#/ } @_; $class->_load_components(@comp); } component_base_classってのはSynopsisにもありますが、基本的には決めうちの何か。例えばDBIx::Classとかって言う文字列を返す。 loa
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く