JET Academy

Obyekt Yönümlü Proqramlaşdırma nədir?

Obyekt Yönümlü Proqramlaşdırma (Object-Oriented Programming - OOP) müasir proqramlaşdırmanın ən geniş yayılmış və təsirli paradiqmalarından biridir. Bu yanaşma proqram təminatının təşkilini real dünya obyektləri və onların qarşılıqlı əlaqələri modelləşdirməsi prinsipi üzərində qurur. OYP konsepsiyası 1960-cı illərdə formalaşmağa başlamış və 1980-1990-cı illərdə proqramlaşdırma dünyasında dominant mövqe qazanmışdır.

Əsas Fəlsəfə və İdeologiya

Obyekt yönümlü proqramlaşdırmanın mərkəzində real dünyaya bənzər təfəkkür tərzi dayanır. Ənənəvi prosedur proqramlaşdırmada proqram funksiyalar və prosedurlar toplusu kimi qurulurdu - yəni "nə edilməli" suala cavab verilirdi. OYP isə fərqli sual verir: "hansı obyektlər var və onlar bir-biri ilə necə əlaqə qururlar?" Bu paradigmada proqram bir-biri ilə qarşılıqlı təsirdə olan obyektlər sistemi kimi təsəvvür olunur.

Məsələn, bir bank sistemini modelləşdirərkən prosedur yanaşmada "pul köçür", "hesabı yoxla", "faiz hesabla" kimi funksiyalar yaradılardı. OYP yanaşmasında isə "Müştəri", "Hesab", "Əməliyyat", "Kart" kimi obyektlər yaradılır və hər biri öz məlumatlarına və davranışlarına malikdir. Bu obyektlər real dünyadakı müvafiq elementləri təmsil edir və aralarında təbii əlaqələr qurulur.

OYP-nin Dörd Əsas Prinsipi

Obyekt yönümlü proqramlaşdırma dörd fundamental prinsip üzərində qurulur: inkapsulyasiya (encapsulation), abstraksiya (abstraction), varislik (inheritance) və polimorfizm (polymorphism). Bu prinsiplər birlikdə güclü, çevik və saxlanması asan proqram təminatının yaradılmasını mümkün edir.

1. İnkapsulyasiya (Encapsulation)

İnkapsulyasiya məlumatların və onlar üzərində əməliyyat aparan metodların bir vahid struktur daxilində birləşdirilməsi və xarici müdaxilədən qorunması prosesidir. Bu prinsip "məlumatların gizlədilməsi" (data hiding) konsepsiyası ilə sıx bağlıdır.

Real dünyada buna sadə bir misal: televizor pultu. Siz düymələrə basaraq televizorun işini idarə edirsiniz, lakin pulun daxilində necə işlədiyini bilməyə ehtiyac yoxdur. Pultun daxili mexanizmi qorunur və siz yalnız açıq interfeys (düymələr) vasitəsilə onunla qarşılıqlı əlaqə qurursunuz.

Proqramlaşdırmada inkapsulyasiya access modifiers (giriş modifikatorları) vasitəsilə həyata keçirilir: private, protected, public və bəzi dillərdə internal. Private dəyişənlər və metodlar yalnız öz sinfi daxilində əlçatandır, public elementlər isə hər yerdən istifadə oluna bilər. Protected elementlər varislik zəncirində əlçatandır.

İnkapsulyasiyanın üstünlükləri:

  • Məlumatların təhlükəsizliyi: Xarici kod birbaşa dəyişənləri dəyişə bilməz
  • Daxili implementasiyanın dəyişdirilməsi asanlığı: Xarici interfeysi dəyişmədən daxili mexanizmi yeniləyə bilərsiniz
  • Kod keyfiyyətinin artması: Məntiqin bir yerdə cəmlənməsi
  • Səhvlərin azalması: Məlumatların düzgün istifadəsinin təmin edilməsi

Məsələn, bank hesabı sinfi yaradarkən balans dəyişənini private edirik və ona giriş üçün getter və setter metodları təmin edirik:



