Dagger 2 @ Binds vs @Provides

Počínaje Daggerem 2.12 (omlouvám se, vím, že je to docela dávno zpátky ... ale stále stojí za to to pochopit), k Daggersovi byla přidána tato nová funkce s názvem @Binds. O tom již existují blogy. Nicméně jejich čtení stále mě zajímá, jakou výhodu má starý věrný @Provides, který máme v našich modulech.

Protože mým cílem je co nejjasnější vyjádření, píšu to poté, co na to provedu své vlastní vyšetřování, a to způsobem, který vyjasní moje otázky.

Co se liší v kódování

@Provides

@Modul
třída MyModule {
    @Provides
    fun getInjectClass (injectObject: InjectClass): InjectInterface {
        návrat injObject
    }
}
class InjectClass @Inject constructor (): InjectInterface
rozhraní InjectInterface

@ Vazby

@Modul
abstraktní třída MyModule {
    @ Vazby
    abstraktní zábava getInjectClass (injectObject: InjectClass):
        InjectInterface
}
class InjectClass @Inject constructor (): InjectInterface
rozhraní InjectInterface

Z výše uvedeného není zřejmá jasná výhoda @Binds oproti @Provides. Jeden se proměnil v abstraktní třídu a funkci, zatímco druhá je konkrétní. Snižuje se tím žádná výřečnost (nebo varná deska).

Co je tedy výhodou @Binds?

Abychom to věděli, podívejme se na nějakou historii

Historicky…

Ve velmi rané fázi Daggeru neexistuje nic jako @Module. @Module ve skutečnosti není potřeba k tomu, aby fungoval Dagger 2 (podívejte se na nejkratší kód dýka 2 na světě).

Lidé si však stěžují a chtěli spojit závislé osoby dohromady. Vývojář Dagger 2 se tedy vzdal a vytvořil tuto skvěle známou funkci call @Module, která má výhody, jaké mnozí z nich chtěli.

Nicméně existence @Module s @Provides zavádí do generovaného kódu určitou režii. Abychom tomu pomohli, byl představen @Binds.

Dokažte mi to…

Pomocí výše uvedeného kódu (spolu s @ komponentou, která není uvedena v úryvku kódu výše)… se podívejme na různé

Zvláštní třídy továrních modulů

Níže jsou generovány třídy.

@Provides generuje třídu MyModule_GetInjectClassFactory, která v @Binds neexistuje

Jak vypadá třída? Páni, docela dost kódů ..

Kromě toho je to pouze pro jednu InjectClass. Pokud však v našem modulu máme více než 1, každý z nich vygeneruje vlastní třídu továrny

@Provides
fun getInjectClass (injectObject: InjectClass): InjectInterface {
    návrat injObject
}
@Provides
fun getInjectClass2 (injectObject2: InjectClass2): InjectInterface2 {
    návrat injObject2
}
@Provides
fun getInjectClass3 (injectObject3: InjectClass3): InjectInterface3 {
    návrat injObject3
}

Představte si, jak to přispěje k našemu DexCount a velikosti aplikace !!

Extra vrstva obalu modulu

Kromě další třídy Module Factor, pokud máme prozkoumat vytvořenou třídu DaggerMyComponent, viděli bychom velikost kódu odlišnou.

Růžová je ta v @Provides pouze, zatímco zelená je v @Binds

@Provides generuje 52 řádků kódů a @Binds generuje pouze 29 řádků kódů (~ 40% snížení !!).

Pokud sledujete kód, uvidíte postup níže.

Podívejte se, kolik stručných @Binds je při vytváření InjectObject?

Stručně řečeno, nejen @ vazby snižují počet řádků, ale také snižují vytváření objektů a tok operací.

Takže změníme vše na @ vazby?

@Binds bohužel funguje pouze na základě níže uvedených pravidel

Metody @Binds musí mít pouze jeden parametr, jehož typ lze přiřadit k návratovému typu

Takže pouze jediný parametr a návrat typu je obvykle rozhraním daného objektu parametru.

Přesto je třeba zvážit použití statické funkce pro @Provides, která by také pomohla snížit některé vygenerované kódy.

Podívejte se na část 1 níže uvedeného blogu, abyste získali podrobnější informace (po přečtení výše uvedeného můžete získat jasnější porozumění níže uvedenému blogu)

Doufám, že vám tento příspěvek pomůže. Zde si můžete prohlédnout moje další zajímavá témata.

Sledujte mě na médiu, Twitteru nebo Facebooku, kde najdete pár tipů a učení o tématech souvisejících s Androidem, Kotlinem atd. ~ Elye ~