Enkapsulatsiya — OOP ning birinchi ustuni. Uning mohiyati: obyektning ichki ma’lumotini tashqi dunyodan yashirib, unga faqat nazorat qilinadigan yo’llar orqali kirish. Bu ma’lumotni tasodifan yoki noto’g’ri o’zgartirishdan himoya qiladi. Bank hisobini tasavvur qiling: balansni istagan kishi to’g’ridan-to’g’ri o’zgartira olmasligi kerak.
Enkapsulatsiya — ma’lumot (maydonlar) va u ustidagi amallarni (metodlar) bir sinfga jamlab, ichki holatni
privatebilan yashirish va unga faqatpublicmetodlar orqali kirishga ruxsat berish tamoyili.
Muammo: himoyasiz maydon
Avval maydon public bo’lganda qanday muammo yuzaga kelishini ko’ramiz. Balansni istalgan qiymatga, hatto manfiyga ham o’zgartirib bo’ladi — bu mantiqan noto’g’ri:
#include <iostream>
using namespace std;
class Hisob {
public:
int balans = 0;
};
int main() {
Hisob h;
h.balans = -5000; // mantiqan noto'g'ri, lekin ruxsat etilgan
cout << "Balans: " << h.balans << endl;
return 0;
}
Balans: -5000
Manfiy balans — xato, ammo public maydon bunga yo’l qo’ydi. Bu himoyasizlikni enkapsulatsiya hal qiladi.
Yechim: private + public metodlar
Maydonni private qilib yashiramiz va unga faqat tekshiruvli metodlar orqali kirishga ruxsat beramiz:
#include <iostream>
using namespace std;
class Hisob {
private:
int balans = 0;
public:
void toldirish(int summa) {
if (summa > 0) {
balans += summa;
}
}
int korish() {
return balans;
}
};
int main() {
Hisob h;
h.toldirish(1000);
h.toldirish(-500); // rad etiladi
cout << "Balans: " << h.korish() << endl;
return 0;
}
Balans: 1000
Endi balans to’g’ridan-to’g’ri o’zgartirilmaydi. toldirish metodi manfiy summani rad etdi, shuning uchun balans faqat 1000 bo’lib qoldi. Ma’lumot endi himoyalangan.
Getter va Setter
private maydonga kirishning standart naqshi — getter (o’qish) va setter (yozish) metodlari. Ularni jadvalda ko’ramiz:
| Metod turi | Vazifasi | Misol |
|---|---|---|
| Getter | maydon qiymatini qaytaradi | int korish() |
| Setter | maydonni tekshirib o’rnatadi | void ornat(int) |
Setter tekshiruvni o’z ichiga oladi:
#include <iostream>
using namespace std;
class Talaba {
private:
int ball;
public:
void ballOrnat(int b) {
if (b >= 0 && b <= 100) { // faqat 0-100 oralig'i
ball = b;
}
}
int ballOlish() {
return ball;
}
};
int main() {
Talaba t;
t.ballOrnat(95);
cout << "Ball: " << t.ballOlish() << endl;
return 0;
}
Ball: 95
Nega enkapsulatsiya muhim?
Enkapsulatsiya uch foyda beradi: ma’lumot himoyalanadi (noto’g’ri qiymat kirmaydi), ichki tuzilishni o’zgartirsangiz tashqi kod buzilmaydi, va sinf bilan ishlash soddalashadi (faqat kerakli metodlar ko’rinadi). Bu — ishonchli, katta tizimlar qurishning asosidir.
Xulosa
Bu bo’limda enkapsulatsiya tamoyilini, private maydon va public metodlar bilan ma’lumotni himoyalashni, getter/setter naqshini va tekshiruvli setterni ko’rib chiqdik. Enkapsulatsiya — ishonchli obyekt dizaynining poydevori. Keyingi darsda merosxo’rlik — sinflarni kengaytirishga o’tamiz.