Slide 1

Slide 1 text

Androidアプリ開発にお けるDIライブラリの比較 会津大学 谷川直弥

Slide 2

Slide 2 text

ࣗݾ঺հ ໊લ େֶ ֶ෦ ֶ೥ ग़਎ झຯ Ұݴ ୩઒௚໻ ձ௡େֶ ίϯϐϡʔλཧ޻ֶ෦ ֶ෦೥ Ѫ஌ݝ ອըɺ͓স͍ɺόΠΫɺཱྀߦ ݄͔Β೥χʔτͩɻ

Slide 3

Slide 3 text

目次 1. DIの概要 2. DIライブラリを使うメリット 3. 各DIライブラリの概要 4. DIライブラリの違い 5. 実装例 6. DIライブラリの選択 7. 感想

Slide 4

Slide 4 text

DI(Dependency Injection)の概要 • コンポーネント間の依存を外部から注入して、 クラス同士の結合を弱めるデザインパターン • 制御反転(Inversion of Control)の一種 • 関心の分離により、疎結合なコードになるようにしている • AndroidにおけるDIは、コンストラクタインジェクションとフィールド インジェクションがある

Slide 5

Slide 5 text

手動のDIでは問題点が多いから、DIライブラリを利用する DIライブラリを使うメリット • コードの使い回しのしやすさ • テストの容易さ • リファクタリングの容易さ

Slide 6

Slide 6 text

Kotlinで記述された、軽量でシンプルなDIライブラリ 各DIライブラリの概要~Koin~ 特徴 • コンパイル時の生成コードがな い(ランタイム時)ため、ビルド時 間が短縮 • Kotlinの拡張関数と、DSLを利用 して依存性の解決 • 幅広いプラットフォームに対応

Slide 7

Slide 7 text

各DIライブラリの概要~DaggerとHilt~ Daggerの特徴 • 柔軟な設定オプション • コンパイル時の依存関係検証 • Android開発に対する広範なサポ ートとドキュメント • アノテーションベースのDI Hiltの特徴 • セットアップの容易さ • デフォルトの設定 • Android Jetpackとの統合 • コンパイル時の依存関係検証 DaggerとHiltはJavaやKotlin、Android(Hiltのみ)で利用されるDIライブラリ

Slide 8

Slide 8 text

Kotlinで記述された、軽量でシンプルなDIライブラリ 各DIライブラリの概要~Kodein~ 特徴 • DSLを使用した簡潔な構文 • コンパイル時の生成コードがな い(ランタイム時)ため、ビルド時 間が短縮 • リフレクションを利用して、依 存性を解決

Slide 9

Slide 9 text

実装 ~KoinとHilt~ Koin val appModule = module { single { RepositoryImpl() } viewModel { SampleViewModel(get()) } } class MyApplication : Application() { override fun onCreate() { super.onCreate() startKoin { androidContext(this@MyApplication) modules(appModule) } } } @Module @InstallIn(ApplicationComponent::class) abstract class HiltModule { @Binds abstract fun bindRepository(repositoryImpl: RepositoryImpl): Repository } @HiltAndroidApp class MyApplication : Application() @HiltViewModel class SampleViewModel @Inject constructor(private val repository: Repository) : ViewModel() { // ... } Hilt

Slide 10

Slide 10 text

実装 ~Kodein~ Kodein val appModule = DI.Module("appModule"){ bind() with singleton { RepositoryImpl() } bind() from provider { SampleViewModel(instance()) } } class MyApplication : Application(), DIAware { override val di = DI.lazy { import(androidXModule(this@MyApplication)) import(appModule) } } class MainActivity : ComponentActivity(), DIAware { override val di by closestDI() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val viewModel: SampleViewModel by instance() val data = viewModel.data.collectAsState() SampleScreen(data = data.value) } } }

Slide 11

Slide 11 text

DIライブラリの違い 項目 Koin Kodein Hilt 言語 Kotlin Kotlin, Java Kotlin, Java 設計哲学 シンプルさと簡潔さ 汎用性 Android向けの統合 DSL あり あり なし(アノテーション) パフォーマンス 良い 良い(リフレクション使 用) 非常に良い スコープ管理 拡張関数による簡単な 定義 タグを使用した定義 アノテーションによる定 義 プラットフォーム対応 Android, デスクトップ, サーバーサイド, KMM Android, デスクトップ, サーバーサイド Android専用 依存関係解決 実行時 実行時(リフレクション) コンパイル時 Jetpack統合 なし なし あり

Slide 12

Slide 12 text

基本的に検討すべき項目は以下の通りです。 DIライブラリの選択について • パフォーマンス • 設定の容易性 • 型安全性 • Android Jetpackとの統合 • プラットフォーム対応 • メンテナンスと更新

Slide 13

Slide 13 text

感想 - 初心者のうちはKoinが使いやすいと思った - KoinはKMMでiOSでも使えるから汎用性高そう - 次はKMMでやりたい - もう前日に徹夜で資料作るの今回で最後にします…(n回目)

Slide 14

Slide 14 text

Credits and References - The deck was generated by SlidesGPT - https://dagger.dev/ - https://developer.android.com/guide/background-threading - https://dagger.dev/hilt/ - https://developer.android.com/training/dependency-injection/hilt-android - https://insert-koin.io/ - https://blog.logrocket.com/kotlin-dependency-injection-koin-vs-hilt/ - https://shimbaroid.hatenablog.jp/entry/2017/06/11/011103