Sobes.tech
Middle

Барои чӣ истифода мешавад ворид кардани вобастагиҳо (dependency injection) дар барномаҳои Android?

sobes.tech AI

Ҷавоб аз AI

Иштирокии вобаста ба такмилиёти вобаста ба 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-ро барои тест дар версияи тестӣ иваз кардан мумкин аст.