Hawk
w3l_admin****@hawk*****
2005年 10月 16日 (日) 22:33:42 JST
Hawkです。 3.1に向けた検討課題の一つ、インジェクションの簡素化についての 議論および提案です(かなり長くなってしまいました…)。 まず現状および論点。 現在のMapleではDIContainerによるインジェクション、 InjectRequest/Actionフィルタによるリクエストパラメータのインジェクショ ン、ともに「publicなプロパティが存在し、かつ対応するsetterが存在する」場 合にのみ実行されるようになっています。 この制限に対して「逐一setterを書くのが面倒くさい」という不満が度々聞かれ ますし、私自身もまたそう感じています。 そこでこの制限をどう緩和するか、議論すべき点として次のような点が挙げられ ると思います。 1) publicなプロパティに対するインジェクションを認めるか 2) setterだけの場合にインジェクションを認めるか(DI2方式) 3) publicなプロパティに対するインジェクションは 意図しないインジェクションが発生する危険や、 DIによって設定された値をリクエストパラメータで 上書きしてしまう危険が比較的大きい。どう対処するか 先に結論を述べますと、以上の点に対する私の提案は 1), 2) をともに認め、かつ 3) に対しては 「リクエストパラメータのインジェクションにおいては、 対象となるプロパティの値が null の場合のみに限定する(※1)」 ことで対処しようというものです。 そしてこの提案を簡潔に表現するために、 また実際に試せるようにするために用意したのが、添付ファイル中の BeanUtils::setAttributes2 です(※2)。 大まかな動作を掴むための単体テスト(simpletest)も含まれています。 BeanUtils::setAttributes2( &$instance, $attributes, $varOnly = false, $setterOnly = false, $overridableValues = array(null) ) =引数の意味= $instance, $attributes オリジナルと同じ bool $varOnly publicなプロパティに対するインジェクションを行うか bool $setterOnly setterだけの場合にインジェクションを行うか array $overridableValues publicなプロパティに対するインジェクションを行う場合に、 上書きを許可する値を指定する(型もチェックされる)。 省略時は array(null) つまり対象となるプロパティの値がnullの場合のみ インジェクションを行う。 空の配列か配列以外の値を渡すと”制限無し” このsetAttributes2を使うと、例えば現状のMapleは setAttributes2($instance,$attributes, false, false) DI2は setAttributes2($instance,$attributes, false, true) と表現できます。そして私が提案したいのは次の通りです。 DIContainerによるインジェクション: setAttributes2($instance,$attributes, true, true, array()) InjectRequestによるインジェクション: setAttributes2($instance,$attributes, true, true, array(null)) Actionによる設定ファイル値のインジェクション: setAttributes2($instance,$attributes, true, true, array()) Actionによるリクエストパラメータのインジェクション: setAttributes2($instance,$attributes, true, true, array(null)) なお setterのみの場合のインジェクションについてですが、 setterの本来の役割は代入操作を抽象化することにあるのですから、 publicなプロパティとは独立して扱うのは理にかなっていると考えます。 というわけで長くなりましたが、ご意見お待ちしております。 ※1 この提案に至る経緯は以下を参照してください。 http://d.hatena.ne.jp/hawkring/20051001/1128166166 http://d.hatena.ne.jp/hawkring/20051009/1128862221 http://d.hatena.ne.jp/hawkring/20051011/1129029201 ※2 publicなプロパティに対するインジェクションについて、 まず異論はないだろうと思われる次の2点を暗黙的に前提としています。 4) setterがある場合はsetterを優先する 5) 値がオブジェクトの場合は参照を代入する またこのBeanUtils::setAttributes2は仕様を議論するための道具として 用いることを主目的としており、実装の提案ではありません。 単体テストについても同様です。 -- Hawk : { web site : http://www.hawk.34sp.com/ , diary : http://d.hatena.ne.jp/hawkring/ } -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: BeanUtils.tar.gz 型: application/octet-stream サイズ: 2747 バイト 説明: 無しDescargar