#10 – Class va Object. Umumiy dasturlash teoriyasi. Dasturlashni o’rganish kursi

Ushbu maqolaning video variantini keyingi yo’llanma orqali ko’rishingiz mumkin: https://www.youtube.com/watch?v=sEoOlHtBZBY


STRUCT
(o`zb: Tuzilma, рус: Структура)

Tassavur qiling siz foydalanuvchini ro’yhatga olmoqchisiz.


bool registration()
{
}

Buning uchun registration nomli funksiya yaratdingiz.


bool registration(string firstName, string lastName, int age, string email)

uning birqancha parametrlari bor. Siz amalda yaratgan funksiyalaringiz ularning faqatgina ostidan chaqirmaysiz. Dasturlar minglab qator kodlardan iborat bo’ladi.


registration("Akmal", "Kadirov", 18, "acme@mail.com");

Siz funksiyani chaqirayotganingizda uning parametrlari qay tartibda ekanligini bilmasingiz mumkin.


registration("acme@mail.com", 18, "Akmal", "Kadirov");

Shuning uchun chalkashib, ularni noto’g’ri tartibda yuborishingiz mumkin. Parametrlar bundan ham ko’p bo’lishi mumkin. Lekin chalkashmaslik uchun 3 tadan ortiq parametr ishlatish tafsiya etilmaydi. Buning o’rniga tuzilma yuborishingiz mumkin.

Esingizdami ma’lumot turlarini ko’rgandik ( https://myblog.uz/2019/11/21/6-malumot-turlari-umumiy-dasturlash-teoriyasi-dasturlashni-organish-kursi/ ) ? Siz o’zingiz yangi tur yaratishingiz mumkin. Siz yaratgan yangi tur, mavjud turlarning tuzilmasidan iborat bo’ladi.


{
    string firstName;
    string lastName;
    int age = 20;
    string email;
}

Buning uchun bir nechta o’zgaruvchanlar guruhini tuzamiz.


struct User
{
    string firstName;
    string secondName;
    int age = 20;
    string email;
}

Guruh oldidan struct kalit so’zini va tuzilma nomini yozamiz. Ushbu tuzilmani User deb nomladim, foydalanuvchi degan ma’noda. Demak biz yangi tur yaratdik.


void foo (int bar, User baz)
{
    // kod
}

string, int, boolean turlari kabi, endi User turini ham funksiyalar parametr sifatida qabul qilishi mumkin,



User foo (int bar, string baz)
{
    // kod
}

qaytarishi mumkin va hokazo.



User rustam;

Keling User turiga mansub bo’lgan o’zgaruvchan yaratamiz. O’zgaruvchanimizning nomi rustam bo’lsin. Esingizdami User turi tuzilma bo’lib, u 4 ta o’zgaruvchandan tuzilgan.



rustam.firstName = "Rustam";
rustam.lastName = "Axmedov";

Uning ushbu o’zgaruvchanlariga nuqta belgisi orqali murojat qilamiz.



print rustam.firstName; // Rustam 
print rustam.lastName; // Axmedov

Keling ularni ekranga chiqarishga harakat qilamiz. Rustam va Axmedov so’zlari ekranga chiqadi.



print rustam.age; // 20

Bu yerda esa 20 raqami ekranga chiqadi. Chunki rustam o’zgaruvhanida age o’zgaruvhani bor. Unga qiymat bermagan bo’lsakda, User tuzilmasida age ga 20 qiymati berilgan.



rustam.age = 32;
print rustam.age; // 32

Lekin ushbu qiymatni o’zgartirib keyin ekranga chiqarib ko’ramiz. Ekranga 32 raqami chiqadi.


// tuzilma va yangi tur yaratamiz
struct User
{
    string firstName;
    string secondName;
    int age = 20;
    string email;
}

// ro’yxatga oluvchi funksiya yaratamiz
bool registration(User foo)
{
    print "Salom " . foo.firstName . "!\n";
    print "Siz ro’yxatdan o’tdingiz.";
    return true;
}

// ikkita foydalanuvchi yaratamiz
User rustam;
rustam.firstName = "Rustam";
rustam.lastName = "Axmedov";
rustam.age = 32;
rustam.email = "rustam@axmedov.uz";

User abdusattor;
abdusattor.firstName = "Abdusattor";
abdusattor.lastName = "Abdusattorov";
abdusattor.age = 22;
abdusattor.email = "abdusattorov12@mail.ru";

// ularni ro’yxatga olamiz
registration(rustam);
registration(abdusattor);

Demak ko’p parametrlar ishlatish o’rniga, o’zimiz yangi tuzilma yaratib uni ishslatishimiz mumkin ekan.

Keling atamalarni tushinib olamiz.


struct User

Bu yerda User noli tuzilma yaratdik. Shu bilan birga endi bizda User turi ham bor. Chunki har bir tuzilma tur sifatida ham ishlatiladi.


User rustam;

Bu yerda esa rustam nomli o’zgaruvchan yaratdik. U User turiga mansub. User turi oddiy tur emas. Oddiy tur deb string, float, boolean va interger kabi turlarni aytamiz. Ushbu o’zgaruvchanning ichida boshqa o’zgaruvchanlar bor. Bunaqa o’zgaruvchanlarni oddiyroq tushunish uchun obyekt dem ataymiz.


Obyekt

(eng: Object, рус: Объект)

Demak biz User turiga masnub rustam obyektini yaratibmiz. Bu yangi nom sizni qo’rqitmasin. U bilan ishlash huddi boshqa o’zgaruvchanlardek, faqatgina nomi o’zgardi holos. Eslab qolamiz, biror bir tuzilma turiga teng bo’lgan o’zgaruvchanni obyekt deb ataymiz.


rustam.firstName = "Rustam";
rustam.lastName = "Axmedov";
rustam.age = 32;
rustam.email = "rustam@axmedov.uz";

Obyekt ichidagi o’zgaruvchanlarning ham o’z nomlari bor. Ularni o’zgaruvchan emas xususiyat deyishadi.


Xususiyat

(eng: Property, рус: Свойство)

Rus tilida свойство, ingilizchasiga property bo’ladi. Demak rustam obyektimizning 4 ta ya’ni, firstName, lastName, age va email nomli xususiyatlari bor.


print rustam.email;

Obyektlar xususiyatlariga nuqta orqali murojat qilamiz dedik. Misol uchun Java va JavaScript tillarida ushbu variant ishlatiladi.


print rustam->email;

Bir xil tillarda esa, misol uchun PHP da “strelka” orqali murojat qilinadi. Ya’ni tire va katta belgisi orqali. C tilida esa ikki variant xam ishlatiladi.


SINF
(eng: Class, рус: Класс)

Umuman olganda xozirgi mashxur tillar orasida tuzilmalar faqat c tilida bor. Boshqa tillarda  mukammalroq bo’lgan sinflar ishlatiladi.

Biologiyada sinflar – jonzodlarni katta guruhlarga bo’lish ma’nosida ishlatiladi. Misol uchun Bakteriyalar, Qo’ziqorinlar, Hayvonlar, O’simliklar kabi sinflar bor. Qizig’i qo’ziqorin o’simlik ham emas, hayvon ham emas, uning o’zi alohida sinf…

Dasturlashda esa o’zingiz kodni har hil sinflarga bo’lib chiqishingiz mumkin. Chunki dasturlarda kod juda ko’p bo’ladi va odam oson chalkashib qolishi mumkin. Agar kodingizni odamlar o’rgangan sinflarga bo’lib chiqsangiz, tushunish osonroq bo’lishi mumkin.


class Animal
{
}

Misol uchun Animal nomli sinf yarataylik (ingiliz tilida Hayvon degani). Sinflar huddi tuzilmalardek yaratiladi, faqatgina struct kalit so’zi o’rniga class kalit so’zi ishlatiladi.


class Animal
{
    int legs = 4;
}

Animal sinfimizning legs (ingliz tilida oyoqlar) nomli xususiyati bo’lsin. Ushbu xususiyat 4 ga teng bo’lsin. Ya’ni hayvonimiz oyoqlari 4 ta degan ma’noda.


class Animal
{
    int legs = 4;

    void walk(int steps)
    {
        print "Men " . steps . " qadam yurdim";
    }
}

Tuzilma va sinfning asosiy farqlaridan biri bu funksiyalarda. Tuzilma faqat xususiyatlardan iborat bo’lishi mumkin. Sinfda esa xususiyatlardan tashqari funksiya ham yaratish imkonimiz bor. Keling walk (ingilizcha yurmoq) nomli funksiya yaratamiz. U steps (ingilizcha qadamlar) nomli parametrga ega.


Animal wolf = new Animal;
wolf.walk(5);

Ushbu funksiyani chaqirib ko’ramiz. Buning uchun avval wolf (ya’ni bo’ri) degan obyekt yaratdik. Keyin wolf obyektining walk funksiyasini chaqirdik. ekranga “Men 5 qadam yurdim” jumlasi chiqadi.


print wolf.legs; // 4

Shu yerda yana atamalarni eslaymiz. Objektimiz yoki sinfimiz o’zgaruvchanini xususiyat deb ataymiz degandik.


wolf.walk(10); // Men 10 qadam yurdim

Obyekt yoki sinf funksiyasi esa usul deb nomlanadi.


Usul

(eng: Method, рус: Метод)

Etibor bergan bo’lsangiz birinchi darsdan atamalarni 3 hil tilda ko’rsataman, sababi chet el kompaniyalari bilan ishlaganingizda ularni yaxshi tushunishingiz uchun. Yana bir sababi dasturlash xech qachon to’xtamaydi. Men maktab davridan o’rganib boshlaganman dasturlashni. Oradan 20 yilcha vaqt o’tibdi, xozirgacha kun-ora yangi narsalarni o’qiyman, o’rganaman. Dasturchi xar doim o’zi ustida ishlab borishi kerak. Lekin afsuzki o’zbek tilida ko’p ham ma’qolalar yo’q. Shuning uchun ruscha yoki ingilizcha maqolalar o’qishga majbur bo’lasiz. Shu sabab boshqa tildagi atamalarni ham bilganingiz ma’qul.


EXTENDS
(o’zb: Kengaytiradi, рус: Расширяет)

Biror bir sinfni kengaytirish mumkin. Ya’ni uning barcha elementlarini, ya’ni xususiyatlari va usullarini olib, undan tashqari yangi elementlar yozish mumkin


class Primate
{
}

Keling Primate degan sinf yaratamiz.


class Primate extends Animal
{
}

Ushbu sinfda ham legs xususiyati va walk usuli bo’lishini istasak, sinf nomidan so’ng extends kalit so’zini va kengaytirmoqchi bo’lgan sinfimiz nomini, ya’ni Animal deb yozamiz.


class Primate extends Animal
{
    int legs = 2;
    int hands = 2;
}

Keling primatimizni rivojlantiramiz. Animalda 4 ta oyoq bor edi, leking primatlarning 2 ta oyog’i bor. Shuning uchun ushbu xususiyat qiymatini o’zgartiramiz. Va hands (qo’llar) degan yangi xususiyat qo’shamiz.


Primate chimpanzee = new Primate;

Keling obyekt yaratamiz. Tuzilmadan farqli, sinf orqali obyekt yaratayotganimizda new kalit so’zini ishlatishimiz kerak.


Primate odam = new Primate;

Yana bir primat yaratdik.


void foo(Animal bar)
{
    print bar.legs;
}

Tasavvur qiling foo funksiyamiz bor va u Animal turiga mansub parametr qabul qiladi.


Animal cat = new Animal;
foo(cat); // 4

Biz Animal turiga mansub cat (ya’ni mushuk) obyektini yaratdik. Uni foo funksiyasiga yubordik. Ekranga 4 raqami chiqadi.


foo(chimpanzee); // 2
foo(odam); // 2

Qizig’i biz foo funksiyasiga chimpanzee (shimpanze) va odam obyektlarini ham yuborsak bo’ladi. To’g’ri, foo funksiyasi Animal turiga mansub obyekt qabul qiladi. chimpanzee esa Primate turga mansub. Lekin primatimiz boshqa tur bo’lishiga qaramasdan u baribir sal rivojlangan hayvon hisoblanadi. Animalda bor barcha elementlar Primate da ham bor.


class Animal
{
    int legs = 4;

    void walk(int steps)
    {
        print "Men " . steps . " qadam yurdim";
    }
}

class Primate extends Animal
{
    int legs = 2;
    int hands = 2;
}

void foo(Animal bar)
{
    print bar.legs;
}

Animal cat = new Animal;
Primate chimpanzee = new Primate;
Primate odam = new Primate;

foo(cat); // 4
foo(chimpanzee); // 2
foo(odam); // 2

Yaxshiroq tushunish uchun yuqorida to’liq kodni ko’rishingiz mumkin


void foo2(Primate bar)
{
    print bar.hands;
}

foo2(cat); // error
foo2(chimpanzee); // 2
foo2(odam); // 2

Xozir sizni chalg’itib qo’yishim mumkin. Lekin aytishim kera: Agar biror bir funksiya Primate turini qabul qilsa unga chimpanzee, yoki odam obyektlarini yuborishimiz mumkin. Lekin cat obyektini yubora olmaymiz. Chunki har bir hayvon ham primat emas.


class Animal
{
}

class Reptile extends Animal
{
}

class Dinosaur extends Reptile
{
}

class Bird extends Dinosaur
{
}

Sinflar boshqa sinflarni istalgancha kengaytirishi mumkin. Lekin agar kengaytirishlar soni 4 dan oshsa, ularni tushunish qiyin bo’lib qolishi mumkin.


THIS


class Primate extends Animal
{
    int legs = 2;
    int hands = 2;

    void run(int steps)
    {
        print "Men " . steps . " qadam yugurdim";
    }
}

Primate odam = new Primate;
odam.run(5); // Men 5 qadam yugurdim

Keling Primate ga run (yugurmoq) nomli usul qo’shamiz. Lekin walk usulidan farqli, bu usul bosib o’tilgan qadamni biror bir xususiyatda saqlasin.


class Primate extends Animal
{
    int legs = 2;
    int hands = 2;
    int allSteps = 0;

    void run(int steps)
    {
        this.allSteps = this.allSteps + steps;
        print "Men " .  this.allSteps . " qadam yugurdim";
    }
}

Primate odam = new Primate;
odam.run(5); // Men 5 qadam yugurdim
odam.run(2); // Men 7 qadam yugurdim

allSteps nomli xususiyat yaratdik. run usulimiz ushbu xususiyat qiymatiga steps ni qo’shib uni yana allSteps ga joylamoqda. Birinchi safar run ni chaqirganimizda allSteps 0 ga teng, steps esa 5 ga. Usulimizda allSteps teng 0 qo’shuv 5 ga demoqdamiz. Demak allSteps endi 5 ga teng. Shuning uchun ham ekranga “Men 5 qadam yugurdim” jumlasi chiqadi.

Ikkinchi safar chaqirayotganimizda – allSteps 5 ga teng, steps esa 2 ga. Usulimizning birinchi qatorini o’qisak allSteps teng 5 qo’shuv 2 degan ifodani ko’ramiz. Demak endi allSteps 7 ga teng va ekranga “Men 7 qadam yugurdim” yozuvi chiqadi.

Lekin nega usulimiz ichida this obyektini ishlatmoqdamiz? Axir ushbu obyektni xech qayerda yaratayotganimiz yo’q-ku.

Har bir usul ichida, this obyekti oldindan yaratilgan bo’ladi. Ushbu usul qaysi obyekt orqali chaqirilgan bo’lsa, this o’sha obyektga teng. Xozirgi xolatda this odam obyektiga teng.


Primate odam = new Primate;
Primate chimpanzee = new Primate;

Chunki qaysi obyektning xususiyatiga ma’lumot yozayotganimiz juda muhim. Obyektlar yaratilayotganda xususiyatlari bir xil bo’ladi


odam.run(5); // Men 5 qadam yugurdim
odam.run(2); // Men 7 qadam yugurdim
chimpanzee.run(1); // Men 1 qadam yugurdim
chimpanzee.run(2); // Men 3 qadam yugurdim
odam.run(5); // Men 12 qadam yugurdim

Lekin keyin ular bir biridan alohida ishlashadi. Har birining xususiyatlari aloxida ma’lumotlarni saqlashadi.

Ushbu mavzu bo’yicha o’zingizni sinab ko’ring, keyingi yo’llanma orqali testni bajarib ko’rishingiz mumkin: https://myblog.uz/2019/12/04/sinf-va-obyekt-mavzusi-uchun-test-umumiy-dasturlash-teoriyasi/

37+

#10 – Class va Object. Umumiy dasturlash teoriyasi. Dasturlashni o’rganish kursi” ga 4 fikr qoldirilgan

  1. xasan

    Assalom alekum siz bergan kodlarni C++ da yozib o’rganayotgandim . biroz farqi bor ekan holos . masalan :
    Animal wolf=new Animal ; emas Animal* wolf=new Animal ;
    wolf.walk(5); emas wolf->walk(5);
    buni tushundim . Lekin C++ da extends degan kalit so’z yo’q ekan . shu yerga kelib xatosini to’g’irlolmayapman . C++ da bu kod qanday yoziladi

    4+

Fikr bildirish