1仕様書無しさん2018/05/19(土) 21:44:19.89
2仕様書無しさん2018/05/19(土) 21:51:41.92
■ DIの例
Dog baby = new Dog(mom.cunt, uncle.dick);
3仕様書無しさん2018/05/19(土) 21:59:11.23
>>2
間違い。DIではnewを使わない(DIコンテナが行う) 4仕様書無しさん2018/05/19(土) 22:00:18.05
■ DIの例
それから、PicoContainerはそれぞれのインタフェースがどの実装クラスと結び付けられるのかを通知してもらう必要がある。 MovieFinder にどういうファイル名がインジェクトされるのかについても同様だ。
private MutablePicoContainer configureContainer() {
MutablePicoContainer pico = new DefaultPicoContainer();
Parameter[] finderParams = {new ConstantParameter("movies1.txt")};
pico.registerComponentImplementation(MovieFinder.class, ColonMovieFinder.class, finderParams);
pico.registerComponentImplementation(MovieLister.class);
return pico;
}
この設定コードは、本来ならば別の設定クラスで記述されるべきものだ。
5仕様書無しさん2018/05/19(土) 22:00:41.52
■ コンストラクタインジェクションの例
PicoContainer を利用するためには、以下のようなコードを書く。
public void testWithPico() {
MutablePicoContainer pico = configureContainer();
MovieLister lister = (MovieLister) pico.getComponentInstance(MovieLister.class);
Movie[] movies = lister.moviesDirectedBy("Sergio Leone");
assertEquals("Once Upon a Time in the West", movies[0].getTitle());
}
なお、このサンプルではコンストラクタ・インジェクションを利用しているが、 PicoContainer では
セッター・インジェクションもサポートしている (開発者たちはコンストラクタ・インジェクションのほうが好みのようだけれど)。
6仕様書無しさん2018/05/19(土) 22:02:30.37
■ Spring でのセッター・インジェクションの例
Spring Framework は エンタープライズ Java 開発向けの守備範囲の広いフレームワークだ。
トランザクション、永続化フレームワーク、Web アプリケーション開発や JDBC に関する抽象レイヤがある。
MovieLister がインジェクションに対応できるように、 サービス設定用の setter メソッドを定義しなければならない。
(省略)
同様に、MovieFinder には文字列の setter を定義する。
(省略)
3番目のステップとして、ファイルに設定を記述する。Spring での設定は XML ファイルでもコードでも可能だが、 XMLで行うことが望ましいとされている。
<beans>
<bean id="MovieLister" class="spring.MovieLister">
<property name="finder">
<ref local="MovieFinder"/>
</property>
</bean>
<bean id="MovieFinder" class="spring.ColonMovieFinder">
<property name="filename">
<value>movies1.txt</value>
</property>
</bean>
</beans>
テストはこんな感じだ。
public void testWithSpring() throws Exception {
ApplicationContext ctx = new FileSystemXmlApplicationContext("spring.xml");
MovieLister lister = (MovieLister) ctx.getBean("MovieLister");
Movie[] movies = lister.moviesDirectedBy("Sergio Leone");
assertEquals("Once Upon a Time in the West", movies[0].getTitle());
}
7仕様書無しさん2018/05/19(土) 22:03:15.98
結局手抜きしてフィールドインジェクションしてるわ
8仕様書無しさん2018/05/20(日) 03:13:45.22
XMLもsetterもキモイから嫌い
コードで配線の設定書いてコンストラクタでインジェクションしてる
9仕様書無しさん2018/05/20(日) 06:56:39.07
定義と実装ぐらい区別しようよ
10仕様書無しさん2018/05/20(日) 07:18:45.20
>>9
クラスやインターフェースの定義の話じゃないぞ?
DIの依存関係の定義っていうのはコードもしくは設定ファイル
なんだから、お前が勘違いした実装というのは
「コードで書いたDIの依存関係の」定義だろ 11仕様書無しさん2018/05/20(日) 09:10:00.65
>>6
ついにここまで来たか
学習能力高いな
アノテーション定義もやってみよう 12仕様書無しさん2018/05/20(日) 19:34:27.18
さて、前スレのなぜDIを使うとライフサイクルの事まで
考えなければいけなくなるのか?の答
惜しい所まで来てるんだけど、あと一歩足りない
DIを悪く言えないから、気づいてしまったけど
口に出して言えないのかもしれないねw
DIを使うとライフサイクルの事まで考えなければいけなくなるのは
DIがなにをやってくれるものなのかに気づく必要がある
再掲すると
DIとは?・・・オブジェクト指向の依存関係を"ひとまとめに"定義する部分と、それを利用するために
オブジェクトを直接newするのではなく、DIコンテナにnewしてもらうパターン
https://web.archive.org/web/20170707082300/http://kakutani.com/trans/fowler/injection.html
> Dependency Injection の形式
> Dependency Injection の基本的な考え方は、独立したオブジェクトを
> Assembler(組み立て係)として用意し、 MovieFinder インタフェースの実装を
> MovieLister クラスのフィールドへ適切に設定させるというものだ。
> 依存関係は図2のようになる。
一言で言うならば、newを代わりにやってくれるものと考えればいい
それだけ。そう、それだけなんだよ。
だからどんな用途にも使える。これは一見優れているように見えるかもしれないが、
汎用的な解決方法しか提供できないため、逆に特定の問題をシンプルに解決することができない
フレームワークは一般的に特定の問題(例えばウェブアプリ)を解決するために作られたものなので
ライフサイクルの管理もフレームワークで管理して、特定の問題の解決に必要な部分のみを
プログラマが記述すれば良くなる。 13仕様書無しさん2018/05/20(日) 19:36:15.35
もちろんDIを使っていてもフレームワークが
DIを内部に隠蔽することでライフサイクルの管理を
プログラマがしなくてすむようにできるだろうけど、
そうするとプログラマがDIを直接使うのが難しくなってしまう
14仕様書無しさん2018/05/20(日) 19:39:22.07
支離滅裂
15仕様書無しさん2018/05/20(日) 19:39:48.38
以上、staticおじさんでした
16仕様書無しさん2018/05/20(日) 19:40:12.11
反論がないところまで想定済みw
17仕様書無しさん2018/05/20(日) 19:45:28.28
キチガイに触るな
18仕様書無しさん2018/05/20(日) 19:58:39.31
本当に文句だけ言って去っていくのなw
19仕様書無しさん2018/05/20(日) 20:12:33.22
DI(フレームワーク)がライフサイクル管理してくれるんだろ?
プログラマは意識しなくていいやん
20仕様書無しさん2018/05/20(日) 20:13:28.86
まだやってたのか!?
おまえ等がDI大好きなのはわかった…
21仕様書無しさん2018/05/20(日) 20:13:56.23
DIはフレームワークじゃないよ。パターン。
DIパターンを使ったフレームワークと勘違いしてね?
22仕様書無しさん2018/05/20(日) 20:50:05.38
23仕様書無しさん2018/05/21(月) 01:21:20.44
>>22
自分が?まあ反論してないってことはそういうことなんだろうけど 24仕様書無しさん2018/05/21(月) 01:32:01.57
むしろ今までライフサイクル意識せずピュアな実装してたとか恐怖でしかない
25仕様書無しさん2018/05/21(月) 01:45:49.89
そういうのはフレームワークが隠蔽すべきものだからね