Umetanje zavisnosti (Dependency Injection) pomoću Dagger 2

Share

U ovom tekstu govoriću o umetanju zavisnosti (Dependecy Injection), šta je zavisnost, šta je umetanje, šta se događa kada ga koristimo, šta se događa kada ga ne koristimo, zašto je neophodno i na kraju, kako da ga uz pomoć Dagger 2 koristimo u našim Android projektima.

Šta je zavisnost (Dependency)?

Da bi smo razumeli šta je umetanje zavisnosti i kako funkcioniše, prvo treba da shvatimo šta je to zavisnost.

Ukratko, u objektno orijentisano programiranju, zavisnost je veza između dva ili više objekata u kojoj je jednom objektu, za svoju implementaciju, potreban neki drugi objekat.

Pogledajmo jednostavan primer da bi smo razumeli ovo malo bolje:

Imamo objekte A i B. Objektu A potreban je objekat B da bi radio svoj posao, stoga objekat B postaje zavisnost.

Zašto su zavisnosti loše?

Previše zavisnosti dovodi do problema koji nazivamo “teška zavisnost” (hard dependency), koji čini naš kod:

  • Teškim za ponovnu iskoristljivost
  • Teškim za testiranje
  • Teškim za održavanje (kada projekat postane kompleksniji)

Ponovna iskoristljivost

Ponovna iskoristljivost je jedna od glavnih “zapovesti” OOP-a.  Kada izmedju klasa i metoda postoje veze i kada su zavisne od mnogih stvari mogućnost ponovne iskorisljivosti znatno opada.

Testiranje

Da bi smo testirali da li naše metode ili klase rade ispravno, u većini slučajeva, potrebno je da kreiramo “lažne” (mock) objekte. Međutim, ako u metodi ili klasi postoji previše zavisnosti, biće veoma teško ili nemoguće testirati ih.

Ukoliko java klasa kreira instancu neke druge klase koristeći operator new, onda tu klasu ne možemo testirati zasebno.

Održivost

Ukoliko naš kod nije u mogućnosti da se ispravno testira, ukoliko komponente nisu ponovno iskoristljive i ukoliko u isto vreme naš projekat neprestano raste, u jednom trenutku postaće veoma težak za održavanje.

Umetanje zavisnosti?

Sada kada znamo šta su to zavisnosti, mnogo je lakše objasniti šta je to umetanje zavisnosti (Dependency Injection).

Umetanje zavisnosti je samo jedna od tehnika pomoću koje izbegavamo zavisnost. To je tehnika u kojoj jedan objekat obezbeđuje zavisnosti drugom objektu. Opšti koncept koji stoji iza umetanja zavisnosti naziva se “inverzija kontrole” (Inversion of Control). Prema ovom konceptu objekti ne treba da kreiraju druge objekte od kojih zavise već te objekte dobijaju eksterno.

DAGGER 2

Dagger 2 je jedan od open source frjemvorka za umetanje zavisnosti koji generiše mnoštvo takozvanog boilerplate koda umesto nas. To je druga verzija popularnog frejmvorka razvijenog od strane Square inc. Relacija između klasa u aplikaciji je predstavljena pomoću direktnog acikličnog grafa (Direct Acyclic Graph).

Zašto Dagger 2?

Trenutno ovo je jedini frejmvork koji generiše potpuno čitljiv kod u javi koji izgleda kao kod koji korisnik može da napiše ručno. Više ne koristi refleksiju, što znači da je čitljiviji, lakši za praćenje i otklanjanje grešaka (debugging). Takođe su jednostavnost i performanse generisanog koda na istom nivou kao i ručno pisani kod. Ukratko, Dagger 2 generiše celokupan boilerplate kod za umetanje zavisnosti umesto nas.

Kako se formiraju zavisnosti

Kako funkcioniše?

Dagger 2 radi na procesorima anotacija (Annotation processors). Tako da celokupno generisanje koda moguće ispratiti u trenutku kompajliranja.

Procesori anotacija su ti koji uklanjaju boilerplate kod i generišu potreban kod u trenutku kompajliranja.

Anotacije su metapodaci, koji mogu da se asociraju sa klasama, metodama, poljima ili čak drugim anotacijama. U javi, anotacije se koriste da bi se obezbedile dodatne informacije.

Kako se koristi?

Postoje 4 glavna dela u Dagger 2:

  • @Inject (osnovna anotacija pomoću koje se zahtevaju zavisnosti)
  • @Providers (klase čije metode obezeđuju zavisnosti)
  • @Module (metode unutar @Module govore kako želimo da gradimo i prezentujemo zavisnost)
  • @Component (most između @Inject i @Module)

@Inject

Priva i najvažnija anotacija. Možemo je koristiti za:

  • Umetanje preko konstruktora
  • Umetanje preko polja
  • Umetanje preko metode

U suštini, ova anotacija će reći Dagger-u koje zavisnosti je potrebno obezbediti zavisniku.

@Component

Ova anotacija se koristi za kreiranje interfejsa koji sadrži metode koje definišu gde želimo da izvršimo umetanje. Drugim rečima, komponenta je most između generisanog koda i zavisnosti.

@Module

Ova anotacija deklariše koji objekti će biti dostupni za umetanje. Na primer, možemo imati modul nazvan MlekaraModul u kome možemo snabdevati mlekom i jogurtom sve druge klase koje su zavisne od toga. U ovom slučaju potrebno je obeležiti MlekaraModul sa @Module anotacijom.

@Providers

Ova anotacija se koristi u klasama obeleženim sa @Module anotacijom i koristi se na metodama koje obezbeđuju objekte za umetanje.

Zaključak

U ovom članku pokrili smo neke osnovne primene Dagger-a. Već sada možemo da primetimo neke od njegovih prednosti i mana ali postoji još mnogo toga za istražiti. Kao što su @Scope, @Qualifer i kako upravljati komponentama. Siguran sam da ste uvideli kako će Dagger 2 promeniti način na koji razvijamo naše projekte, posebno u kombinaciji sa MVP pattern-om i RxJava kada njegov pun potencijal dolazi do izražaja.

Moje mišljenje je da je najbolji način za razumevanje Dagger-a čitanje generisanog koda. U većini slučajeva, ukoliko se “izgubite”, to će vam pomoći da shvatite gde je problem. Takođe, preporučujem čitanje njihove dokumentacije.

Reference:

 

Share

Prijavi se da prvi dobijaš nove blogove i vesti.

Ostavite odgovor

Vladimir Cerovac

Android developer @ Zesium mobile
mm

Vladimir Cerovac je diplomirao na Fakultetu tehnickih nauka u Novom Sadu i magistrirao na Software and Information Tehnology. Sada je Android programer u kompaniji Zesium mobile.

Prijavi se da prvi dobijaš nove blogove i vesti.

Kategorije