Sobes.tech
Middle

Na čo sa používa vkladanie závislostí (dependency injection) v Android aplikáciách?

sobes.tech AI

Odpoveď od AI

Vkladanie závislostí (DI) sa používa v Android aplikáciách na dekompozíciu kódu, zlepšenie testovateľnosti a uľahčenie refaktoringu. Umožňuje komponentom získavať závislosti z externých zdrojov, nie ich vytvárať samostatne.

Hlavné ciele používania DI v Android:

  • Decoupling (rozviazanie závislostí): Komponenty sa stávajú menej pevne prepojené. Zmena jednej závislosti nevyžaduje zmeny v komponentoch, ktoré ju používajú.
  • Testovateľnosť: Jednoducho sa dajú nahradiť testovacie implementácie závislostí (mocks, fakes) pri písaní jednotkových testov.
  • Správa životného cyklu: Frameworky DI môžu riadiť vytváranie a ničenie objektov, zabezpečujúc správne životné cykly závislostí, čo je obzvlášť dôležité v Android s jeho špecifickými životnými cyklami Activities, Fragments atď.
  • Znovupoužiteľnosť: Závislosti môžu byť ľahko znovu použité rôznymi komponentmi aplikácie.
  • Zjednodušenie kódu: Kód je čistejší a prehľadnejší, pretože nie je potrebné manuálne vytvárať a prenášať závislosti cez konštruktory alebo settery.

Príklady frameworkov DI v Android: Hilt (odporúčaný Google), Dagger, Koin.

Príklad (pseudokód bez DI):

// Trieda, ktorá vytvára závislosť vo vnútri seba
class UserRepository {
    private val apiService = ApiService() // Vnútorné vytvorenie závislosti

    fun getUser(id: Int): User {
        return apiService.fetchUser(id)
    }
}

class ApiService {
    fun fetchUser(id: Int): User {
        // Logika získavania dát
        return User(id, "John Doe")
    }
}

data class User(val id: Int, val name: String)

Príklad (pseudokód s DI):

// Trieda, ktorá dostáva závislosť cez konštruktor
class UserRepository(private val apiService: ApiService) {

    fun getUser(id: Int): User {
        return apiService.fetchUser(id)
    }
}

class ApiService {
    fun fetchUser(id: Int): User {
        // Logika získavania dát
        return User(id, "Jane Doe")
    }
}

data class User(val id: Int, val name: String)

// Niekde v kóde, kde sa nastavuje DI:
// val apiService = ApiService()
// val userRepository = UserRepository(apiService)

V poslednom príklade UserRepository nevie, ako vytvoriť ApiService, jednoducho ju dostáva zvonku. To uľahčuje výmenu ApiService za testovaciu verziu pri testovaní UserRepository-a.