torutkのブログ

ソフトウェア・エンジニアのブログ

ファウラー氏の"Inversion of Control Containers and the Dependency

Injection pattern"翻訳ページ
Inversion of Control コンテナと Dependency Injection パターン
読書会でDIP(依存性逆転の原則)を読んだので、関連が深く興味深く読みました。
文面からファウラー氏もDIPISP(The Interface Segregation Principle)などが背景にあるようです。この記事で興味深い点がいくつかあります。

コンポーネントは変更されることなく再利用されるもの
コンポーネントは内部的に利用(JAR、アセンブリ、DLL、ソース)される
サービスは外部のアプリケーションに利用(リモートインタフェース経由)される

サービスの意味が少しはっきりします。

  • DI以外の選択肢

Dependency Injectionだけが依存性をアプリケーションクラスから取り除いてプラグイン実装へと移す唯一無二の方法ではない。他のパターンを使っても同じことができる。ServiceLocatorだ。

このServiceLocatorは、どうみてもCORBAにおけるネーミングサービス、RMIにおけるRMIレジストリ、JiniのLookupサービスのように見えます。

  • インジェクションの種類

コンストラクタ・インジェクション
セッター・インジェクション
インタフェース・インジェクション

アプリケーションクラスからロケータへの依存が問題になるかどうかは多分にサービス利用者の性質による。単一のサービスを様々なクラスが利用するようなアプリケーションを構築しているのであれば、この依存は大した問題ではない。

  • コードか設定ファイルか

(アドバイス)すべての設定をプログラミングから簡単に行えるようなインタフェースを必ず用意すること。設定ファイルを分離するのはオプション機能でよい。

てっきりDIではインジェクションをXMLファイルで書くのが定石なのかと思ってしまいましたが、コードで書く方がよいこともファウラー氏は知っているのですね。