依存性注入

1 件の記事

Contents

For dependency injection, depend on interfaces, not concrete implementations. (依存性注入では、具体的な実装ではなくインターフェースに依存する)

解説

依存性注入において、具体的な実装ではなくインターフェースに依存することで、疎結合な設計が実現されます。インターフェースに依存することで、実装の差し替えが容易になり、テスト時にモックやスタブを注入できます。この原則は依存性逆転の原則(DIP)の実践であり、変更に強く拡張しやすいコードベースを構築するための基盤となります。

具体例

// 悪い例(具体的な実装に依存)
type MySQLDatabase struct{}

func (db *MySQLDatabase) Query(sql string) []Row {
    // MySQL固有の実装
    return nil
}

type UserService struct {
    db *MySQLDatabase  // 具体的な実装に依存
}

// 良い例(インターフェースに依存)
type Database interface {
    Query(sql string) []Row
}

type MySQLDatabase struct{}

func (db *MySQLDatabase) Query(sql string) []Row {
    return nil
}

type UserService struct {
    db Database  // インターフェースに依存
}

func NewUserService(db Database) *UserService {
    return &UserService{db: db}
}

参考リンク