DI教えようとしたら難しすぎたので整理した | TechDistill
> Source: Qiita_Trend
Execute Primary Source
// Problem
クラス内部で外部サービスを直接インスタンス化(new)すると、特定のサービスに強く依存する「密結合」な状態となる。これにより、決済手段の変更時にビジネスロジックの修正が必要となり、また外部通信を伴うためユニットテストの実施が極めて困難になるという課題が生じる。
// Approach
外部サービスを抽象化したインターフェースを定義し、ビジネスロジックはそのインターフェースにのみ依存するように設計する。具体的な実装クラスはDIコンテナを用いて外部から注入(Injection)することで、ビジネスロジックと具象実装を分離するアプローチを取る。
// Result
ビジネスロジックを一切変更することなく、コンテナの設定変更のみで決済手段(StripeからPayPay等)を切り替えられるようになる。また、テスト時にはモックオブジェクトを注入することで、外部APIに依存しない高速かつ安定したテスト環境の構築が可能となる。
Senior Engineer Insight
> 実務において、外部APIやサードパーティ製SDKへの直接的な依存は、テストの困難さと仕様変更時の破壊的変更という二大リスクを招く。本記事が示すDIによる疎結合化は、単なる設計の美学ではなく、CI/CDの安定性と開発速度を維持するための必須の生存戦略である。ただし、過度な抽象化はコードの追跡性を低下させるリスクがあるため、DIコンテナによる依存関係の管理には、チーム内での厳格な規律と、コンテナの挙動を理解した上での運用が求められる。