Middle
Obyektga yo'naltirilgan dasturlashda meros qolish qaysi vaziyatlarda foydali bo'lib, qaysi hollarda undan voz kechish kerak?
sobes.tech AI
AIdan javob
Miras, irsiyda kodni takrorlash va turkumlar uchun meros olish foydalidir:
- Kodning takrorlanishini oldini olish: Umumiy funksionallik asosiy sinfga chiqariladi.
- Turlar hierarxiyasini yaratish (is-a aloqasi): Bolalar sinfi bir turdagi bo'lsa, asosiy sinf bilan.
- Polimorfizm: Turli turlar ob'ektlarini umumiy asos sinfi interfeysi orqali ishlash imkoniyati.
- Funktsionallikni kengaytirish: Mavjud sinfga yangi metodlar yoki maydonlar qo'shish.
Merosdan voz kechish kerak bo'lgan holatlar:
- Liskov almashtirish printsipi buziladi: Bolalar sinfi, dastur to'g'riligini o'zgartirmasdan, asosiy sinfni to'liq almashtira olmaydi.
- Sinflar orasida qattiq bog'lanish yaratiladi: Asosiy sinfdagi o'zgarishlar, istalmagan ta'sirlar bilan, barcha bolalar sinflarga ta'sir qilishi mumkin.
- Turli va bog'lanmagan manbalardan funksionalliklarni birlashtirish (has-a aloqasi): Kompozitsiya yaxshiroq.
- Merosning haddan tashqari murakkabligi: Chuqur meros zanjirlari, qo'llab-quvvatlash va tushunishni qiyinlashtiradi.
- Kodning takrorlanishini oldini olish uchun meros, agar funksionallik umumiy "tur" emas bo'lsa: Yordamchi sinflar yoki delegatsiya yaxshiroq.
// Meros foydali bo'lsa, misol
open class Animal {
open fun makeSound() {
println("Umumiy hayvon ovozi")
}
}
class Dog : Animal() { // Dog - Bir Animal
override fun makeSound() {
println("Vov")
}
}
class Cat : Animal() { // Cat - Bir Animal
override fun makeSound() {
println("Miyov")
}
}
// "has-a" aloqasi uchun meros o'rniga kompozitsiya afzal
class Engine {
fun start() { println("Motor ishga tushdi") }
}
// Car uchun Engine'dan meros olish o'rniga
// class Car : Engine() // Yomon dizayn, Car - Engine emas
class Car {
private val engine = Engine() // Car - Engine'ga ega
fun drive() {
engine.start()
println("Avtomobil harakatda")
}
}