Ինչ եք գիտակցում դասերի կազմության մասին ծրագրավորման մեջ?
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)
}
}