依存関係
モジュールやサービスが他のモジュールやサービスに依存する関係で、結合度と変更の影響範囲を決定する
設計アーキテクチャ
依存関係とは
依存関係 (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、テスト: インメモリに差し替え可能
循環依存
❌ 循環依存:
A → B → C → A
→ どのモジュールも単独でテストできない
✅ 解決: インターフェースで依存を逆転
A → B → C → Interface ← A
依存の種類
| 種類 | 説明 | 例 |
|---|---|---|
| コンパイル時依存 | import で参照 | npm パッケージ |
| ランタイム依存 | 実行時に必要 | DB 接続、外部 API |
| 開発依存 | 開発時のみ必要 | テストフレームワーク |
依存を減らす設計
依存性逆転でインターフェースに依存し、イベント駆動で直接呼び出しではなくイベントで連携する。必要なものだけ import して最小限のインポートを心がけ、複雑な依存はファサードで 1 つのインターフェースに集約する。
詳しくは関連書籍を参照。