- Dependency Injectionとは
- Dependency Inversion Principle とは
- Hiltとは
Dependency Injection (依存性の注入)とは
Dependency Injection(DI)とは、
あるクラスが依存するオブジェクトを「自分で作らず、外から渡してもらう」設計手法のことです。
❌ DIしない例(ViewModelが自分でRepositoryを生成)
class MyViewModel {
private val repository = UserRepository() // 自分で生成 → 密結合
} ✅ DIした例(外部から注入)
class MyViewModel(
private val repository: UserRepository // コンストラクタで受け取る
) こうすることで、ViewModel は Repository の具体的な作り方を知らなくてよくなり、テスト時にはモックを差し替えられるなどの利点があります。
DIのメリット
- クラスの再利用性の向上
- 依存関係の分離
- テストの容易性の向上
Dependency Inversion Principle(DIP, 依存関係逆転の原則)とは
Dependency Inversion Principle(DIP)とは
上位のクラスが下位の具体クラスに直接依存するのではなく、
両者が「抽象(interface)」を介してやり取りするようにする原則。
呼び出す側は「結果」さえ得られればよく、内部の実装方法は知らなくてよい状態を目指す。
❌ DIP違反(具体クラスに依存している)
// ViewModel が具体的な実装クラスに直接依存
class MyViewModel(
private val repository: UserRepositoryImpl // 実装クラスに依存
) ✅ DIPに従った例(抽象に依存)
// 抽象(interface)を定義
interface UserRepository {
suspend fun fetchUser(): User
}
// 実装はインターフェースを満たす
class UserRepositoryImpl : UserRepository { ... }
class FakeUserRepository : UserRepository { ... } // テスト用
// ViewModel は interface にだけ依存
class MyViewModel(
private val repository: UserRepository // 抽象に依存
) こうすると ViewModel は 「fetchUser() を呼べば User が返ってくる」ことだけを知っていればよく、実際にAPIを叩くのか、DBから取るのか、テスト用のダミーなのかは関係なくなる。
Androidでの実装方法
AndroidではHiltを使うことでボイラープレートを削減でき簡単に実現できます。
Hiltのアノテーション処理には従来 kapt(Kotlin Annotation Processing Tool)が使われていましたが、現在はより高速なKSP(Kotlin Symbol Processing)への移行が推奨されています。KSPはkaptと比べてビルド速度が最大2倍向上します。Hiltは2024年以降KSPを正式サポートしており、新規プロジェクトではKSPの使用が推奨です。
今回のハンズオン用リポジトリでもKSPを利用しています。
