依存関係

モジュールやサービスが他のモジュールやサービスに依存する関係で、結合度と変更の影響範囲を決定する

設計アーキテクチャ

依存関係とは

依存関係 (Dependency) は、モジュール A がモジュール B を使用する関係で、B の変更が A に影響する。依存の方向と強さが、システムの保守性とテスト容易性を決定する。

依存の方向

❌ 高レベルが低レベルに依存 (密結合)
  ビジネスロジック → DynamoDB Client
  → DB を変更するとビジネスロジックも変更

✅ 依存性逆転 (DIP)
  ビジネスロジック → Repository インターフェース ← DynamoDB Repository
  → DB を変更してもビジネスロジックは変更不要

TypeScript での依存性注入

// インターフェース (抽象) に依存し、実装を差し替え可能にする
interface OrderRepository {
  get(id: string): Promise<Order | null>;
}

class OrderService {
  constructor(private repo: OrderRepository) {}
  async process(id: string) {
    const order = await this.repo.get(id);
    // ...
  }
}

// 本番: DynamoDB、テスト: インメモリに差し替え可能

循環依存

❌ 循環依存:
  ABCA
  → どのモジュールも単独でテストできない

✅ 解決: インターフェースで依存を逆転
  ABCInterfaceA

依存の種類

種類 説明
コンパイル時依存 import で参照 npm パッケージ
ランタイム依存 実行時に必要 DB 接続、外部 API
開発依存 開発時のみ必要 テストフレームワーク

依存を減らす設計

依存性逆転でインターフェースに依存し、イベント駆動で直接呼び出しではなくイベントで連携する。必要なものだけ import して最小限のインポートを心がけ、複雑な依存はファサードで 1 つのインターフェースに集約する。

詳しくは関連書籍を参照。

関連用語