“OOP” və ya “Obyekt yönümlü Proqramlaşdırma” proqramlaşdırmada yanaşma və paradiqma kimi istifadə olunur. Bu paradiqma real dünya obyektlərinin modelləşdirilməsinə əsaslanır və proqramlaşdırma layihələrini daha modul və başa düşülən etmək məqsədi daşıyır. OOP-un əsasını "obyektlər" təşkil edir. Hansı ki, kod yazmağa qərar verdikdə nələri nəzərə alaraq, hansı şəkildə yazmalı olduğumuza qərar vermək ilkin şərtlərdəndir. İşimizin məhsuldar olması, hər dəqiqə problemlərlə üzləşməməyimiz üçün bu qərarlar əsaslı mənbələrə söykənməlidir. Belə olduğu halda gəlinən son nəticənin əlbəttə ki, təcrübəyə əsaslanan bir yanaşma olması zəruridir. Obyekt Yönümlü Proqramlaşdırma da məhz bunun üçündür. "Gerçək həyatı yazdığımız koda simulasiya edən obyekt əsaslı bir proqlamlaşdırma metodurdur".
Siniflər və Obyektlər: OOP-da proqramlar siniflər və obyektlər üzərində qurulur. Siniflər obyektlərin şablonunu müəyyən edir və obyektlər həmin siniflərdən əldə edilən nümunələrdir. OOP-nin əsas prinsiplərinə nəzər yetirək: Inheritance: Miras alıb-vermə bir sinfə başqa bir sinifdən xüsusiyət və metodları miras qoymağa imkan verir. Bu, kodun təkrar istifadəsini artırır və siniflər arasında iyerarxik əlaqələri təmin edir. Polimorfizm: Polimorfizm bir və ya birdən çox obyek eyni tip class tərəfindən qarşılana və referance edilə bilməsidir. Bu, eyni interfeysi paylaşan obyektlərə fərqli davranış nümayiş etdirməyə imkan verir. Encapsulation: Encapsulation bir obyektin daxili vəziyyətini və gedən prosessləri xarici dünyadan gizlətməyə və datanı kontrollu idarə etməyimizə imkan verir. Abstraction: Qarışıqlığı azaltmaq və yalnız vacib detallara diqqət yetirmək üçün istifadə olunur. Abstraksiya obyektin uyğun konsept üçün mühüm xüsusiyyətlərini və davranışlarını vurğulamaqla mürəkkəb sistemi daha başa düşülən və idarə olunan edir. Yuxarıdakı prinsiplərin hər birinə növbəti məqalələrdə xüsusi başlıq altında detallı şəkildə toxunacağam.
Obyekt yönümlü proqramlaşdırmada ən kiçik parça obyektdir. OOP-un əsasını "obyektlər" təşkil edir və class(sinif)-lara uyğun gəlir. Başqa sözlə desək Class obyektlərin şablonudur. Demək olar ki, hər şey obyektlərdən ibarətdir.
Class1 obj = new Class1();
obj - obyektdir
Yuxarıda haqqında danışdığımız obyekt, içərisində məlumat saxlanması üçün yer ayrılmalıdır. Bu məlumatlar da filed- lərdə saxlanılır. Yəni obyekt içərisində məlumat saxlayan dəyişənlərə "Field" adı verilib. Field-ə qlobal dəyişənlər də deyilir və ya başda sözlə desək "Field-lər birbaşa class-ın içərisində təyin edilən dəyişənlərdir". Yəni hansısa metodun içərisində yox elə birbaşa class içərisində yaradılır və class-ın member-lərindən biridir. Qlobal dəyişən olması onun class scop-nun içərində hər yerdə çağrıla və istifadə oluna bilməsi ilə əlaqəlidir. Qlobal dəyişənlərə də proqram tərəfindən type-na uyğun avtomatik default dəyərlər təyin olunur. Məsələn int, bool tipindədirsə "0", "false" kimi dəyərlərə sahib olur və biz heç bir dəyər təyin etməsək belə bu default dəyərlərdən istifadə edərək funksialarını icra edirlər. Amma, metod daxilində təyin etdiyimiz field-ə dəyər daxil etmədən hansısa əməliyyatda istifadə etməyə çalışsaq compiler səviyyəsində xəta almış oluruq.
public class Book
{
public int count;
public string Name;
public double Price;
}
Obyekt içərisində field-lərdəki dəyərlərin istifadə olunması, hansısa alqoritmin parçası ola bilməsi üçün funksiyalar mövcudur. Biz bu funksiylara gələcək məqalələrdə Property, Indexer da deyəcəyik. Belə ki bu filed-lərin içərisində saxladığımız dəyərləri funksiya içərisində istifadə edib, müəyyən əməliyyatlar icra edə bilərik. Yazdığımız kodun gördüyü işlər "Əməliyyat" adlanır. Aşağıdakı nümunədən də gördüyünüz kimi "count", "Name", "Price" field-lərində saxlanılan dəyərlər "CountPrice()" funksiyası içərisində istifadə olunaraq kiçik bir iş icra etdi.
public class Book
{
public int count;
public string Name;
public double Price;
public string CountPrice()
{
double totalSellPrice = count * Price;
return $"{Name} kitabından {count} eded satıldı. Umummi qiymet: {totalSellPrice}";
}
}
Sistem demək olar ki, obyektlərdən ibarətdir və bu obyektlər öz aralarında əlaqə qururaraq prosesləri icra edirlər. Bir növ öz aralarında xəbərləşirlər. Bir class-dan birdən çox obyekt yaradaraq modelləşdirmə edə bilərik. Yəni bir Class-ın birdən çox obyekti ola bilər. Biz buna "Instance" da deyirik. Bu obyektlər(Instance) eyni class-ın xüsiyyətlərinə sahib olan kopyalarıdır. Ama hər biri ayrı obyektlərdir. Bir obyekt(Instance) digərindən tam fərqlidir. İçərisindəki məlumatlar eyni olsa belə yenə də fərqli obyektlər hesab olunur. - Bəs Interface-in obyekti ola bilərmi? - Xeyr. Obyekt bərabərdir Class. Obyekt class-ın bir məlsuludur. Aşağıdakı nümunədən də gördüyünüz kimi içərisində field və funksiyası olan Book class-ı yaratdıq. Bu class-dan 3 fərqli obyekt yaradıb hər birinə fərqli dəyərlər daxil etdik. Hər bir obyekt üçün də Book class-da yerləşən funksiyanın fərqli nəticələr geri qaytardığını müşahidə etdik. Demək sadəcə 1 model yaratmaqla biz onun sonsuz sayda kopyası ilə iş görə bilərik. Hər daxil etdiyimiz yeni Book məlumatı üçün əlavə class yaratmalı olmadıq. Çünki, yaratmağa heç gərək də yoxudur. Satılan kitab haqqında ümumi məlumat əldə etmə üçün bu 3 xüsusiyyətdən artığına ehtiyacımız yox idi. Əgər hər biri üçün ayrı class yaratmalı olsa idik bir nöqtədən sonra proses o qədər qarışıq olacaq ki, heç cür idarə oluna bilməyəcək və ən asası nə üçün hər dəfə təkrar-təkrar eyni şeyi yaratmalıyıq ki? Yəni, Book1, Book2, Book2 class-ları yaratmaqdansa 1 dənə Book class-ı yaradıb, book1, book2, book3 obyektlərini yaratmaq daha asan və məntiqli deyilmi? Məsələn, biz insanlar da hər birimiz digərindən fərqlənir, amma, biri digərindən tam ayrı cinsə mənsub deyil. İnsan məvhumu altında oxşar standartlar əsasında qurulmuş fərqli xüsusiyyətlərə sahib varlıqlarıq. Yəni nə qədər müxtəlifliyimiz olsa da müəyyən standratlar var ki, insan anlayışı ondan kənara çıxa bilmir. Bir insanı təsvir etmək üçün ortalama eyni xüsusiyyətlər sadalamaq lazım gələcək. obyekt anlayışı da bunun koda simulyasiyasından ibarətdir.
public class Book
{
public int count;
public string Name;
public double Price;
public string CountPrice()
{
double totalSellPrice = count * Price;
return $"{Name} kitabından {count} eded satıldı. Umummi qiymet: {totalSellPrice}";
}
}
namespace Blogs.Blog_1
{
public class Progam
{
public void Main(string[] args)
{
Book book1 = new Book();
book1.count = 1;
book1.Name = "Sefiller";
book1.Price = 34;
Book book2 = new Book();
book2.count = 6;
book2.Name = "Bele buyurdu Zerdust";
book2.Price = 23;
Book book3 = new Book();
book3.count = 2;
book3.Name = "Karmazov Qardaslari";
book3.Price = 38;
Console.WriteLine(book1.CountPrice());
Console.WriteLine(book2.CountPrice());
Console.WriteLine(book3.CountPrice());
}
}
}
Obyektlər reference tipli dəyərlərdir, obyektləri saxlayan dəyişənlər(referansları) isə məsələn yuxarıdakı book1, book2, book3 reference tipli dəyişənlərdir. Belə olduğu halda mövzunun daha aynın olması üçün Stack və Heap anlayışlarına geniş mövzu olsa da azacıq toxunmalıyıq. Lori dildə desək Heap-ə yerləşdirdiyimiz dataya(obyektlərə) əlimiz ancaq Stack-də saxladığımız referans nöqtələri(dəyişənlər) ilə çata bilir. Başqa cür Heap-a birbaşa əlçatanlığımız yoxdur, amma, Stack-a var. Stack-in də Heap-ə əli çatdığı üçün biz Heap-ə Stack-in köməkliyi ilə çata bilirik. Yanıltmac kimi oldu :) Belə ki, şəkildən də gördüyünüz kimi dəyər dipli dəyişənlərin özləri və dəyərləri stack-də saxlanılır. Referans tipli dəyişənlər(refernaslar və ya başqa sözlə desək referans nöqtələri) Stack-də, dəyərləri isə Heap-də saxlanılır. Necəki şəkildə "Class1"-in "obj" obyektini saxlayan dəyişən Stack-də, saxladığı dəyər isə Heap-da yerləşdirilib. Bir az qarışıq və anlaması çətin mövzu olduğunun fərqindəyəm. Bir neçə dəfə oxuduqdan və şəkli yaxşıca analiz etdikdən sonra nə demək istədiyimi anlayacağınıza inanıram :)
Demək olar ki, Obyekt Yönümlü Proqramlaşdırma bir çox müasir dil tərəfindən dəstəklənir və istifadə olunur. Misal gətirməli olsaq C#, Java, Pyton, Php və s kimi proqramlaşdırma dillərində yazılan sistemlər OOP prinsipləri əsasında qurulur.