〈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すると何が良いのか
- 依存関係を分離できて、クラスの再利用がしやすくなる
- リファクタリングが容易になる
- テストがしやすい(依存関係のオブジェクトをテストダブルに変更してテストできる)
実装
DaggerとHiltをCodeLabで勉強した。記事はまた次に。
Dagger
https://developer.android.com/codelabs/android-dagger#0
DaggerからHiltへの移行
https://developer.android.google.cn/codelabs/android-dagger-to-hilt#0
Hilt
https://developer.android.com/codelabs/android-hilt#0