Sobes.tech
Middle

Zašto se koristi ubrizgavanje zavisnosti (dependency injection) u Android aplikacijama?

sobes.tech АИ

Одговор од АИ

Уграђивање зависности (DI) се користи у Android апликацијама за декомпозицију кода, побољшање тестирања и олакшање рефакторинга. Оно омогућава компонентама да добијају зависности из спољашњих извора, а не да их самостално креирају.

Главни циљеви коришћења DI у Android-у:

  • Декупање (развязывање зависности): Компоненте постају мање чврсто повезане једна са другом. Промена једне зависности не захтева измене у компонентама које је користе.
  • Тестираност: Лако је подесити тестне реализације зависности (мокови, фаикови) при писању јединствених тестова.
  • Управљање животним циклусом: Фрејмворци DI могу управљати креирањем и уништавањем објеката, обезбеђујући исправне животне циклусе за зависности, што је посебно важно у Android-у са његовим специфичним животним циклусима Activities, Fragments итд.
  • Поновна употреба: Зависности могу бити лако поново коришћене од стране различитих компоненти апликације.
  • Поједностављење кода: Код постаје чистији и разумљивији, јер није потребно ручно креирати и преносити зависности кроз конструкторе или сетере.

Примери фрејмворка DI у Android-у: Hilt (препоручени Google), Dagger, Koin.

Пример (псеудокод без DI):

// Класа која креира зависност унутар себе
class UserRepository {
    private val apiService = ApiService() // Унутрашње креирање зависности

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

class ApiService {
    fun fetchUser(id: Int): User {
        // Логика добијања података
        return User(id, "John Doe")
    }
}

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

Пример (псеудокод са DI):

// Класа која добија зависност кроз конструктор
class UserRepository(private val apiService: ApiService) {

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

class ApiService {
    fun fetchUser(id: Int): User {
        // Логика добијања података
        return User(id, "Jane Doe")
    }
}

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

// Негде у коду, где се конфигурише DI:
// val apiService = ApiService()
// val userRepository = UserRepository(apiService)

У последњем примеру, UserRepository не зна како да креира ApiService, он је једноставно добија споља. Ово олакшава замену ApiService тест верзијом током тестирања UserRepository-а.