Sobes.tech
Middle

Ի՞նչ նպատակով է օգտագործվում կախվածությունների ներդրումը (dependency injection) Android հավելվածներում։

sobes.tech AI

Պատասխան AI-ից

Վեբկայանների կախվածությունը (DI) օգտագործվում է Android հավելվածներում կոդի դեկոմպոզիցիայի, թեստավորման բարելավման և ռեֆակտորինգի հեշտացման համար: Այն թույլ է տալիս կոմպոնենտներին ստանալ կախվածությունները արտաքին աղբյուրներից, այլ ոչ թե ինքնուրույն ստեղծել:

Հիմնական նպատակները DI-ի օգտագործման Android-ում.

  • Դեկապլինգ (կապվածության բացում): Կոմպոնենտները դառնում են ավելի քիչ խիստ կապված միմյանց հետ: Մի կախվածության փոփոխությունը չի պահանջում փոփոխություններ օգտագործող կոմպոնենտում:
  • Թեստավորման հնարավորություն: Լավ է հեշտությամբ փոխարինել կախվածությունների թեստային իրականացումներով (մոկեր, ֆեյքեր) միավորային թեստեր գրելու ժամանակ:
  • Կյանքի ցիկլի կառավարում: DI ֆրեյմվորկները կարող են կառավարել օբյեկտների ստեղծումը և ոչնչացումը, ապահովելով ճիշտ կյանքի ցիկլերը կախվածությունների համար, ինչը հատկապես կարևոր է Android-ում՝ նրա հատուկ կյանքի ցիկլերով Activities, Fragments և այլն:
  • Կրկնակի օգտագործում: Կախվածությունները հեշտությամբ կարող են կրկնօրինակվել տարբեր հավելվածի կոմպոնենտներում:
  • Կոդի պարզեցում: Կոդը դառնում է ավելի մաքուր և հասկանալի, քանի որ անհրաժեշտ չէ ձեռքով ստեղծել և փոխանցել կախվածությունները կոնստրուկտորների կամ սեթերների միջոցով:

Android-ում DI ֆրեյմվորկների օրինակներ՝ 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-ի թեստավորման ժամանակ։