[Maple-dev: 57] インジェクションの簡素化

Back to archive index

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 


Maple-dev メーリングリストの案内
Back to archive index