「依存性の注入」をあなたの言葉で説明してください。URLは結構です。

回答の条件
  • 1人2回まで
  • 登録:2006/10/28 02:33:49
  • 終了:2006/11/01 07:57:46

ベストアンサー

id:flakwing No.4

flakwing回答回数2ベストアンサー獲得回数12006/10/28 11:01:16

ポイント70pt

設定ファイルで動きを変えることです。


例えるなら運動会の借り物競争です。

メモに書いてあるものを借りてきてゴールするという流れは決まっていますが、メモの内容によって結果(=借りてきた物、人や着順など)が変わります。

id:westfish

設定ファイルでウィンドウのタイトルに表示する文字列を変えるのも、大げさに言えば文字列オブジェクトへの依存性を実行時に注入しているわけですね。

2006/11/01 07:55:52

その他の回答(6件)

id:ma-kanoh No.1

ma-kanoh回答回数155ベストアンサー獲得回数42006/10/28 03:16:35

ポイント10pt

例えば、あるAという関数の「記述方法」だけ決めます。

そのAはどのように規定してもいいけど、「規定できる」こと

だけ決めます。

また、Aの呼び出し(正確には取り出し)方法も決めます。

a.iniファイル内で記述しようと思うと。

int A(int a,int b) == realA

とa.iniを書いたとすると、A(realA)はa,bで呼び出し、値がintで帰ってくる。

a.iniファイル内に

double A(void) == realB

と書くとA(realB)は引数がなく、Aを呼び出すとdoubleで返る。

で、Aを呼び出す側は。

Afunc = invoke("A",a.ini)

#Afunc(a,b)とも、Afunc()とも呼び出せる

と「invoke」だけ決めておく。

ということで「依存性の注入」は

・ある関数(==A)の「記述方法」を決める

・Aの呼び出し方(invoke関数)を決める

ことに相当します。

そうすれば、「Aの実装」と「Aを呼び出す側」をだいたい分離することが出来る。

Aを呼び出す側が、a.iniの内容を知る必要があるのが不満だけど。。。。それもAnnotationを使えば自動でできるし。

あえてC言語的に説明してみました。

id:westfish

どのあたりがC言語的なのかよくわかりませんが、少なくとも「double A(void) == realB」や「Afunc = invoke("A",a.ini)」は有効なC言語の構文ではないように思います。独自定義の構文でしたら解説をよろしくお願いします。

2006/10/28 04:24:50
id:takahiro_kihara No.2

狂人日記回答回数833ベストアンサー獲得回数112006/10/28 03:53:37

一言でまとめるなら、「アナタ、私を頼って良いのよ。」という甘いささやき。

(^_-)

「気を付けよう 甘い言葉と黒い罠?」

It's so dangerous.

So , 「逃げるが勝ち」if Me.

id:westfish

斬新な解釈ですが

字面だけの浅い理解ではポイントは差し上げられません。

2006/10/28 04:23:08
id:castle No.3

castle回答回数1011ベストアンサー獲得回数122006/10/28 04:28:47

人が他人に依存するとしたら、その相手の中に《自分にはない可能性》を見出したときではないでしょうか。

力でも優しさでも行動力でも、それが相手にとって「自分にはない」と自覚されているものだと効果的かもしれません。

異質だけど、自分にはないものを持っている相手が自分に味方して、欠けた部分を補ってくれるという安心感は大きな存在感を与えるものです。

同じ時間をすごして体験を積み重ねるなかで、その人の中で欠けている部分をそっと補うような言動をつづけることで、その人にとって自分という存在をなくてはならないものだと感じさせられるのではないかと思います。

id:flakwing No.4

flakwing回答回数2ベストアンサー獲得回数12006/10/28 11:01:16ここでベストアンサー

ポイント70pt

設定ファイルで動きを変えることです。


例えるなら運動会の借り物競争です。

メモに書いてあるものを借りてきてゴールするという流れは決まっていますが、メモの内容によって結果(=借りてきた物、人や着順など)が変わります。

id:westfish

設定ファイルでウィンドウのタイトルに表示する文字列を変えるのも、大げさに言えば文字列オブジェクトへの依存性を実行時に注入しているわけですね。

2006/11/01 07:55:52
id:hinyo No.5

hinyo回答回数4ベストアンサー獲得回数02006/10/28 13:01:59

ポイント20pt

分離しておいた設定オブジェクトを必要時に関連付けすること。

(短くてすみません)

id:NAPORIN No.6

なぽりん回答回数4719ベストアンサー獲得回数8712006/10/28 17:19:38

相互依存への誘惑と強制。

「仲良くなりたいから親切にする」という

素朴な行動の裏に潜む孤高への妬み。

id:hituziotoko No.7

ひつじおとこ回答回数6ベストアンサー獲得回数02006/10/29 22:22:49

ポイント20pt

※Javaでの例を示します。期待している解説とずれていたらごめんなさい

「依存性の注入」とは


まず、依存性とは何かと言うと、クラスAでの処理中にクラスBのメソッドを呼び出したり、

メソッドの引数としてそのクラスのインスタンスを必要とする事を言います。


つまり、クラスBのインスタンスが無ければ処理が完了しない訳ですから、別のクラスに依存していると言う訳です。


