Sobes.tech
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")
    }
}