Hawk
schol****@hawkl*****
2006年 7月 24日 (月) 00:00:47 JST
Hawkです。 Mapleコア内には、本来インスタンスメソッドとして呼び出すべきなのに、 なぜかクラスメソッドとして呼び出しを行っているために 継承による動作の変更が不可能になっている箇所が存在します。 (参考:http://d.hatena.ne.jp/katase_n/20060722#1153566053) 私自身この問題は把握しながら”見て見ぬ振り”をしてきたのですが、 3.2以降はコアを拡張する機会も増えると思われるため、 できるだけこうした”ツッコミ所”は無くしておくべきと考えました。 そこで全てのクラスメソッドについて調査を行い、 ・クラスメソッドで正しいと思われるもの ・恐らくインスタンスメソッドが正しいと考えられるもの ・ほぼ確実にインスタンスメソッドが正しいと考えられるもの の3つに分類し、後二者については TRY-3_2 ブランチ上で インスタンスメソッドに変更しました。 この変更によって動作が変わることはないはずですが、 何か見落としがあるかも知れないので、 できるだけ確認をお願いします。 なお、クラスメソッド呼び出しの抽出は次のように行いました。 grep '::' */*.class.php \ | perl -ne 'print "$1\n" if(m/(\w+::\w+)/)' \ | sort | uniq | grep -v 'parent::' <クラスメソッドで正しいと思われるもの> BeanUtils::getGetterVars BeanUtils::getMethods BeanUtils::getVars BeanUtils::setAttributes DIContainerFactory::create DIContainerFactory::getContainer DIContainerFactory::getInstance Flexy_Flexy4Maple::globalOptions LogFactory::getInstance LogFactory::getLog Smarty4Maple::getInstance <恐らくインスタンスメソッドが正しいと考えられるもの> ActionChain::makeNames DIContainer::makeNames 機能から考えると、 元々クラスメソッドとしての使用を意図していた可能性もあるが、 他クラスからは(DIContainerを通して)インスタンスメソッドとして 呼び出されており、クラスメソッドとして使用されているのは自クラス内だけと いう矛盾した状態にある。 有用性から言えば、インスタンスメソッドにした方が良い。 <ほぼ確実にインスタンスメソッドが正しいと考えられるもの> Logger_SimpleFile::output ConfigUtils::_getConfig Controller::_createDIContainer ConverterManager::_buildConverterList ConverterManager::_convert Filter_DIContainer::_createContainer ValidatorManager::_buildValidatorList ValidatorManager::_validate いずれも自クラス内だけでしか使用されておらず(privateなものは当然)、 用途から考えてもインスタンスメソッドにすべきと考えられる。 -- Hawk : { web site : http://blog.hawklab.jp/ }