〈kotlin〉依存関係インジェクション(DI)

Android studioでkotlinを使ってAndroidアプリ作成の勉強中。
DIという単語が出てきて何?と思って導入の仕方まで勉強してみた記録。

DI(Dependency Injection)とは

あるクラスが別のクラスへの参照を必要とする(依存関係にある)とき、
必要とするオブジェクトを外部から渡してあげる仕組みのこと。

DIの例

Car クラスが Engine クラスへの参照を必要とする場合を例とする。

DIしない

Carクラス自身がEngineクラスのインスタンスを独自で作成する。

class Car {
    private val engine = Engine()

    fun start() {
        engine.start()
    }
}

fun main(args: Array) {
    val car = Car()
    car.start()
}

Carの内部でEngineのインスタンスを作成しているため、
違う種類のEngineに変更したいときはCar自体を作り直す必要がある(Carの再利用ができない)。

DIする

Carに対してEngine オブジェクトをコンストラクタ内でパラメータとして渡す(コンストラクタインジェクション)。

class Car(private val engine: Engine) {
    fun start() {
        engine.start()
    }
}

fun main(args: Array) {
    val engine = Engine()
    val car = Car(engine)
    car.start()
}

違う種類のEngineに変更したいときは、
別のEngineインスタンスをCarのコンストラクタ引数として渡せば良い(Carが再利用できる)。

もしくは宣言だけしておいて、クラスの作成後に依存関係をインスタンス化する(フィールドインジェクション)。

lass Car {
    lateinit var engine: Engine

    fun start() {
        engine.start()
    }
}

fun main(args: Array) {
    val car = Car()
    car.engine = Engine()
    car.start()
}

DIすると何が良いのか

  • 依存関係を分離できて、クラスの再利用がしやすくなる
  • リファクタリングが容易になる
  • テストがしやすい(依存関係のオブジェクトをテストダブルに変更してテストできる)