Dagger 2 @ Binds vs @ Provides

Upphaf Dagger 2.12 (fyrirgefðu, ég veit að það er nokkuð langt aftur .. en samt þess virði að skilja það), þar er þessi nýi eiginleiki sem heitir @Binds bætt við Daggers. Það eru nú þegar nokkur blogg um það. En það að lesa þær fær mig samt til að velta fyrir mér hvaða kostur það hefur fyrir gamla trúaða @ útveginn sem við höfum í einingunum okkar.

Þar sem markmið mitt er að gera hlutina eins skýra og mögulegt er, þá skrifa ég þetta eftir að hafa gert eigin rannsókn á því, á þann hátt sem hreinsar spurningar mínar.

Hvað er öðruvísi hvað varðar kóða

@ Veitir

@Module
bekknum MyModule {
    @ Veitir
    skemmtilegt getInjectClass (injectObject: InjectClass): InjectInterface {
        skila inndælingu
    }
}
class InjectClass @ Inject constructor (): InjectInterface
viðmót InjectInterface

@ Bindingar

@Module
abstrakt bekknum MyModule {
    @ Bindingar
    abstrakt gaman getInjectClass (injectObject: InjectClass):
        InjectInterface
}
class InjectClass @ Inject constructor (): InjectInterface
viðmót InjectInterface

Af ofangreindu er enginn augljós, skýr kostur af @ Binds umfram @ Provides. Einn fékk breytingu í óhlutbundinn flokk og hlutverk en hinn er steyptur. Það dregur ekki úr neinni orðræðu (eða ketilplötu).

Svo hver er kosturinn við @ Binds?

Til að vita það skulum við skoða nokkra sögu

Sögulega séð ...

Á mjög mjög mjög snemma stigi Dagger er ekkert til eins og @Module. @Module eru í raun ekki nauðsynlegar til að hafa Dagger 2 til að virka (skoðaðu stystu dagger 2 kóða heimsins).

Samt sem áður kvartar fólk og vildi hópa skyldum einstaklingum saman. Þannig að verktaki Dagger 2 gafst upp og bjó til þennan fræga þekkta eiginleikakalla @ Module sem hefur ávinninginn eins og margir vildu.

Engu að síður, tilvist @Module með @ Provides setur fram nokkurt kostnað í mynda kóðanum. Svo @Binds var kynnt til að hjálpa því.

Sannaðu mér það ...

Notaðu ofangreindan kóða, (ásamt @ Component sem er ekki sýndur í kóðanum hér að ofan) ... við skulum kíkja á mismunandi

Auka eining verksmiðjutímar

Hér að neðan eru flokkarnir sem myndaðir eru.

Athugaðu að @Provides býr til MyModule_GetInjectClassFactory bekkinn, sem er ekki til í @Binds

Hvernig lítur bekkurinn út? Vá, töluvert af kóða ..

Að auki er þetta aðeins fyrir einn InjectClass. En ef við höfum fleiri en 1 af þeim í mát okkar mun hver þeirra framleiða sjálfa verksmiðjugrein

@ Veitir
skemmtilegt getInjectClass (injectObject: InjectClass): InjectInterface {
    skila inndælingu
}
@ Veitir
skemmtilegur getInjectClass2 (injectObject2: InjectClass2): InjectInterface2 {
    skila inndælinguObject2
}
@ Veitir
skemmtilegur getInjectClass3 (injectObject3: InjectClass3): InjectInterface3 {
    skila inndælinguObject3
}

Ímyndaðu þér hvernig það mun bæta við DexCount og stærð forritsins !!

Auka lag einingaumbúða

Annað en auka einingaflokkurinn, ef við ætlum að skoða DaggerMyComponent bekkinn okkar, myndum við sjá kóðastærðina mismunandi.

Bleikur er sá sem er í @Provides en grænn er aðeins í @Binds

@Provides býr til 52 línur af kóða og @ Binds býr aðeins til 29 línur af kóða (~ 40% lækkun !!).

Ef þú rekur kóðann sérðu flæðið eins og hér að neðan.

Horfðu á hversu mikið hnitmiðað @ Binds er við að búa til InjectObject?

Í stuttu máli, ekki aðeins @ Binds fækkar línum, það dregur einnig úr mótun hlutarins sem og aðgerðarflæði.

Svo skulum við breyta öllu í @ Binds?

Því miður virkar @Binds aðeins út frá reglunum hér að neðan

@Bindaraðferðir verða að hafa aðeins eina færibreytu sem hægt er að breyta tegundinni til baka

Svo aðeins ein færibreytur, og gerð skila er venjulega viðmót gefins færibreytu mótmæla.

Að þessu sögðu eru önnur ráð að íhuga að nota truflanir fyrir @ framboð sem myndi hjálpa til við að draga úr nokkrum mynduðum kóða.

Skoðaðu hluta 1 hlutans af blogginu hér að neðan til að fá meiri innsýn (eftir að hafa lesið hér að ofan gætirðu fengið skýrari skilning á blogginu hér að neðan)

Ég vona að þessi færsla nýtist þér. Þú gætir skoðað önnur áhugaverð efni mín hér.

Fylgdu mér á miðli, Twitter eða Facebook fyrir smá ráð og fræðslu um Android, Kotlin o.fl. efni. ~ Elye ~