- DI = イニシャライザやメソッドなどを使って外からオブジェクトを注入すること。
- テストコードを書けばDIについて理解が深まる。
- プロジェクトではRoutingなどで使う。
DIを使わないパターン。汎用性がない
class DogPark {
private var dog = Dog()
}
イニシャライザでDIを使っているパターン
- 注入する型はProtocolを指定すればテストが容易
class DogPark {
// Protocolを使わないとDog型のみなので、テストの時の汎用性がない。
private var dog: Dog?
// Protocolに準拠しておけばよいので使い回しができる。
private var dog: DogProtocol?
init(dog: DogProtocol) {
self.dog = dog
}
}
メソッドでDIを使っているパターン
class DogPark {
func inject(dog: DogProtocol) {
self.dog = dog
}
}
ClassをProtocolに準拠させる
// DogProtocolに準拠させる。
protocol DogProtocol { }
class FakeDog: DogProtocol { }
class MockDog: DogProtocol { }
呼び出し側 イニシャライザパターン
HogeClass {
// MVP
let fakeDog = FakeDog()
let dogPark = dogPark(dog: dog)
// MVVM
let viewModel = ViewModel(dog: fakeDog)
let vc = ViewController(viewModel: viewModel)
}
呼び出し側 メソッドパターン
HogeClass {
let dogPark = DogPark()
let fakeDog = FakeDog()
dogPark.inject(dog: fakeDog)
}
参考
qiita.com