概要
DIとは、ソフトウェア開発において
「依存関係」を外部から注入することで、コードの再利用性・保守性・テスト性を高める設計手法です。
特定のクラスやモジュールが、自分で依存するオブジェクト(機能)を作成するのではなく、
外部から渡してもらう(注入される)ように設計します。
正式名称
Dependency Injection(ディペンデンシー・インジェクション)
略称
DI(ディーアイ)
特徴
- オブジェクト間の依存関係を明確化できる
- コードの再利用性が向上する
- テスト時にモック(仮のオブジェクト)を差し替えやすい
- 密結合(strong coupling)を避けられる
- 保守・拡張が容易になる
- 多くのフレームワーク(Spring, Laravelなど)が標準対応
具体例
例:メール送信処理
DIを使わない場合(密結合)
public class UserService {
private MailService mailService = new MailService(); // 自分でインスタンスを生成
public void sendWelcomeEmail(String email) {
mailService.send(email, "Welcome!");
}
}
DIを使った場合(疎結合)
public class UserService {
private MailService mailService;
public UserService(MailService mailService) { // 外から注入
this.mailService = mailService;
}
public void sendWelcomeEmail(String email) {
mailService.send(email, "Welcome!");
}
}
関連用語
用語 | 解説 |
---|---|
依存性(Dependency) | クラスが必要とする外部の機能・オブジェクト |
注入(Injection) | 依存するオブジェクトを外から与える行為 |
IoC(Inversion of Control) | 制御の反転。オブジェクトの生成・制御を外部に委ねる設計思想。 DIはこれを実現する手法の1つ |
モック(Mock) | テストのために用意された、簡易・仮の実装 |
コンストラクタインジェクション | コンストラクタで依存性を渡す方法(最も一般的) |
セッターインジェクション | セッター(setterメソッド)で依存性を注入する方法 |
インターフェース | 実装に依存せず、抽象的に機能を定義する仕組み。DIと相性が良い |