🔒 Inkapsulatsiya
Azmiddin QurbonovMuammoning quyilishi
Ko'pchilik OYDT da inkapsuliyatsiya tushunchasiga kelganda mohiyatini tuliq tushunishmaydi. Bugun sizlarga real-world task asosida buni tushuntirishga harakat qilaman. Har doimgidek dasturlash tili sifatida C++ ni olamiz. Lekin siz uzingiz mos dasturlash tiliga buni ugirishiz mumkin. Tasavvur qiling siz UZCARD yoki HUMO .... kartalarni qullab quvatlashni loyihangizga qushmoqchisiz. bu kartalarni xavfsizlik va O'zbekiston qonunlariga binoan siz kartani nomerini to'liq kursatishga yoki saqlashga haqqiz yuq. Siz uni maskalangan shaklda saqlashiz mumkin. Bu albatta xavfsizik uchun bajarilgan. Kartani saqlash uchun Card sinfini tushunchasini kiritamiz. Kelilar uni birinchi UML tarzda ifodalaymiz(1.1. rasm).
Buning uchun https://app.diagrams.net/ saytidan foydalanamiz.

pan - bu yerda kartani nomeri. (5614........, 9860....)
Yuqoridagi qoidaga asosan sinfdagi getPan() metodi kartani 5614**********4052 ko'rinishda yoki ********1234 ko'rinishda qaytarishi kerak. Lekin Kartani haqiqiy nomeri pan da saqlanadi. Ana shu holatda malumotni to'gridan to'gri uzgartirmaslik uchun biz ma'lumotni Kapsulaga solib beramiz. Bu narsa Inkapsuliyatsiya deyiladi.
C++ da uch xil ko'rinishdagi huquq modifikatorlari bor.
public: Bu ochiq degani yane sizni sinfizdagi belgilangan azolardan metodlardan ochiq foydalanish mumkin.
private: Bu modifikatorga tushgan barcha metod yoki maydonlar sinfdan tashqarida chaqirilmaydi.
protected: Bu ham xuddi private ga uxshagan farqli tomoni voris olganda bu metodlarni voris sinfda chaqirsa bo'ladi.
#include <climits>
#include <iostream>
#include <string>
#include <vector>
#include <regex>
#include <unordered_map>
#include <unordered_set>
constexpr int64_t secret_key = 1234;
using namespace std;
class Telegram {
public:
int64_t cntUsers; // Foydalanuvchilar soni
public:
Telegram() : cntUsers{} {
this->myTelegramId = rand() % 1000000;
};
const Telegram& operator++(int) {
this->cntUsers++;
return *this;
}
int64_t getMyTelegramId() const {
return this->myTelegramId % secret_key * secret_key;
}
private:
int64_t myTelegramId; // Bu private
};
int main() {
Telegram t;
t++;
t++;
cout << t.cntUsers << endl;
// t.myTelegramId bunday chaqirish mumkin emas.
return 0;
}
Endi asosi qo'yilgan muammoga qaytamiz.

Inkapsuliyatsiya doir uzingizni sinashingiz uchun vazifalar.
Bank hisob raqami klassi yarating, unda balansni faqat metodlar orqali o'zgartirish mumkin bo'lsin. Dasturdan tashqarida foydalanuvchi balansni bevosita o'zgartira olmasligi kerak. Balansni faqatdepositvawithdrawmetodlari orqali yangilash mumkin bo'lsin.