Location : Home > Languages > Perl > Package Title : Algorithm::C3 |
![]() |
Algorithm::C3 - C3 アルゴリズムを用いた階層の統合
use Algorithm::C3; # 古典的な菱形継承グラフを統合する。 # # <A> # / \ #<B> <C> # \ / # <D> my @merged = Algorithm::C3::merge( 'D', sub { # extract the ISA array # from the package no strict 'refs'; @{$_[0] . '::ISA'}; } ; print join ", " => @merged; # prints D, B, C, A
本モジュールは C3 アルゴリズムの実装である。自分のモジュールは様々な用途のために頻繁にコピー&ペーストを行うので元の自分のモジュールを壊してしまった。クラス構築やメタモデル周りの解決のために C3 を用いることが多いが、優先順位を保持して依存したままで依存解決にも適用できる。
以下は Class::C3 モジュールからとった C3 の簡単な説明である。詳しくは参考資料及びそこに記されるリンク先を見よ。
C3 とは何か?
C3 は複数の敬称の元でのメソッド解決のために提供されたアルゴリズムの名前である。これは最初、言語 Dylan(詳しくは参考資料及びそこに記されるリンク先を見よ。)で導入され、Python 2.3 における新しい型のクラスのためのMRO(Method Resolution Order)として採択された。
最近の動きとしては Perl 6 クラスの標準的な MRO として採択され、Parrot オブジェクトにおけるデフォルトの MRO である。
C3 はどのように機能するのか
C3 は常にローカルな優先純を保持する。これは本質的にサブクラス出現前にはクラスは現れないことを意味する。例えば古典的な菱形継承パターンを考えてみよう。
<A> / \ <B> <C> \ / <D>
標準的な Perl 5 MRO であれば (D, B, A, C) となるであろう。C が A のサブクラスであるにもかかわらず C の前に現れている。しかし C3 MRO アルゴリズムでは MRO (D, B, C, A) を返し、このような問題は生じない。
これは極めて簡単な例であり、さらに複雑な例と詳しい説明は参考資料及びそこに記されるリンク先を見よ。
merge ($root, $func_to_fetch_parent)
最も上となる $root ノードを取り、CODE 参照(例として上記概要を見よ)または線形化されたあらゆる項目を呼び出す際のメソッド名を含む文字列に戻ってくるために $func_to_fetch_parent を取る。この例は以下の通り。
{ package A; sub supers { no strict 'refs'; @{$_[0] . '::ISA'}; } package C; our @ISA = ('A'); package B; our @ISA = ('A'); package D; our @ISA = ('B', 'C'); } print join ", " => Algorithm::C3::merge('D', 'supers');
$func_to_fetch_parent の目的は正確に $root の親へと統合する方法を提供することである。これは C3 の稼動に必要である。
著者はコードカバー試験時に Devel::Cover を用いており、その結果は以下の通りである。
------------------------ ------ ------ ------ ------ ------ ------ ------ File stmt bran cond sub pod time total ------------------------ ------ ------ ------ ------ ------ ------ ------ Algorithm/C3.pm 100.0 100.0 55.6 100.0 100.0 100.0 94.4 ------------------------ ------ ------ ------ ------ ------ ------ ------ Total 100.0 100.0 55.6 100.0 100.0 100.0 94.4 ------------------------ ------ ------ ------ ------ ------ ------ ------
Stevan Little, stevan@iinteractive.com
Copyright 2006 by Infinity Interactive, Inc. http://www.iinteractive.com
本ライブラリはフリーソフトウェアであり、Perl 本体と同等の条件で修正/再配布してもよい。
![]() |
Updated : 2007/02/27 |