16. Encapsulation — ma'lumotlarni himoyalash

Oldingi bobda inheritance haqida o‘rgandik.

Endi C++ dagi yana bir muhim tushuncha — encapsulation bilan tanishamiz.

Encapsulation — class ichidagi ma'lumotlarni to‘g‘ridan-to‘g‘ri o‘zgartirishni cheklash va ularga nazorat orqali murojaat qilish usuli.

Oddiy qilib aytganda:

Ma'lumotlarni class ichida himoyalab, ularga kerakli funksiyalar orqali murojaat qilamiz.


Nima uchun ma'lumotni himoyalash kerak?

Masalan, bank hisobidagi balansni olaylik.

double balans = 1000;

Agar hamma joydan balansni xohlagancha o‘zgartirish mumkin bo‘lsa:

balans = -500000;

kabi noto‘g‘ri qiymat berish mumkin.

Shuning uchun balansni to‘g‘ridan-to‘g‘ri o‘zgartirishga ruxsat bermaslik yaxshi.


private

Class ichidagi ma'lumotlarni yashirish uchun private ishlatiladi.

Masalan:

class BankHisobi {
private:
    double balans;

public:
    void korsat() {
        cout << balans;
    }
};

Endi balans ga class tashqarisidan to‘g‘ridan-to‘g‘ri murojaat qilib bo‘lmaydi.

Masalan, bu noto‘g‘ri:

BankHisobi hisob;

hisob.balans = 1000;

Chunki balans private.


public

public orqali class tashqarisidan foydalanish mumkin bo‘lgan methodlarni yaratamiz.

Masalan:

class BankHisobi {
private:
    double balans;

public:
    void korsat() {
        cout << balans;
    }
};

Endi:

BankHisobi hisob;

hisob.korsat();

ishlaydi.


private va public farqi

public

Tashqaridan foydalanish mumkin.

class Test {
public:
    int son;
};

Keyin:

Test t;

t.son = 10;

ishlaydi.

private

Faqat class ichida foydalaniladi.

class Test {
private:
    int son;
};

Keyin:

Test t;

t.son = 10;

ishlamaydi.


Getter

private ma'lumotni tashqaridan ko‘rish uchun getter methodidan foydalanishimiz mumkin.

Masalan:

class Talaba {
private:
    int yosh;

public:
    int getYosh() {
        return yosh;
    }
};

Endi:

Talaba talaba;

cout << talaba.getYosh();

Bu yosh qiymatini qaytaradi.


Setter

private ma'lumotga qiymat berish uchun setter ishlatiladi.

Masalan:

class Talaba {
private:
    int yosh;

public:
    void setYosh(int yangiYosh) {
        yosh = yangiYosh;
    }

    int getYosh() {
        return yosh;
    }
};

Endi:

Talaba talaba;

talaba.setYosh(18);

cout << talaba.getYosh();

Natija:

18

Setter nima uchun foydali?

Setter yordamida noto‘g‘ri qiymatlarni tekshirish mumkin.

Masalan, yosh manfiy bo‘lishi mumkin emas.

class Talaba {
private:
    int yosh;

public:
    void setYosh(int yangiYosh) {
        if (yangiYosh >= 0) {
            yosh = yangiYosh;
        }
    }

    int getYosh() {
        return yosh;
    }
};

Endi:

talaba.setYosh(-5);

deb yozsak, yosh ga -5 berilmaydi.


To‘liq misol

#include <iostream>

using namespace std;

class BankHisobi {
private:
    double balans = 0;

public:
    void pulQosh(double summa) {
        if (summa > 0) {
            balans += summa;
        }
    }

    double getBalans() {
        return balans;
    }
};

int main() {
    BankHisobi hisob;

    hisob.pulQosh(1000);

    cout << hisob.getBalans();

    return 0;
}

Natija:

1000

Bu yerda balans tashqaridan to‘g‘ridan-to‘g‘ri o‘zgartirilmaydi.


Encapsulation qanday ishlaydi?

Oddiy ko‘rinishda:

Class
|
|-- private ma'lumot
|
|-- public method
       |
       +-- ma'lumotni o‘qish
       |
       +-- ma'lumotni o‘zgartirish

Ya'ni tashqi kod ma'lumotga bevosita emas, balki class methodlari orqali murojaat qiladi.


Nima uchun encapsulation kerak?

Encapsulation:

  • ma'lumotlarni himoyalaydi;
  • noto‘g‘ri qiymatlarni cheklashga yordam beradi;
  • kodni tartibli qiladi;
  • class ichidagi ma'lumotlarni boshqarishni osonlashtiradi.

Oddiy hayotiy misol

Bankomatni tasavvur qiling.

Siz bankomat ichidagi pulni to‘g‘ridan-to‘g‘ri o‘zgartira olmaysiz.

Siz:

pul yechish
pul kiritish
balansni ko‘rish

kabi funksiyalardan foydalanasiz.

Class ham shunga o‘xshash.

Ichki ma'lumotlar:

private

bo‘lishi mumkin.

Tashqariga berilgan imkoniyatlar:

public

methodlar orqali amalga oshiriladi.


class da default holat

C++ da class ichidagi a'zolar default holatda private hisoblanadi.

Masalan:

class Talaba {
    int yosh;
};

Bu:

class Talaba {
private:
    int yosh;
};

bilan bir xil.

Shuning uchun ko‘pincha public ni aniq yozamiz:

class Talaba {
private:
    int yosh;

public:
    void setYosh(int yosh) {
        this->yosh = yosh;
    }
};

Amaliy mashqlar

1-mashq

Talaba classini yarating.

Unda private:

yosh

bo‘lsin.

Yoshni o‘rnatish uchun:

setYosh()

va olish uchun:

getYosh()

methodlarini yarating.


2-mashq

BankHisobi classini yarating.

Unda private:

balans

bo‘lsin.

Pul qo‘shish uchun:

pulQosh()

methodini yarating.

Balansni olish uchun:

getBalans()

methodini yarating.


3-mashq

Telefon classini yarating.

Unda private:

narx

bo‘lsin.

Narxni o‘rnatadigan setter yarating.

Agar narx 0 dan kichik bo‘lsa, uni o‘zgartirmang.


Muhim narsalarni eslab qoling

Encapsulation — class ichidagi ma'lumotlarni himoyalash va boshqarish.

private — ma'lumotni class tashqarisidan to‘g‘ridan-to‘g‘ri ishlatishni cheklaydi.

public — tashqaridan foydalanish mumkin bo‘lgan qismlarni belgilaydi.

Getter ma'lumotni olish uchun ishlatiladi:

getYosh()

Setter ma'lumotni o‘zgartirish uchun ishlatiladi:

setYosh(18)

Encapsulation katta dasturlarda ma'lumotlarni xavfsiz va tartibli boshqarishga yordam beradi.