依存関係逆転の原則 (DIP) は、次のようなアーキテクチャの原則です:
これは、ビジネスロジック(例えば、注文処理サービス)が特定のインフラストラクチャの実装(例えば、メール送信を実現するクラス)を直接知って使うべきではなく、DIコンテナや手動で埋め込まれる抽象(インターフェース)を介して動作するべきであることを意味します。
C#のコード例:
public interface IEmailSender { void Send(string to, string message); } public class SmtpEmailSender : IEmailSender { public void Send(string to, string message) { // メール送信の実装 } } public class OrderService { private readonly IEmailSender _emailSender; public OrderService(IEmailSender emailSender) { _emailSender = emailSender; } public void PlaceOrder(string customer) { // ビジネスロジック _emailSender.Send(customer, "ご注文が完了しました!"); } }
主な特徴:
DIPは単にコンストラクターによる依存性注入ですか?
いいえ。DIPは抽象と実装を分離することです。依存性注入(DI)は、DIPを実現するための手段にすぎません。DIPはDIコンテナなしで手動で抽象と詳細を分離することで実現できます。
インターフェースの実装が1つしかない場合、DIPは必須ですか?
はい、拡張の可能性がある場合でも原則は適用されます。抽象を導入することで、高レベルのコードの変更なしに要件の変更に対応できるようにシステムが準備されます。インターフェースの実装が1つしかない場合でも、弱い結合はシステムのテストと進化を容易にします。
ファクトリーやサービスロケーターでロジックを使用することでDIPが破られることはありますか?
はい。ファクトリーやサービスロケーターが実装の詳細を知っており、クライアント側でインターフェースを使用せず動的にそれらを結びつける場合、外部に抽象が存在してもDIPは破られます。