Andrew McVeigh氏が依存性注入の詳細な歴史(source)について書いており、以下に要約する。McVeigh氏は大学の研究者で、博士課程の一環としてアーキテクチャ記述言語(Architecture Description Languages : ADLs)(source)に取り組んでいる。彼はRod Johnson氏と一緒に商用の製品の仕事もしていた。
McVeigh氏は次のように書いている。
ここ20年のソフトウェアコンポーネントの研究に詳しい大学の研究者たちにとって、アーキテクチャ記述言語(ADLs)(source)として知られているソフトウェアの研究の確立された分野(source)とDIが非常に密接に関連していることは明らかです。ADLがやるべきことは、設定に従ってコンポーネントを組み合わせたり結びつけたりすることです。...実際に、Springのbean定義言語は、(厳密にいうと)暗黙的なコネクタをもった非階層的なADLなのです。McVeigh氏はソフトウェアコンポーネントを次のように定義している。:
コンポーネントはソフトウェアの構成単位であり、インスタンス化することが可能です。そして、どのようなサービスが提供されているか、どのようなサービスが必要かを(インタフェースによって)明確に示すことにより、環境から分離されています。McVeigh氏は、ソフトウェアコンポーネントと電子部品を比較しているが、それはどちらも「取り替えることが可能で、提供しているサービスや必要としているサービスがはっきりとしている具体的な部品」でなければならないからである。受信機やスピーカー、DVD、そして新しい96インチの高精細度テレビの配線をつなぐ場合、入出力コネクタの形によって、それぞれの部品に必要なサービスとそれぞれの部品が提供しているサービスがはっきりとわかるのだ。
Javaや.Netのクラスは、本質的にコンポーネントではない。インタフェースを用いてクラスが提供するものを表すことはできるが、実行する際に依存しているものを正確に宣言しているわけではない。メソッドの型は確かに個別のメソッドに必要なものを宣言しているが、クラス全体で必要なものを宣言しているものはないのである。Spring等のDIコンテナは、クラスに必要なものを、クラスのアノテーションや外部設定ファイルで明白に宣言できるようにすることによって、このギャップを埋めている。Javaクラスと一体となった設定はソフトウェアコンポーネントを生成するが、これはMcVeigh氏の定義をほぼ満たしている。SpringのBeanは惜しくもMcVeigh氏のコンポーネント定義から外れるが、それはSpringではコネクタは暗黙的だからである-できるのはBeanのプロパティをセットすることだけであり、Springは単純にsetterを呼び出すのだ。
ADLの重要な特徴はコネクタが明示的であるということである。これは結びつきが緩いだけではなく、ケーブルの端にHDMIコネクタがついているようなものである。コネクタが明示的であるという性質は、テストの容易性が改善されていたりアーキテクチャ上のツールが改良されているなどの、興味深いアーキテクチャ上の特徴をもったADLを提供する。ある特定のADLでは、コネクタをもっと機能的にすることも可能である。フィルタリングやエラー処理のような追加機能を実行することで、それ自身でコネクタのように振舞うこともできるのである。
ADLと現在のDIテクノロジを差別化するもう一つの主な要因は、コンポジット・コンポーネントの概念である。一度すべての電子部品の配線をつなげば、それはホーム・エンターテイメント・システムとなる。しかし、魔法で命を吹き込まれた雪だるまのフロスティとは違うのである。一度すべてのものをつなぎ合わせたら魔法のように現れる、付加的な実体は無いのだ。ホーム・エンターテイメント・システムはコンポーネントにすぎず、配線はそれらをつなぐものなのである。
McVeigh氏が開発したADL言語であるBackboneを使うと、既存のコンポーネントをつなぐことによって新しいコンポジット・コンポーネントを作ることができる。現在のSpringではそのようなことはできない。なぜなら、SpringのすべてのBeanはクラスと関連付ける必要があるからである。こうしたことができるにもかかわらず、BackboneはSpringのXMLで書かれた設定ファイルよりもはるかに読みやすい。
McVeigh氏はADLの興味深い歴史を語っている。最初のADLはPascalで書かれたConicで、1980年代に分散コンピューティングで使われた。別のADLであるDarwinはCOMに影響を与えた。UMLの仕様にはADLが含まれているが、これはRational RealtimeとROOM(リアルタイム・オブジェクト指向モデリング)方法論の影響を受けている。
依存性注入の今後の方向性について、McVeigh氏はいくつか詳しく述べているが、その中には以下のものが含まれている。
- 実行時にコンポーネントをスワップアウトできること
- ADLに設定された変更をとらえ、時間とともにシステムを進化させること
- フラクタルのようなコンポジション - 階層化されたシステムに穴を開けることができ、あらゆるレベルでコンポジット・コンポーネントを見ることができること
- GUI - コンポジットの開発に自然に適合するGUI
- アーキテクチャの設計と分析のツール群
McVeighs氏は、依存性の注入が普及しているだけではなく、長い歴史と興味深い未来があることを教えてくれている。
*注記: 読者コメントに応じて、原文を2月1日に再編集しました。
原文はこちらです:http://www.infoq.com/news/2008/01/dependency-injection