class BankHesabi {

private double balans;

public double getBalans() {

return balans;

}

public void pulYatir(double məbləğ) {

if (məbləğ > 0) {

balans += məbləğ;

}

}

}

Bu yanaşımla balansa birbaşa mənfi dəyər təyin etmək mümkün olmur və bütün əməliyyatlar nəzarət altında keçir.

2. Varislik (Inheritance)

Varislik bir sinfin (törəmə və ya uşaq sinif) digər sinfin (əsas və ya valideyn sinif) xüsusiyyətlərini və davranışlarını miras alması mexanizmidir. Bu prinsip kod təkrarının qarşısını alır və sinflər arasında iyerarxik əlaqələr qurmağa imkan verir.

Real dünya analoqiyası: biologiyada varislik prinsipi. Uşaqlar valideynlərinin genetik xüsusiyyətlərini miras alırlar, lakin eyni zamanda öz unikal xüsusiyyətlərinə də malik olurlar.

Proqramlaşdırmada varislik "is-a" (olan) əlaqəsini ifadə edir. Məsələn, "İt Heyvandır", "Kvadrat Fiqurdur", "Tələbə İnsandır" kimi əlaqələr varislik vasitəsilə modelləşdirilir.

Veriləcək misal: nəqliyyat vasitələri iyerarxiyası. Bütün nəqliyyat vasitələrinin ümumi xüsusiyyətləri var: marka, model, istehsal ili, sürət. Avtomobilin əlavə xüsusiyyətləri ola bilər: qapı sayı, yanacaq növü. Motosikletin isə fərqli əlavə xüsusiyyətləri: tip (idman, şəhər və s.), silindr həcmi.



class NəqliyyatVasitəsi {

protected String marka;

protected String model;

protected int istehsalİli;

public void hərəkətEt() {

// ümumi hərəkət məntqi

}

}


class Avtomobil extends NəqliyyatVasitəsi {

private int qapıSayı;

private String yanacaqNövü;

public void parkEt() {

// avtomobilə xas funksionallıq

}

}


class Motosiklet extends NəqliyyatVasitəsi {

private String tip;

private int silindrHəcmi;

public void wheelie() {

// motosikletə xas funksionallıq

}

}

