Shuntiger Tech Diary

iOS/Androidエンジニアが気になる技術やガジェットなどを気のままお届けするブログ

ミニマムにDIについてまとめてみた

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

呼び出し側 イニシャライザパターン

  • MVP、MVVMでもDIは使う。
HogeClass {
  
  // MVP
  let fakeDog = FakeDog()
  let dogPark = dogPark(dog: dog)
  
  // MVVM
  let viewModel = ViewModel(dog: fakeDog)
  let vc = ViewController(viewModel: viewModel)

}   

呼び出し側 メソッドパターン

  • 外からメソッドを使ってDIする。
HogeClass {
  let dogPark = DogPark()
  let fakeDog = FakeDog()

  dogPark.inject(dog: fakeDog)
}

参考

qiita.com