DI のメリット

DI の価値は「業務変更に追従しやすいこと」です。受注と商品を扱うシステムでは、販売ルール変更や連携先変更が頻繁に起きるため効果が出やすくなります。

メリット1: 実装の差し替えが容易

受注処理が ProductGateway に依存する形にしておけば、 本番は DB 参照、将来は外部商品API、テストではモックという切り替えが容易です。

メリット2: テストが速く安定する

受注ロジックのテスト時に、商品取得と通知送信をモック化しやすくなります。 その結果、テストが速く安定します。 CI でのテスト時間短縮にも直結します。

メリット3: 責務が分離される

クラスの責務を「自分の仕事」に集中できるようになります。 オブジェクト生成の責務はコンテナやファクトリに寄せるため、コードが読みやすくなります。

メリット4: チーム開発で衝突が減る

「受注ロジック担当」「商品連携担当」「通知担当」のように分業しやすくなります。 実装切替ポイントが明確なので、衝突が減ります。

DIとinterfaceの違い

混同されやすいですが、役割が違います。 interface は「型の約束」DI は「その部品を外から渡す方法」です。

項目interfaceDI
何をするものか使い方(メソッド)を揃えるどの実装を使うかを外で決めて渡す
主な効果差し替え先の実装を作りやすい利用側コードを変更せず差し替えやすい
単体で十分か単体だと不十分なことが多いinterface と組み合わせると効果が最大化

受注の例で見ると、次のような違いです。

// interface だけ導入(まだ DI していない)
class OrderService {
  private final ProductGateway gateway = new ProductDbGateway(); // 実装が固定
}

// interface + DI
class OrderService {
  private final ProductGateway gateway;
  OrderService(ProductGateway gateway) { // 外から受け取る
    this.gateway = gateway;
  }
}

つまり、interface だけでは「受注処理の中で実装固定」のままになりがちです。 DI まで行って初めて、商品取得先を本番DB・外部API・テストモックへ柔軟に切り替えられます。

観点DIなしDIあり
商品連携先変更受注ロジック本体まで修正が必要商品取得実装の差し替え中心で対応しやすい
受注ロジックの単体テスト商品DBや通知処理が邪魔になりやすいモック注入で受注ロジックだけ検証しやすい
保守性変更点が散らばる責務単位で変更点を閉じ込めやすい

DI の効果は、半年後・1年後の改修で強く出ます。最初の数日より、長期保守で回収する設計投資です。