Sobes.tech
Middle

Obyekt yönümlü proqramlaşdırmada irsiyyət hansı vəziyyətlərdə faydalıdır və hansı hallarda ondan imtina etmək lazımdır?

sobes.tech Süni İntellekt

AI-dan cavab

Miras, kodun təkrarlanması və irsiyyət üçün hierarxiyalar üçün faydalıdır:

  • Kodun təkrarlanmasının qarşısını almaq: Ümumi funksionallıq əsas sinfə yerləşdirilir.
  • Növ hiyerarşilərinin yaradılması (is-a əlaqəsi): Uşaqlıq sinfi bir növ əsas sinifdir.
  • Polimorfizm: Müxtəlif tiplərdəki obyektləri ümumi əsas sinif interfeysi vasitəsilə işləmək imkanı.
  • Funksionallığın genişləndirilməsi: Mövcud sinfə yeni metodlar və ya sahələr əlavə etmək.

İrsiyyətdən qaçınmaq lazım olan hallar:

  • Liskov yerinə qoyma prinsipi pozulur: Uşaqlıq sinfi, proqramın düzgünlüyünü dəyişmədən, əsas sinfi tam əvəz edə bilməz.
  • Sinflər arasında sərt əlaqə yaranır: Əsas sinifdəki dəyişikliklər, istənməyən təsirlərlə bütün uşaqlara təsir edə bilər.
  • Fərqli və əlaqəsiz mənbələrdən funksionallıq birləşdirilməlidir (has-a əlaqəsi): Kompozisiyadan istifadə etmək daha yaxşıdır.
  • Hierarxiya çox mürəkkəb olur: Dərin irs zəncirləri, dəstəkləmək və anlamaq çətinləşdirir.
  • Kodun təkrarlanmasını qarşısını almaq üçün irsiyyət, əgər funksionallıq ümumi "növ" deyilsə: Yardımçı sinflər və ya delegasiya istifadə etmək daha yaxşıdır.
// Nümunə, irsiyyət faydalıdırsa
open class Animal {
    open fun makeSound() {
        println("Ümumi heyvan səsi")
    }
}

class Dog : Animal() { // Dog, Animal
    override fun makeSound() {
        println("Hav hav")
    }
}

class Cat : Animal() { // Cat, Animal
    override fun makeSound() {
        println("Miyav")
    }
}
// "has-a" əlaqəsi üçün irsiyyət yerinə kompozisiya üstünlük təşkil edir
class Engine {
    fun start() { println("Mühərrik işə düşdü") }
}

// Car üçün Engine-dən irsiyyət yerinə
// class Car : Engine() // Pis dizayn, Car, Engine deyil

class Car {
    private val engine = Engine() // Car, Engine-ə sahib
    fun drive() {
        engine.start()
        println("Maşın hərəkətdə")
    }
}