ここで、依存性の注入とはこの依存するクラスAに対して

外部から(クラスCから)クラスBのインスタンスを注入

する事を言います。


「注入」と言うとイメージが付きづらいと思いますが、簡単に言えばクラスBのインスタンスをクラスAに「渡して」あげる事を指します。


ここで、インスタンスを「渡す」には下記のような方法があります。


■setterの呼び出し

■コンストラクタによるセット


このように依存性の注入を主にに行うフレームワークとして Spring Seaser2 などが知られています。


これらのフレームワークは依存性の注入(Dependency Injection)の頭文字をとってDIコンテナと呼ばれています。

  • id:ma-kanoh
    >どのあたりがC言語的なのかよくわかりませんが

    オブジェクト指向はあくまで「関数+データ」が組になるから
    という意味です。

    上記の説明は「関数」だけにしてみました。

    本当の「依存性の注入」は「データ」の部分(だけ)もあります。
    説明としては難しいので省いてみました。
    #他の人の説明を引用するとsetter injectionでの定義になると思いますが。

    >double A(void) == realB」や「Afunc = invoke("A",a.ini)」は有効なC言語の構文ではないように思います。
    >独自定義の構文でしたら解説をよろしくお願いします。

    ええ、C言語ではありません。その「独自定義の構文」の導入を「依存性の注入」というのですが、、

    ・realBの定義の方法(呼び出される側の定義方法)
    ・Afuncの定義(呼び出す側の定義方法)

    の二つをあわせて「依存性の注入」と言うと、私は思っています。

    いままでは、APIという形で「呼び出される側」「だけ」
    を定義することが多かったのですが。

    それだと呼び出す側がAPIを熟知する必要があり、その意味での
    強依存性が多く、APIべったりになるわけですが。

    そうではなく、DI(依存性の注入)として「呼び出す側」(invoke関数を記述する側)と、「独自定義構文」をDIとして定義してしまえば、両方(呼び出す側and呼び出される側)が「いい感じ」になれることがDIのいいことだと思います。

    ・呼び出す側は必ずしもAPIべったり出なくてもいい
    ・呼び出される側は、ある意味適当にクラスを定義すればいい

    という意味で、「適度」に両者でDIすると、いい感じになれるところがいいことだと思います。

    #成功するかどうかは。。。
    #いい感じ、以上の説明が、今は無理だと、私は思います。
    #ちなみにDIとしての設計をちゃんとする必要は生じます。
    #そっちの方がAPIの設計より難しいと思うんだけど。。。

    それでも分かりにくい場合は(回答を見ると、外れすぎだし)
    自分でSeaserで、スパイクすると、少しは分かると思いますが。

  • id:westfish
    結局独自構文の解説はしてくださらないのでしょうか。私にとってはあなたが独自に定義した「double A(void) == realB」や「Afunc = invoke("A",a.ini)」は、例えば前者は==で後者は=ですけど、これはあえて異なる意味に使っている(C言語風にイコールと代入の意味で)のか、単に間違っているのかもわかりません。invokeが何をする関数なのかもわかりません。そもそも関数なのかどうかもわかりません。C言語の構文としては正しくないですからね。あなたがどういう意味でその構文を使ったかの説明がないと私にとっては「あwせdrftyふ」と書いてあるのと同じです。そこのところご配慮いただければうれしかったのですが…。でも、もう結構です。

    正直なところ割り振ったポイントがそれぞれの回答に対する私の評価です。他の方の回答を外れというのは他の回答者に失礼かと思います。
  • id:FM-SOFT
    import java.lang.reflect.Method;

    //----------------------------------------------------------------
    class A {
    public void method() {
    System.out.println("A#method");
    }
    }

    //----------------------------------------------------------------
    class B {
    public void method() {
    System.out.println("B#method");
    }
    }

    //----------------------------------------------------------------
    class C {
    Object obj;

    public void setObj(Object obj) {
    this.obj = obj;
    }

    public void method(String s) throws Exception {
    Class ccc = obj.getClass();

    Method method = ccc.getDeclaredMethod(s, new Class[0]);

    method.setAccessible(true);

    method.invoke(obj, new Object[0]);
    }
    }

    //----------------------------------------------------------------
    public class D {
    public static void main(String[] args) throws Exception {
    A m = new A(); //依存先の切り替え

    // B m = new B(); //依存先の切り替え

    C cc = new C();

    //クラスAをクラスCに注入します
    cc.setObj(m);

    //クラスCからクラスAのメソッドを実行しています
    cc.method("method");
    }
    }
  • id:westfish
    ふむふむ…リフレクションを使って"method"という名前のメソッドを取得して呼び出しているわけですね。それは依存性の注入ではなくてダックタイピングではないかと思います。

    A m = new A();

    の部分を

    Object m = Class.forName("A").newInstance();

    に変えた方が依存性の注入の例としてはいいかもしれません。
    あと、

    method.setAccessible(true);

    はまた別の話ですね。
    これがあればmethodがたとえprivateであっても呼べるようにはなりますが、今回は両方ともpublicですし、privateなメソッドを呼び出す例で説明すると読者が混乱しそうです。依存性の注入やダックタイピングとは無関係ですから。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません