« 水からの伝言 | メイン | 間取り(2) »

2006年11月29日

Dependency Injection

今後カテゴリを増やすことになるかもしれませんが、とりあえず blog カテゴリで。

アプリ側に戻ってみて驚いたのは、未だに世(?)が混沌としていることです。ここ数ヶ月担当してみて分かったのが、どうやら DI+AOP が現在の流行でありそうだ、ということでした。

それそれの言葉の定義は、

DIDependency Injection
AOPAspect Oriented Programming

な、感じだそうです。それぞれ、こちら(DI)こちら(AOP)などを参照のこと。

この辺の話を知る前のことなのですが、「アスペクト指向入門」という本を読んで、「アスペクト指向ってなんだか気持の悪い考え方だなぁ」と思っていたばかりでした。気持悪いと思った理由は、アドバイスを外から接続することができるという機構が、です。それこそが AOP の特徴ではあると思うのですが、ある特定の処理を想定して作ったモノに対して、「その思想を曲げるような処理を追加すること」が気持悪く感じたからです。また、そのアドバイスも無尽蔵に追加することが(言語上)可能でしょうし、そうなった場合のコードの可読性は非常に低いものになるだろうと思ったからです。

既存の動作しているコードに手を加えたくない(≒誤動作を与える可能性がある)からといって、それに対して単純にコードを“足す”といった考え方はあまり好きではありません。要求とともにコードは変化していくものですが、それは「目的」が変わった(含追加された)ものであるため、初期のコードとは変わってあたりまえだと思うからです。単純に接木を繰り返していくような考え方は、新たにそのコードを保守することになった人に対して 0 から始めることに比べて数倍の労力を背負わせることになります。

DI に関しても私はまだ懐疑的で(といって、ちゃんとまだ検証等もしてないので「感覚」で言ってるのですが)、DI の要は、インタフェイスを固定することによって外部定義された設定(大抵は XML )によって生成されるオブジェクトを変更することができる、またそれに伴い単体テストの効率を上げることが出来る、といった部分だと思いますが、それって何ら昔から言われている「他のモジュールに依存する部分は、ドライバ・スタブを作る」という考え方と何ら変わることがありません。それが単にオブジェクトビルダ等に代表されるコンテナが担うと言うこと、実行時にインスタンスが決定される(インタフェイスは統一)という部分が違うだけです。Win32 で例えると GetProcAddress が“安全”に出来る、というのが要になるんでしょう(勿論この安全に、が重要ではあると思うのですが)。

と、まぁ私はこれらの技術が今ところ好きではありません。DI などはコードの可読性を極端に低くする技術とすら思っています。というのも、この辺の技術を全く知らずに今のプロジェクトに投入されたからなんですけどねぇ。。ある程度出来上がっているソースを説明もほぼなしに渡されて「こんな感じの考え方でよろしくね」って DI の説明もなしにってちょっと無茶だと思いました。

さてそんなわけですが、GUI に対する EventHandler の += 的な考え方は AOP なのかな?と今では思っています。あるイベントがあったときのハンドラを、そのクラスを継承せずに書ける、と言う意味でです。コードを書くのは楽なんですが、これ、まじめにデバッグしようとした場合、どこにブレークを張っていいかちょっと悩むんですよね。この辺はまた次回に。


投稿者 napier : 2006年11月29日 00:03


トラックバック

このエントリーのトラックバックURL:
http://will.squares.net/mt/mt-modified-tb.cgi/565

このリストは、次のエントリーを参照しています: Dependency Injection:

» Dependency Injection(2) from N a p l o g
このエントリから 1 年以上たちました。が、やはり好きになれません。使ってる F... [続きを読む]

トラックバック時刻: 2007年12月21日 01:51