Varisliyin növləri:

  • Tək varislik (Single inheritance): Bir sinif yalnız bir əsas sinfdən miras ala bilər (Java, C#)
  • Çoxlu varislik (Multiple inheritance): Bir sinif bir neçə əsas sinfdən miras ala bilər (C++, Python)
  • Çoxsəviyyəli varislik (Multilevel inheritance): A sinfi B-dən, B sinfi C-dən miras alır
  • İyerarxik varislik (Hierarchical inheritance): Bir əsas sinfdən bir neçə törəmə sinif yaranır
  • Hibrid varislik (Hybrid inheritance): Yuxarıdakıların kombinasiyası

3. Polimorfizm (Polymorphism)

Polimorfizm yunanca "çox forma" mənasını daşıyır və eyni interfeysin və ya metodun müxtəlif kontekstlərdə fərqli şəkildə işləməsi qabiliyyətidir. Bu prinsip kodun çevikliyini və genişlənməsini asanlaşdırır.

Polimorfizmin iki əsas növü var:

Kompilyasiya vaxtı polimorfizmi (Compile-time/Static polymorphism): Metod yükləməsi (method overloading) vasitəsilə həyata keçirilir. Eyni adlı metodlar fərqli parametrlər qəbul edir:


class Hesablayıcı {

public int topla(int a, int b) {

return a + b;

}

public double topla(double a, double b) {

return a + b;

}

public int topla(int a, int b, int c) {

return a + b + c;

}

}

İcra vaxtı polimorfizmi (Runtime/Dynamic polymorphism): Metod ləğvi (method overriding) vasitəsilə həyata keçirilir. Törəmə sinif valideyn sinfin metodunu yenidən tərifləyir:



class Heyvan {

public void səsÇıxart() {

System.out.println("Heyvan səs çıxarır");

}

}


class İt extends Heyvan {

@Override

public void səsÇıxart() {

System.out.println("Hav-hav!");

}

}


class Pişik extends Heyvan {

@Override

public void səsÇıxart() {

System.out.println("Miyav-miyav!");

}

}

Polimorfizm xüsusilə güclüdür çünki bir əsas sinif tipində müxtəlif törəmə sinif obyektlərini saxlaya və işlədə bilərik:



Heyvan heyvan1 = new İt();

Heyvan heyvan2 = new Pişik();


heyvan1.səsÇıxart(); // "Hav-hav!"

heyvan2.səsÇıxart(); // "Miyav-miyav!"

4. Abstraksiya (Abstraction)

Abstraksiya mürəkkəb sistemlərin sadələşdirilmiş modelini yaratmaq və əsas xüsusiyyətləri vurğulayaraq əhəmiyyətsiz detalları gizlətmək prosesidir. Bu prinsip istifadəçinin yalnız lazımi informasiya ilə işləməsinə imkan verir.

Real dünya misalı: avtomobil sürmək. Sürücü yalnız sükan, pedal və sürətlər qutusu ilə qarşılıqlı əlaqə qurur. Mühərrikin necə işlədiyini, yanacağın necə yandığını bilməyə ehtiyac yoxdur. Avtomobilin daxili mürəkkəbliyi abstrakt edilmişdir.

Proqramlaşdırmada abstraksiya iki əsas mexanizmlə həyata keçirilir:

Abstrakt siniflər (Abstract classes): Obyekt yaradıla bilməyən, yalnız miras vermək üçün istifadə olunan siniflərdir. Abstrakt metodlar (implementasiyası olmayan metodlar) ehtiva edə bilər:



abstract class Fiqur {

protected String rəng;

// abstrakt metod - implementasiya yoxdur

public abstract double sahəHesabla();

// konkret metod

public void rəngDəyiş(String yeniRəng) {

this.rəng = yeniRəng;

}

}


class Dairə extends Fiqur {

private double radius;

@Override

public double sahəHesabla() {

return Math.PI * radius * radius;

}

}


class Düzbucaqlı extends Fiqur {

private double uzunluq;

private double en;

@Override

public double sahəHesabla() {

return uzunluq * en;

}

}

İnterfeyslər (Interfaces): Tamamilə abstrakt strukturlardır, yalnız metod imzalarını ehtiva edir (müasir dillərdə default implementasiyalar da ola bilər). Bir sinif bir neçə interfeysi implement edə bilər:



interface Uçanbilən {

void uç();

void enir();

}


interface Üzənbilən {

void üz();

void dalğıclıq();

}


class Ördək implements Uçanbilən, Üzənbilən {

public void uç() {

System.out.println("Ördək uçur");

}

public void enir() {

System.out.println("Ördək enir");

}

public void üz() {

System.out.println("Ördək üzür");

}

public void dalğıclıq() {

System.out.println("Ördək suya dalır");

}

}

Sinif və Obyekt Konsepsiyaları

OYP-nin təməl daşları sinif (class) və obyekt (object) anlayışlarıdır.

Sinif: Obyektlər üçün şablon və ya planıdır. Sinif məlumat sahələrini (attributes/fields) və metodları (functions) tərifləyir, lakin hələ konkret bir nümunə deyil. Real dünyada analoqiyası: ev planı. Plan evlərin necə qurulmalı olduğunu göstərir, lakin özü ev deyil.

Obyekt: Sinfin konkret nümunəsidir (instance). Hər obyekt öz unikal dəyərlərinə malikdir, lakin eyni sinfin strukturunu və davranışlarını paylaşır. Real dünyada: plan əsasında tikilmiş konkret evlər. Hər ev eyni plana əsaslanır, lakin fərqli ünvana, rəngə, sakininə malik ola bilər.



// Sinif tərifı

class Tələbə {

// Sahələr (məlumatlar)

private String ad;

private String soyad;

private int yaş;

private double GPA;

// Konstruktor

public Tələbə(String ad, String soyad, int yaş) {

this.ad = ad;

this.soyad = soyad;

this.yaş = yaş;

this.GPA = 0.0;

}

// Metodlar (davranışlar)

public void dərsQeydiyyatı(String dərsAdı) {

System.out.println(ad + " " + dərsAdı + " dərsinə yazıldı");

}

public void imtahanVer(String dərs, double bal) {

System.out.println(ad + " " + dərs + " imtahanından " + bal + " aldı");

}

// Getters və Setters

public double getGPA() {

return GPA;

}

public void setGPA(double yeniGPA) {

if (yeniGPA >= 0 && yeniGPA <= 4.0) {

this.GPA = yeniGPA;

}

}

}


// Obyekt yaradılması

Tələbə tələbə1 = new Tələbə("Aydın", "Məmmədov", 20);

Tələbə tələbə2 = new Tələbə("Leyla", "Həsənova", 19);


// Obyektlərlə işləmək

tələbə1.dərsQeydiyyatı("Riyaziyyat");

tələbə1.setGPA(3.75);

tələbə2.imtahanVer("Fizika", 95);

Konstruktor və Destruktor

Konstruktor: Obyekt yaradıldığı zaman avtomatik çağırılan xüsusi metoddur. Konstruktorun adı sinifin adı ilə eynidir və geri qaytarma tipi yoxdur. Konstruktorlar obyektin ilkin vəziyyətini təyin etmək üçün istifadə olunur.

Konstruktorların növləri:

  • Default konstruktor: Parametrsiz konstruktor
  • Parametrli konstruktor: Parametrlər qəbul edən konstruktor
  • Copy konstruktor: Başqa obyektin kopyasını yaradan konstruktor
  • Konstruktor yükləməsi: Eyni sinifdə fərqli parametrlərlə bir neçə konstruktor



class Kitab {

private String adı;

private String müəllif;

private int səhifəSayı;

// Default konstruktor

public Kitab() {

this.adı = "Naməlum";

this.müəllif = "Naməlum";

this.səhifəSayı = 0;

}

// Parametrli konstruktor

public Kitab(String adı, String müəllif) {

this.adı = adı;

this.müəllif = müəllif;

this.səhifəSayı = 0;

}

// Tam parametrli konstruktor

public Kitab(String adı, String müəllif, int səhifəSayı) {

this.adı = adı;

this.müəllif = müəllif;

this.səhifəSayı = səhifəSayı;

}

// Copy konstruktor

public Kitab(Kitab başqaKitab) {

this.adı = başqaKitab.adı;

this.müəllif = başqaKitab.müəllif;

this.səhifəSayı = başqaKitab.səhifəSayı;

}

}

Destruktor: Obyekt yaddaşdan silinməzdən əvvəl çağırılan metoddur. C++ kimi dillərdə açıq şəkildə mövcuddur, Java və C# kimi dillərdə isə garbage collector avtomatik yaddaş idarəçiliyini həyata keçirir.

Əlaqə Növləri (Relationships)

OYP-də obyektlər və siniflər arasında müxtəlif əlaqə növləri mövcuddur:

1. Association (Assosiasiya): İki sinif arasında ümumi əlaqədir. "uses-a" əlaqəsi kimi düşünülə bilər. Məsələn, Müəllim və Tələbə arasında əlaqə - müəllim tələbəni öyrədir.

2. Aggregation (Aqreqasiya): "has-a" əlaqəsidir, lakin zəif asılılıq. Bir obyekt digərini ehtiva edir, lakin onlar müstəqil mövcud ola bilər. Məsələn, Departament və Müəllim - departament müəllimlərdən ibarətdir, lakin müəllim departamentsiz də mövcud ola bilər.

3. Composition (Kompozisiya): Güclü "has-a" əlaqəsi. Əsas obyekt məhv olarsa, tərkib hissələri də məhv olur. Məsələn, Ev və Otaq - ev məhv olarsa, otaqlar da yox olur.

4. Inheritance (Varislik): Artıq yuxarıda ətraflı izah edilmiş "is-a" əlaqəsi.

OYP-nin Üstünlükləri

  1. Modulluq: Kod kiçik, idarə oluna bilən modullar şəklində təşkil olunur. Hər sinif müstəqil vahid kimi işləyə bilər.
  2. Təkrar istifadə (Reusability): Varislik və kompozisiya vasitəsilə mövcud kodu yeni layihələrdə istifadə etmək mümkündür.
  3. Saxlanma asanlığı (Maintainability): Kod təşkilatı və strukturu aydın olduğundan, dəyişiklik etmək və səhvləri tapmaq asanlaşır.
  4. Çeviklik və genişlənmə (Flexibility and Extensibility): Polimorfizm və abstraksiya sayəsində sistemi genişləndirmək və dəyişdirmək asandır.
  5. Real dünyaya uyğunluq: OYP real dünya obyektlərini modelləşdirdiyindən, mürəkkəb sistemləri anlamaq və dizayn etmək asanlaşır.
  6. Təhlükəsizlik: İnkapsulyasiya məlumatların qorunmasını təmin edir.
  7. Problemlərin həlli: Böyük problemləri kiçik, idarə oluna bilən hissələrə bölmək mümkündür.

OYP-nin Çatışmazlıqları

  1. Öyrənmə əyrisi: Prosedur proqramlaşdırma ilə müqayisədə öyrənmək daha çətin ola bilər.
  2. Performans: Abstraksiya və əlavə strukturlar bəzən performans itkisinə səbəb ola bilər.
  3. Dizayn mürəkkəbliyi: Düzgün sinif iyerarxiyası və dizayn yaratmaq təcrübə tələb edir.
  4. Həddindən artıq mühəndislik: Bəzən sadə məsələlər üçün həddindən artıq mürəkkəb həllər yaradıla bilər.
  5. Yaddaş istifadəsi: Obyektlər əlavə metadata və strukturlar tələb edir.

OYP Dəstəkləyən Dillər

Müxtəlif proqramlaşdırma dilləri OYP-ni fərqli dərəcələrdə dəstəkləyir:

Tam OYP dilləri: Java, C#, Ruby, Smalltalk - bu dillərdə hər şey obyektdir.

Hibrid dillər: C++, Python, JavaScript, PHP - həm OYP, həm də digər paradiqmaları dəstəkləyir.

OYP elementləri olan dillər: Visual Basic, Delphi, Objective-C.

Müasir Trendlər və İnkişaf

Müasir proqramlaşdırmada OYP təkbaşına istifadə olunmur, digər paradiqmalarla birləşir:

  • Funksional proqramlaşdırma elementləri: Java 8+, C# LINQ
  • Aspekt-yönümlü proqramlaşdırma: Cross-cutting concerns üçün
  • Reaktiv proqramlaşdırma: Asinxron məlumat axınları üçün

Design Patterns (Dizayn Nümunələri)

OYP kontekstində tez-tez təkrarlanan problemlər üçün sübut olunmuş həllər:

  • Creational patterns: Singleton, Factory, Builder
  • Structural patterns: Adapter, Decorator, Facade
  • Behavioral patterns: Observer, Strategy, Command

Nəticə

Obyekt Yönümlü Proqramlaşdırma müasir proqram təminatının əsasını təşkil edən güclü paradiqmadır. Dört əsas prinsip - inkapsulyasiya, varislik, polimorfizm və abstraksiya - birlikdə modular, təkrar istifadə oluna bilən və saxlanması asan kod yaratmağa imkan verir. Real dünya obyektlərini modelləşdirmə qabiliyyəti mürəkkəb sistemlərin dizaynını asanlaşdırır. OYP mükəmməl olmasa da, enterprise səviyyəli tətbiqlər, oyun inkişafı, mobil proqramlaşdırma və bir çox digər sahələrdə dominant və effektiv yanaşma olaraq qalır.

Tədris sahələrimiz barədə məlumat almaq üçün qeydiyyatdan keçin

Teqlər:

Digər tədris sahələri