7.14 暗黙のインタフェースによる依存性注入
ソフトウェア開発では、ある部分を変更しても他の部分に影響が及ばないように、コードの「デカップリング(分離)に留意する必要がある
デカップリングを実現するための一つの手法に依存性注入(dependency injection)がある
Goでは明示的なインタフェース実装を行わず、暗黙的に依存性注入を行うことができる
code:go
// インタフェース定義
type Logger interface {
Log(message string)
}
type DataStore interface {
UserNameForID(userID string) (string, bool)
}
// 型や構造体を定義
type LoggerAdapter func(message string)
type SimpleDataStore struct {
}
// 関数型や構造体がインタフェースメソッドを実装することで、暗黙的にインタフェースを満たす
func (lg LoggerAdapter) Log(message string) {
lg(message)
}
func (sds SimpleDataStore) UserNameForID(userID string) (string, bool) {
name, ok := sds.userDatauserID return name, ok
}
// 依存する機能(Logger / DataStore)をインタフェース経由で注入することで、柔軟でテスト可能な設計となる
type SimpleLogic struct {
l Logger
ds DataStore
}
func NewSimpleLogic(l Logger, ds DataStore) SimpleLogic {
return SimpleLogic{
l: l,
ds: ds,
}
}