BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース 依存性注入: 新しい考え方だろうか、それともしっかりした基盤だろうか?

依存性注入: 新しい考え方だろうか、それともしっかりした基盤だろうか?

Spring等の依存性注入(Dependency Injection : DI)フレームワークは、疎結合化やユニットテストの改善、アーキテクチャの整理といった点で、本当に多くの開発者に効果をもたらした(source)。アーキテクトとして技術の歴史を知っておくことは、それが一番うまく当てはまる状況や制限、そして今後の方向性を正しく理解するために有益である。例えば、EJBが CORBAの世界から出てきたものであることや、SOAがメッセージ指向ミドルウェア(Message-Oriented Middleware : MOM)システムの上に進化したものであることを知っていると、ソフトウェアの世界におけるこれらの技術の位置付けを理解しやすい。大多数にとっては、しかしながら、DIはどこからともなく現れたように思われるだろう。

Andrew McVeigh氏が依存性注入の詳細な歴史(source)について書いており、以下に要約する。McVeigh氏は大学の研究者で、博士課程の一環としてアーキテクチャ記述言語(Architecture Description Languages : ADLs)(source)に取り組んでいる。彼はRod Johnson氏と一緒に商用の製品の仕事もしていた。  

DIはADLの取り組みから直接発生したものではないが、ADLsとDIは共通した問題を解決するためのよく似た手法であると、McVeigh氏は言っている。これは収束進化(source)によく似ていて、たとえば鳥とコウモリは別々に進化したが、よく似た体の構造、翼を持っていて、それは空を飛ぶという重要な行動に適している。  

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
  • アーキテクチャの設計と分析のツール群
最後に、McVeigh氏はソフトウェア開発における産学の断絶を嘆いている。大学の研究者達は産業界によって踏みならされた領域には興味を持たないし、大学での研究は産業界からは近寄りがたく、また製品に値しないとみなされているだろう。しかし、もっと緊密な関係を持つことによって両者が利益を得られることは明白である。

McVeighs氏は、依存性の注入が普及しているだけではなく、長い歴史と興味深い未来があることを教えてくれている。
*注記: 読者コメントに応じて、原文を2月1日に再編集しました。

原文はこちらです:http://www.infoq.com/news/2008/01/dependency-injection

この記事に星をつける

おすすめ度
スタイル

BT