[Seasar-user:2102] Re: injectDependencyについて

Koichi Kobayashi koichik
2005年 6月 6日 (月) 00:40:12 JST


小林 (koichik) です.

On Wed, 01 Jun 2005 16:21:27 +0900
Masataka Kurihara <[E-MAIL ADDRESS DELETED]> wrote:

> ・ S2ContainerImplの中で、Componentをとるところをちょっと変更
> 
>   private static final NullComponentDef NULL_COMP = 
>       new NullComponentDef();
>   public ComponentDef getComponentDef(Object key)
>       throws ComponentNotFoundRuntimeException {
>     ComponentDef cd = getComponentDef0(key);
>     if (cd == null) {
>       cd = NULL_COMP;
>     }
>     return cd;
>   }
> 
> ・ NullComponentDefをつくる
> public class NullComponentDef extends SimpleComponentDef {
>   (コンストラクタとか、いろいろ実装の記述省略...)
> 
>   public Object getComponent() {
>     throw new ComponentNotFoundRuntimeException();
>   }
> }

これはちょっと難ありではないかと.実装ではなく仕様が変わってしまいます.
# API のシンタックス的には変わってないから余計まずいと思います.
getComponentDef() を呼び出した後に必ず getComponent() するとは限りません.
単に実装クラスを取得したいとか,メタデータを取得したい場合もあるでしょう.
この変更を行うと,getComponentDef() した後に NULL_COMP と比較しないと本当に
コンポーネントが定義されているか分からなくなってしまいます.

getComponent() については従来と同じ振る舞いとなるように配慮されているようなので,
getComponentDef() はパブリックな API ではないという認識なんでしょうか?
しかし,getComponentDef も S2Container というインタフェースに定義された
パブリックな API の一部ですから,その振る舞いを変えるのはまずいと思います.

ここでの意図は,コンポーネント (またはコンポーネント定義) が見つからない場合に
例外がスローされるというポリシーをカスタマイズしたいということなのでしょうか?
それとも,例外を伴わずにコンポーネント (またはコンポーネント定義) を取得する
手段が欲しいということなのでしょうか?

前者なら,個人的には賛成しかねます.カスタマイズの範疇ではないと思うので.
後者ならありかな.現在の getComponent0() / getComponentDef0 をリネームして
パブリックにする感じ.findComponent() / findComponentDef() あるいは
getComponentNoException() / getComponentDefNoException() あたりか.
hasComponent() / hasComponentDef() を使えば定義の有無はチェックできるので,
どうしても必要かというと微妙ですが,コンテナ階層が深い場合に hasComponent()
してから getComponent() するより findComponent() (仮称) 一発で済ませる方が
精神的にいい感じなので,あってもよいかと.


-- 
<signature>
    <name>Koichi Kobayashi</name>
    <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>




Seasar-user メーリングリストの案内