DIとコンポーネント化についての議論

3
非実在naka aki @naka_aki_spl

DIの、特に自動バインディングって、しっくりこないんです。該当する型のクラスが1個しかないという「継承へのいじめ」な状況を助長するのは好きではない。継承は万能ではないがここまで虐められるのも不当だと思ってる。

2011-06-05 20:05:05
非実在naka aki @naka_aki_spl

てか継承使わないならしばしば関数ポインタで十分なわけでww、非OOP言語にこそDIが合うのでは?あるいあ抽象データ型だけどOOPじゃない言語に。

2011-06-05 20:06:19
Ryo Asai @ryoasai74

@naka_aki_spl Seasarの自動ワイアリングは知らないのですが、SpringやCDIだと該当する型が複数な前提ですよね。得にCDIだとintやStringの値をインジェクションしてしまうくらいですから。

2011-06-05 20:49:25
Ryo Asai @ryoasai74

確かにCDIで独自アノテーションを使って同一の型の複数のクラスを使い分けるのは敷居が高いところがあるかもしれませんが。

2011-06-05 20:51:19
非実在naka aki @naka_aki_spl

@ryoasai74 そういや、そもそもDIって何をしたらDIなのでしたっけ?必要なインスタンスを中の人じゃなく外から与えるスタイルをDIと呼ぶんでしたっけか?だったらツール/lib/FWでなくてもいいわけですよね。。。

2011-06-05 20:52:52
非実在naka aki @naka_aki_spl

@ryoasai74 もしそうならだけど、main()のなかでオブジェクトを組み立てるコードを(javaで)書いたら、それでもDIしたことになるのかなあ。。。

2011-06-05 20:53:42
Ryo Asai @ryoasai74

@naka_aki_spl 実際DIを使うアプリをMockを使った単体試験するときは手動で依存関係をDIしますので、文字通りで考えればそれもDI(依存注入)と言ってよいと思います。でも、一般的な意味ではそのDIを自動化してくれるコンテナとかFWのことを言うのかなと思いますが。

2011-06-05 20:55:49
Ryo Asai @ryoasai74

@naka_aki_spl つまり、厳密にはDIとDIコンテナは別物なのですが、DIコンテナが省略されてDIと呼ばれることがあるためわかりにくくなっているだけでは。

2011-06-05 20:56:43
非実在naka aki @naka_aki_spl

@ryoasai74 ですよね。以前誰かも「DIとDIコンテナは別」とか言ってたんで、FWとか何もなしな某案件(ちなみにwebでなくバッチ)で「手書きで組み立て」してみました。

2011-06-05 20:58:55
非実在naka aki @naka_aki_spl

@ryoasai74 結局「DIする」とは「突っ込む場所に突っ込むべきブツを(なんらかの基準で)選んで突っ込む」ことをさす、でいいんでしたよね。で、現実的に何のためにそうするかってーと、やっぱり「テスト用にブツをすりかえる」のが主目的ってとこすかね?

2011-06-05 21:00:46
Ryo Asai @ryoasai74

JavaEE tutorialではintをCDIでインジェクションする例が書かれているが、一般にはやらないだろうな。それではQualifierアノテーションの数が爆発する。せいぜいアノテーションを文字列でパラメータ化するか、データを保持するBean経由でDIするのが無難と思う。

2011-06-05 21:01:04
非実在naka aki @naka_aki_spl

DI化ってのはリアル機械とかでいえば「アタッチメント」「コネクタ」に相当する概念だと思っていいのかな?ってのが気になってるところ。一枚岩な機械だと差し替えもテスター(電気のね)突っ込みも効かなくて困る、部品間の接合点を切り離せるようにしとけ、というかんじ?

2011-06-05 21:02:32
Ryo Asai @ryoasai74

Seam2のバイジェクションとCDIとでは考え方が似ている部分と違う部分があるので、注意が必要だと思う。#javaeejp

2011-06-05 21:02:38
非実在naka aki @naka_aki_spl

ま、コネクターと呼ぶにしては、「コネクターの規格」が不在で毎回自作してるってのが、なんとも間抜けな構図だとは思うんだけども>現行ソフトウェア世界。つまり機械でいえば「ねじ自体毎回自作してた」中世程度ってことなわけで。

2011-06-05 21:03:33
非実在naka aki @naka_aki_spl

「ソフトウェアが複雑」だってのは賛成しない。「複雑さの段階的ラップが未だ未発達」という事だと思う。まあ、俺ら当事者が「晒されてる複雑さ」が大きいのは確かかも知れないがorz

2011-06-05 21:05:17
Ryo Asai @ryoasai74

@naka_aki_spl テストは主たる目的だけど、直接具象クラスに対する依存関係の解決をそのクラスの自身でやる代わりに外部の別のなにか(主導か、コンテナか)に任せることで、疎結合にしたということですかね。OOPで一般的なIoCの特殊なものと理解しています。

2011-06-05 21:05:24
Ryo Asai @ryoasai74

@naka_aki_spl もともとはファウラーの以下の論文がDIという言葉の元だったと理解していますが。 http://bit.ly/kL8tWc

2011-06-05 21:07:59
非実在naka aki @naka_aki_spl

@ryoasai74 脱線余談ですが個人的にはIoCとOOPという流れはあまり好きじゃないです。IoC(ふぁうらーたんの説明を信じるなら)って結局は「コールバック」が使えるあらゆる世界において共通の概念だから「何を今更」的。(OOPも関数型もGUIもみんなコールバック使う

2011-06-05 21:08:20
非実在naka aki @naka_aki_spl

@ryoasai74 ふぁうらーblikiの和訳サイトのかたには感謝してます。

2011-06-05 21:09:05
非実在naka aki @naka_aki_spl

@ryoasai74 具象かあ。それってどこまで問題を解決できるのか心配なんです。Interfaceを満たす範囲のクラスで後付けの選択の自由が有ることになりますが、interfaceで「仕様」をうまく特定できるかってーと怪しいので、なんともかんとも。

2011-06-05 21:10:57
非実在naka aki @naka_aki_spl

@ryoasai74 自分が最近よくボヤく例でいえばLinkedHashMap。たとえば要求に「Map」って書いてあると順序特性を指定できないとか、不自由な思いをするんじゃないかと。。。

2011-06-05 21:12:55
Ryo Asai @ryoasai74

@naka_aki_spl OOPはオブジェクトの相互作用でプログラムが動くのでいったん関連が設定されたオブジェクトが生成されてしまえば後は簡単というところがあるが、最初のオブジェクト作って関連を準備するのが面倒といことはあった。DIでそれが外部化できるのは便利だと思うのですよ。

2011-06-05 21:13:41
非実在naka aki @naka_aki_spl

@ryoasai74 複数のinterfaceを指定して、それを満たすクラスならば代入(DIも)可能っていうことが出来ればいいんですが、Javaだと「複数i/fを合成した1つのi/fを実装したクラス」でないと代入管理ができないので、ちょっと苦しいなあと思う。

2011-06-05 21:14:12
非実在naka aki @naka_aki_spl

要求する部品の仕様として「BとCを満たすこと」という指定が出来ないよねjava。「BとCを事前に合成したDを満たすこと」なら指定できるけど.

2011-06-05 21:16:09
Ryo Asai @ryoasai74

@naka_aki_spl SpringのDIの場合サービスやDAOなど粗粒度のコンポーネントレベルでDIするけど、粒度の細かい部分では使わないのでその辺はあまり問題にしていませんでした。むしろ普通のGoFなどで対処する。でも、CDIになるとどこまでDIするか迷うところはある。

2011-06-05 21:17:21