Inversion of Control

IoCコンテナについて書かれた雑誌や本、Webの記述を見ると、Inversion of Controlという言葉の意味が正しく理解されていないように感じる。Inversion of Controlは

だ。それに対して、IoCコンテナ(現在、DIコンテナと呼ばれているもの)は、

  • 依存性を解決するために依存関係にあるオブジェクトを注入するコンテナ
  • Inversion of Controlの実例の一種

だ。IoC=IoCコンテナIoC=DI、あるいはDIコンテナではない。多くの記事は、この違いを正しく理解せずに書かれている。

Inversion of Controlは、DIコンテナが誕生する前からフレームワークのデザイン原則として知られていた。IoCコンテナという名前は意味をもたない(J2EEのコンテナはInversion of Controlの原則に基づいて作られている)し、何の制御が反転しているのか理解できない。これが、Martin Fowlerが、Inversion Of ControlをDependency Injectionと言い換えた理由だ。

Inversion of Controlという言葉が使われたのは、僕が知っているWeb上の資料では、1988年に書かれたRalph JohnsonとBrian FooteのDesigning Reusable Classesという論文だ。ずいぶん昔に日本語の紙メディアで読んだ記憶もあるので、OOかパターン関係の書籍でも紹介されていたのではないだろうか。