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}
}
