TAKAHASHI Kunihiko
takah****@knosp*****
2005年 10月 17日 (月) 22:57:17 JST
高橋(kunit)です。 #私もまけずにながーくなりました。 #みなさん、がんばって読んでくださいまし。 On Sun, 16 Oct 2005 22:33:42 +0900 Hawk <w3l_admin****@hawk*****> wrote: > 1) publicなプロパティに対するインジェクションを認めるか > > 2) setterだけの場合にインジェクションを認めるか(DI2方式) > > 3) publicなプロパティに対するインジェクションは > 意図しないインジェクションが発生する危険や、 > DIによって設定された値をリクエストパラメータで > 上書きしてしまう危険が比較的大きい。どう対処するか > > 先に結論を述べますと、以上の点に対する私の提案は > 1), 2) をともに認め、かつ 3) に対しては > 「リクエストパラメータのインジェクションにおいては、 > 対象となるプロパティの値が null の場合のみに限定する(※1)」 > ことで対処しようというものです。 > ここまで異議なしです。 setterがある場合にプロパティの名前まで見に行く必要は 別にないかと思いますね。(去年の今頃はいると思っていたが あっさり宗旨替え) > publicなプロパティに対するインジェクションについて、 > まず異論はないだろうと思われる次の2点を暗黙的に前提としています。 > 4) setterがある場合はsetterを優先する > 5) 値がオブジェクトの場合は参照を代入する > もう一つ分かりやすいルールということで、guesswork 0.0.1 系で 採用されていた以下のものを提案します。 6) 外部から値をセットされては困るプロパティはアンダースコア(_)ではじめる これがあれば、基本publicなプロパティをバンバンつくってリクエスト パラメータやDIContainerからのインジェクションをうけつつ、 受け取った際に合わせて特殊なことをしないといけないときには setterを準備して、上書きされたくないものをアンダースコアで よけるという分かりやすいルールになるかなと。 ここまでは、今までの記法を変更・拡張せずに新しくつくるものは楽が できるようにというアプローチでしたが、記法を拡張するとすると 熊倉さんのブログで提案されていたものもちょっとMixしてみるのは どうかなと思います。「リクエストパラメータをインジェクションしたいと いうのを明示することもできるようにする」というものです。 (合わせ業のSessionへも同時書き込みってのはどうしますかね・・・) #元ねたはこちら ⇒ http://hatotech.org/kumatch/archives/000522.html 例えば、こんな感じ --- ここから [Action] mail = request:m --- ここまで 何らかの制限下(例えば携帯案件)でリクエストパラメータをそのまま 変数名にしたくない(GETしか使えない状況に追い込まれて、パラメータを 「m」1文字にしないとやばい・・・みたいな)ときには、上記のように すると「m」を「mail」という真っ当なプロパティに代入できると。 これもあると便利かなと思います。(熊倉さんがそのような修正をされている のは、まさしく携帯案件でのこういうパターンなんじゃないかと想像しつつ) #InjectRequestの「foo = 」でとぎれてるものは「foo = request:foo」の #省略系ってことで・・・ あと(まだあるんかい・・・)、以前ブログでは書いたんですが、 「ref:」表記に関して、受け取るものとDIContainer内の別名が同じ場合は 省略可能にできないかと。つまり「bar = ref:bar」ならば書かなくても いいってやるとさらに手間がはぶけるかなと。 受け取る変数名とDIContainer内の別名をわざわざ変えたい場合のみ明示する ってので困ることはないかなと思うんですが、困ることってありますかね? とりあえず思うことをつらつらと書いてみました。 ご意見あれば、どんどんいただければと思います。 #Maple 3.1はこのインジェクション周りと初期化のdefineたくさんと #ディレクトリ定義あたりをばっさり変えてリリースかなと思っています --- TAKAHASHI Kunihiko KNOSPEAR Inc.