Sobes.tech
Middle

Milleks kasutatakse sõltuvuste sisestamist (dependency injection) Android rakendustes?

sobes.tech AI

Vastus AI-lt

Sõltuvuste injekteerimine (DI) kasutatakse Android rakendustes koodi dekombineerimiseks, testimise parandamiseks ja refaktoreerimise lihtsustamiseks. See võimaldab komponentidel saada sõltuvusi välisest allikast, mitte ise luua neid.

Androidis DI kasutamise peamised eesmärgid:

  • Dekoppimine (sõltuvuste lahtiharutamine): Komponendid muutuvad vähem tihedalt seotud üksteisega. Ühe sõltuvuse muutmine ei nõua muudatusi kasutavas komponendis.
  • Testitavus: On lihtne asendada sõltuvuste testversioone (mocks, fakes) üksustestide kirjutamisel.
  • Elutsükli haldamine: DI raamistikud võivad hallata objektide loomist ja hävitamist, tagades õige elutsükli sõltuvustele, mis on eriti oluline Androidis selle spetsiifiliste elutsüklitega Activities, Fragments jms.
  • Taaskasutus: Sõltuvused saab hõlpsasti kasutada erinevates rakenduse komponentides.
  • Koodi lihtsustamine: Kood muutub puhtamaks ja arusaadavamaks, kuna ei ole vaja käsitsi luua ja edastada sõltuvusi konstruktorite või setterite kaudu.

Androidi DI raamistikud: Hilt (soovitatav Google), Dagger, Koin.

Näide (pseudo-kood ilma DI):

// Klass, mis loob sõltuvuse ise
class UserRepository {
    private val apiService = ApiService() // sisemine sõltuvuse loomine

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

class ApiService {
    fun fetchUser(id: Int): User {
        // andmete saamise loogika
        return User(id, "John Doe")
    }
}

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

Näide (pseudo-kood DI-ga):

// Klass, mis saab sõltuvuse konstruktorist
class UserRepository(private val apiService: ApiService) {

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

class ApiService {
    fun fetchUser(id: Int): User {
        // andmete saamise loogika
        return User(id, "Jane Doe")
    }
}

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

// Kuskil koodis, kus toimub DI seadistamine:
// val apiService = ApiService()
// val userRepository = UserRepository(apiService)

Viimases näites ei tea UserRepository, kuidas luua ApiService, ta lihtsalt saab selle väljastpoolt. See lihtsustab ApiService asendamist testversiooniga testimise ajal.