Sobes.tech
Junior

Ինչ եք գիտակցում դասերի կազմության մասին ծրագրավորման մեջ?

sobes.tech AI

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

Կոմպոզիցիան՝ դա «պատկանում է» կամ «մաս է ամբողջի», որտեղ մի դաս (կոմպոզիտ) պարունակում է հղում մյուս դասին (կոմպոնենտ) կամ նրա օրինակներին: Կոմպոնենտի կյանքի ցիկլը սովորաբար սերտորեն կապված է կոմպոզիտի հետ: Սա ուժեղ կապ է, որտեղ կոմպոնենտը չի կարող գոյություն ունենալ առանց կոմպոզիտի:

Կոմպոզիցիայի առավելությունները՝

  • Բազմակողմանիություն: Հեշտ է փոխել վարքագիծը՝ փոխելով կոմպոնենտները:
  • Կրճատել կապը: Դասերը ավելի քիչ կախված են միմյանցից՝ համեմատած ժառանգության:
  • Կրկնակի օգտագործում: Միևնույն կոմպոնենտները կարելի է օգտագործել տարբեր կոմպոզիտներում:

Օրինակ՝ Ավտոմոբիլ դասը կարող է պարունակել Մոտոր դասի հղում: Եթե Ավտոմոբիլ-ը ոչնչացվի, ապա և Մոտոր-ը (այստեղ) դադարում է գոյություն ունենալ:

class Մոտոր {
    // շարժիչի հատկություններ և մեթոդներ
}

class Ավտոմոբիլ {
    private Մոտոր շարժիչ; // կոմպոզիցիա

    public Ավտոմոբիլ() {
        this.շարժիչ = new Մոտոր(); // կոմպոզիտում ներսում ստեղծում
    }

    // այլ հատկություններ և մեթոդներ
}

Տարբերությունը՝Ագրեգացիայից՝ այն է, որ ագրեգացիայում կոմպոնենտները կարող են գոյություն ունենալ անկախ կոմպոզիտից (թույլ կապ): Օրինակ՝ Համալսարան դասը կարող է պարունակել Ուսանող դասի օրինակների հղումներ: Ուսանողները կարող են գոյություն ունենալ նաև համալսարանի դուրս:

Android ծրագրավորման մեջ կոմպոզիցիան ակտիվորեն օգտագործվում է, օրինակ՝ տեսլականների (ViewGroup պարունակում է View), կախվածությունների կառավարման Dagger/Hilt-ի միջոցով: Սա նախընտրելի մոտեցում է բազմակի ժառանգությունից (որը Java/Kotlin-ում չկա դասերի համար) և հաճախ ավելի ճկուն է, քան միակողմանի ժառանգությունը:

class UserRepository(private val apiService: ApiService) {
    // UserRepository "օգտագործում է" ApiService (կոմպոզիցիա/ագրեգացիա)
    fun fetchUser(userId: String) {
        // apiService.getUser(userId)
    }
}