Upgrade to Pro — share decks privately, control downloads, hide ads and more …

HiltのCustom Componentについて

HiltのCustom Componentについて

Takuji Nishibayashi

May 31, 2024
Tweet

More Decks by Takuji Nishibayashi

Other Decks in Technology

Transcript

  1. 自己紹介 西林 拓志 (にしばやし たくじ ) Twitter/GitHub takuji31 Sansan 株式会社

    技術本部 Mobile Application グループ Eight Android エンジニア Android (2009〜 ) Kotlin (2014〜 ) 1
  2. Component Tree with Custom Component SingletonComponent ActivityRetainedComponent ServiceComponent UserComponent ActivityComponent

    ViewModelComponent FragmentComponent ViewComponent HogeComponent ViewWithFragmentComponent 8
  3. ComponentManager @Singleton class UserComponentManager @Inject constructor( private val componentBuilder: Provider<UserComponentBuilder>,

    ) { private var component: UserComponent = componentBuilder.get().userId(UserId(1)).build() private val entryPoint get() = EntryPoints.get(component, UserComponentEntryPoint::class.java) val counterRepository: CounterRepository get() = entryPoint.counterRepository() } 25
  4. Component Tree with Custom Component SingletonComponent ActivityRetainedComponent ServiceComponent UserComponent ActivityComponent

    ViewModelComponent FragmentComponent ViewComponent HogeComponent ViewWithFragmentComponent 28
  5. ComponentManager からとる @Module @InstallIn(ViewModelComponent::class) class ViewModelModule { @Provides fun provideCurrentUserCounterRepository(

    userComponentManager: UserComponentManager ): CounterRepository = userComponentManager.counterRepository } 31
  6. 32

  7. 47

  8. 48

  9. ドキュメント曰く However, before creating a custom component, consider if you

    really need one as not every place where you can logically add a custom component deserves one. カスタム コンポーネントを作成する前に、カスタム コンポーネントが本当に必要かどう かを検討してください。カスタム コンポーネントを論理的に追加できるすべての場所に カスタム コンポーネントが必要なわけではないためです。 49
  10. Custom Component の欠点 Each component/scope adds cognitive overhead. They can

    complicate the graph with combinatorics (e.g. if the component is a child of the ViewComponent conceptually, two components likely need to be added for ViewComponent and ViewWithFragmentComponent). Components can have only one parent. The component hierarchy can’t form a diamond. Creating more components increases the likelihood of getting into a situation where a diamond dependency is needed. Unfortunately, there is no good solution to this diamond problem and it can be difficult to predict and avoid. Custom components work against standardization. The more custom components are used, the harder it is for shared libraries. 50
  11. Custom Component の欠点 各コンポーネント /スコープは認知オーバーヘッドを追加します。 組み合わせ論によってグラフが複雑になる可能性があります (たとえば、コンポーネント が概念的に の子である場合、と ViewComponent

    に 2 つのコンポーネントを追加する必 要がある可能性があります )。 ViewComponentViewWithFragmentComponent コンポーネントは親を 1 つしか持つことができません。コンポーネント階層はダイヤモ ンドを形成できません。コンポーネントをさらに作成すると、ダイヤモンド依存関係が 必要になる状況になる可能性が高くなります。残念ながら、このダイヤモンド問題に対 する適切な解決策はなく、予測して回避することは困難です。 カスタム コンポーネントは標準化に反します。カスタム コンポーネントが使用されるほ ど、共有ライブラリが難しくなります。 51
  12. たとえば アプリ内のユーザーを通知する Flow を Repository から取れるようにする Single Activity で ViewModelComponent

    で保持する データ取得の度に毎回ユーザー情報を Room の DB やメモリーから取得する etc. 54