Java proqramlaşdırma dilində obyekt yönlü proqramlaşdırmanın (OOP) iki əsas anlayışı olan inheritance və composition proqramın strukturlaşdırılması və kodun təkrar istifadəsi baxımından çox vacib rol oynayır.
Bu məqalədə hər iki anlayışı dərin təhlil edəcək, onların fərqlərini, üstünlüklərini və real nümunələr əsasında hansı vəziyyətdə hansının seçilməli olduğunu izah edəcəyik.
Inheritance nədir?
Inheritance - bir class-ın başqa bir class-ın xüsusiyyətlərini və metodlarını miras almasına imkan verən OOP prinsiplərindən biridir.
Sadə nümunə:
class Animal {
void sound() {
System.out.println("Heyvan səsi");
}
}
class Dog extends Animal {
void bark() {
System.out.println("Hürmək");
}
}
Burada Dog
class-ı Animal
class-ından miras alır və həm sound()
metodunu istifadə edə bilir, həm də özünə məxsus bark()
metoduna sahibdir.
Inheritance-ın əsas xüsusiyyətləri:
extends
açar sözü ilə yazılır.- Java-da çoxlu irsilik (multiple inheritance) yalnız interfeyslərlə mümkündür.
super
açar sözüparent class
-a müraciət etmək üçün istifadə olunur.
Inheritance-ın üstünlükləri
- Kod təkrarını azaldır. Eyni funksionallığı müxtəlif class-larda yenidən yazmağa ehtiyac yoxdur.
- Quruluşlu ierarxiya yaradır. Class-lar arasında əlaqə vizual və konseptual cəhətdən aydın olur.
- Yenidən istifadə imkanı. Mövcud kod bazasından yeni class-lar yaradıla bilər.
️ Inheritance-ın çatışmazlıqları
- Sıx bağlılıq (tight coupling). Əsas class-dakı dəyişikliklər törəmə class-lara təsir edə bilər.
- Dizaynın çevikliyi azalır. Törəmə class-lar əsas class-ın strukturu ilə məhdudlaşır.
- “Fragile base class” problemi. Əsas class-dakı dəyişikliklər bütün sistemə gözlənilməz təsir göstərə bilər.
🧩 Composition nədir?
Composition, bir class-ın başqa bir class-ı öz daxilində obyekt kimi saxlaması və onun metodlarından istifadə etməsi prinsipi üzərində qurulub.
Yəni burada class-lar arasında “has-a” münasibəti olur.
Sadə nümunə:
class Engine {
void start() {
System.out.println("Mühərrik işə düşdü");
}
}
class Car {
private Engine engine = new Engine();
void drive() {
engine.start();
System.out.println("Maşın hərəkət edir");
}
}
Bu nümunədə Car
class-ı Engine
class-ını istifadə edir, lakin ondan irs almır.
Composition-nun üstünlükləri
- Sərbəstlik (loose coupling). Composition olunan class asanlıqla dəyişdirilə və əvəz edilə bilər.
- Test etmək daha asandır. Mock obyektlər ilə testlər daha effektiv yazılır.
- Dizayn daha çevik olur. Dinamik davranışlar asanlıqla idarə olunur.
️ Composition-nun çatışmazlıqları
- Dizaynın mürəkkəbləşməsi. Əgər çoxlu class-lar bir-birini compose edirsə, oxumaq və başa düşmək çətinləşə bilər.
- Əlavə kod yazmaq tələb oluna bilər. Composition inheritance-ə nisbətən bir qədər daha çox konfiqurasiya tələb edir.
🧠 Hansını nə zaman seçməli?
Məsələ | Inheritance | Composition |
---|---|---|
Münasibət | “is-a” | “has-a” |
Kod təkrarını azaltmaq | ![]() |
![]() |
Çevik dizayn | ![]() |
![]() |
Test ediləbilərlik | Orta | Yüksək |
Valideyn dəyişiklikləri təsiri | Yüksək | Aşağı |
Sadə qayda:
Əgər class-lar arasında “is-a” münasibəti varsa —
Inheritance
,
“has-a” münasibəti varsa —Composition
istifadə edin.
Best Practice: “Prefer composition over inheritance”
Məşhur dizayn prinsiplərindən biri də budur:
“Composition-u Inheritance-dan üstün tutun”
Çoxlu məşhur dizayn nümunələri (design patterns) də bu prinsipi əsas götürür:
- Strategy pattern
- Decorator pattern
- Observer pattern və s.
Nəticə
Java proqramlarında Inheritance və Composition hər biri öz yerində çox faydalı vasitələrdir. Əsas məsələ — onları düzgün kontekstdə istifadə etməkdir. Inheritance daha sadə görünsə də, zamanla sistemin çevikliyinə zərər verə bilər. Ona görə də çox vaxt Composition-a üstünlük vermək daha sağlam yanaşmadır.