Sobes.tech
Middle

Android ilovalarida bog'liqni injektsiya qilish (dependency injection) nima uchun ishlatiladi?

sobes.tech AI

AIdan javob

Bağlılıq enjeksiyonu (DI), Android tətbiqlərində kodun parçalanması, test ediləbilərliyin yaxşılaşdırılması və refaktorlaşdırmanın asanlaşdırılması üçün istifadə olunur. Bu, komponentlərin özləri yaratmaq əvəzinə, xarici mənbələrdən bağlılıqları əldə etməsinə imkan verir.

Android-da DI istifadə etməyin əsas məqsədləri:

  • Aparıcıların azaldılması (Decoupling): Komponentlər bir-birindən daha az asılı olur. Bir bağlılığı dəyişdirmək, onu istifadə edən komponentdə dəyişiklik etməyi tələb etmir.
  • Test ediləbilərlik: Birlik testləri yazarkən test tətbiqlərini (mocks, fakes) asanlıqla dəyişdirmək mümkündür.
  • Həyat dövrünün idarə olunması: DI çərçivələri obyektlərin yaradılmasını və məhvinə nəzarət edə bilər və beləliklə, Android-də xüsusi həyat dövrlərinə (Activities, Fragments və s.) uyğun həyat dövrlərini təmin edir.
  • Yenidən istifadə: Bağlılıqlar müxtəlif tətbiq komponentləri tərəfindən asanlıqla yenidən istifadə oluna bilər.
  • Kodun sadələşdirilməsi: Kod daha təmiz və anlaşılan olur, çünki bağlılıqları əl ilə yaratmaq və ötürmək lazım deyil.

Android-də DI üçün nümunə çərçivələri: Hilt (Google tövsiyə edir), Dagger, Koin.

Nümunə (DI olmadan pseudokod):

// Özündə bağlılıq yaradan sinif
class UserRepository {
    private val apiService = ApiService() // Daxili bağlılıq yaradılması

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

class ApiService {
    fun fetchUser(id: Int): User {
        // Məlumatların alınması loqikası
        return User(id, "John Doe")
    }
}

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

DI ilə pseudokod nümunəsi:

// Konstruktor vasitəsilə bağlılığı alan sinif
class UserRepository(private val apiService: ApiService) {

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

class ApiService {
    fun fetchUser(id: Int): User {
        // Məlumatların alınması loqikası
        return User(id, "Jane Doe")
    }
}

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

// Koddakı bir yerdə, DI konfiqurasiyası:
// val apiService = ApiService()
// val userRepository = UserRepository(apiService)

Son nümunədə, UserRepository ApiService-in necə yaradılacağını bilmədən, sadəcə xaricdən alır. Bu, ApiService-in test versiyasına asanlıqla keçməsinə imkan verir, beləliklə, UserRepository test edilərkən fərqli versiya istifadə oluna bilər.