gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

DIコンテナって?

んっと…かなり思考実験です。書いていてまだ是とも非ともとれてないですっていうかどっちかって言うと非?


まずDIコンテナの説明を噛み砕きつつ。
http://www.hitachi-sk.co.jp/research/techdoc/DI/
ここが非常にシンプルでわかりやすく書いてある…と思うのですが。
ようは「プログラム中でダイレクトにクラス名かくよりも、一枚はさんで抽象化したようがいいんでないがい?」ってニュアンスに感じるです。
例えば。普通


// ほげクラスのインスタンス作成
hoge_class hogege = new hoge_class;
// 使う
hogege->method();
ってのは見慣れて見飽きたソースだと思うのですが。これを、


// コンテナーインスタンスをファクトリー経由で作成
hoge_container container = hoge_container_factory.create(設定ファイル:大抵はXMLらしい);
hoge_class hogege = (hoge_class) container.make_instance("hoge_class");
hogege->method();
っていう風に書き換えてあげるです。
設定ファイルにはまぁ「必要な設定」があるとおもいねぇ。えっとねぇ…例えばこんな感じ。

<?xml version="1.0" ?>
<でぇたぁ>
 <クラス設定 id="hoge_class" class_name="hoge_v01">
</でぇたぁ>
これで「hoge_classって指定されたら実際にはhoge_v01の実態作って差し上げておくんなまし」って設定になるです。
利点については、あちこちで「依存性云々」とか、お便利な単語使って書いてあるところが多いですが、多分ポイントはココ。


テスト用のスタブとかドライバとかをぶち込みやすい。


つまり。interfaceが合致していると過程して。class_nameさえ書き換えちゃえば、プログラム修正しなくても「違うクラスのインスタンス」生成させることが出来るです。
なにが便利かってぇと「でっかいクラス作ってる最中とかテストのタイミングとか」。


わかんなくはないんですが…単にクラス設計しくじってるとか言いませんかそれ?
コンパイルで引っ掛けにくい(設定ファイルだもんわかんないよねぇ)とかを含めて。世間ではえらく絶賛されているっぽいですが、なんていうか…「しくじったクラス設計を上から塗りつぶして誤魔化そうとしている」ようにしか見えませんぶっちゃけ。
多分、ある極所で便利な瞬間ってあると思うのですが、その前に「設計を見直したほうがいい」んじゃないかと思うです。特にEJBとか*1


…ああまた暴言吐いちゃった。


でもまぁ。設計に関わる人間として、必要なのは「複雑なものを複雑にあつかえること」ではなくて「複雑なものをシンプルに組み立てなおせる」能力だと、そのあたりは堅く信じているので。
DIコンテナで「うんにゃ違う」ってのがありましたら是非コメントで教えてください。

*1:いやまぁ、すでに軌道修正が無理なほどに広まってるからこーゆー技で誤魔化そうとしているんだろうなぁとか思わなくもないのですが。