Salom! Bugungi darsimizni inkapsulyatsiyaga bag'ishlaymiz va uni darhol misollar bilan boshlaymiz :)
Oldingda -
odatiy gazli avtomat. Sendan bir savol: u qanday ishlaydi? Bosqichma-bosqich javob berishga harakat qil: stakan qayerdan chiqadi, ichki temperatura qanday saqlanadi, muz qayerda saqlanadi, avtomat qanday qilib qaysi siropni qo'shish kerakligini biladi va h.k. Aniqki, bu savollarga javobing yo'q. Yaxshi, ehtimol hammalar bunday avtomatlarni ishlatmaydi, hozir ular uncha mashhur emas. Boshqa misol keltiramiz. Har kuni ko'p ishlatadigan narsangiz. O, ajoyib fikr keldi!
Aytib bersangiz,
Google qidiruv tizimi qanday ishlaydi? Kirtirilgan so'zlar bo'yicha qanday qilib ma'lumot qidiradi? Nima uchun yuqorida aynan o'sha natijalar chiqadi, boshqalari emas? Garchi siz har kuni googledan foydalansangizda, ehtimol bu haqida bilmasligingiz mumkin. Lekin bu muhim emas.
Chunki sizga buning kerakiyam yo'q. Siz qidiruv tizimida so'rovlarni kiritib, qanday ishlashini o'ylamang. Siz gazli avtomatdan gazli suvni sotib olishingiz mumkin, uning qanday ishlashi haqida bilmasdan. Siz mashinani haydashingiz mumkin, dvigatelning qanday ishlashini tushunmasdan, va umuman maktab darajasidagi fizika bilmasdan. Bularning barchasi ob'ektga yo'naltirilgan dasturlashning asosiy tamoyillaridan biri -
inkapsulyatsiya tufayli mumkin. Ushbu mavzudagi turli maqolalarni o'qiyotganingizda, dasturlashda ikkita keng tarqalgan tushuncha -
inkapsulyatsiya va
yashirinlik bor, va mualliflar "inkapsulyatsiya" so'zi ostida bir narsani yoki boshqasini tushunadilar (shunday bo'lgan). Biz ikkala terminni ham ko'rib chiqamiz, shunda sizda to'liq tushunchaga ega bo'lishingiz uchun. Dastlabki ma'nosi "inkapsulyatsiya" dasturlashda -
ma'lumotlar va ular bilan ishlash usullarini bir paketda ("kapsula") birlashtirishdir. Java tilida paket-kapsula rolini
klass o'ynaydi. Klass o'z ichida
ma'lumotlar (klassning maydonlari) va bu ma'lumotlar bilan ishlash
usullari ni o'z ichiga oladi.
Bu sizga oddiy ko'rinishi mumkin, lekin boshqa dasturlash kontseptsiyalarida hammasi boshqacha tuzilgan. Masalan, funksional dasturlashda ma'lumotlar ularga nisbatan amallardan qat'iy ajratilgan. OOPda (ob'ektga yo'naltirilgan dasturlash) dasturlar klass-kapsulalardan iborat bo'lib, ular bir vaqtning o'zida ma'lumotlar ham, ular bilan ishlash uchun funksiyalar hamdir. Endi
yashirinlik haqida gaplashamiz. Qanday qilib biz turli murakkab mexanizmlardan foydalanamiz, ularning qanday tuzilganligini va qanday ishlashini tushunmasdanmi? Hammasi oddiy: ularning yaratuvchilari oddiy va oson
interfeysni taqdim etishgan. Gazli avtomatda interfeys - bu paneldagi tugmalar. Bir tugmani bosish bilan stakan hajmini tanlaysiz. Ikkinchi tugmani bosib, siropni tanlaysiz. Uchinchisi muzni qo'shadi. Va bu sizga qilish kerak bo'lgan hammasi. U qanday qilib ichida tuzilganligi muhim emas. Eng muhimi -
shunday tuzilgan, shunda foydalanuvchi gazli suv olish uchun uchta tugmani bosishi kerak. Mashina bilan ham xuddi shunday. Ichidagi nima sodir bo'layotgani muhim emas. Eng muhimi -
chap pedal bosilganda mashina oldinga ketadi, o'ng pedal bosilganda tormozlanadi. Bu yashirinlikning mohiyatidir. Dasturning barcha "ichki qismi" foydalanuvchidan yashirilgan. Bu ma'lumot foydalanuvchi uchun ortiqcha, kerak emas. Foydalanuvchiga yakuniy natija kerak, ichki jarayon emas. Masalan,
Ma'lumotlarni yashirishda bizga yordam beradiganlar:
Oldingda -
odatiy gazli avtomat. Sendan bir savol: u qanday ishlaydi? Bosqichma-bosqich javob berishga harakat qil: stakan qayerdan chiqadi, ichki temperatura qanday saqlanadi, muz qayerda saqlanadi, avtomat qanday qilib qaysi siropni qo'shish kerakligini biladi va h.k. Aniqki, bu savollarga javobing yo'q. Yaxshi, ehtimol hammalar bunday avtomatlarni ishlatmaydi, hozir ular uncha mashhur emas. Boshqa misol keltiramiz. Har kuni ko'p ishlatadigan narsangiz. O, ajoyib fikr keldi!
Aytib bersangiz,
Google qidiruv tizimi qanday ishlaydi? Kirtirilgan so'zlar bo'yicha qanday qilib ma'lumot qidiradi? Nima uchun yuqorida aynan o'sha natijalar chiqadi, boshqalari emas? Garchi siz har kuni googledan foydalansangizda, ehtimol bu haqida bilmasligingiz mumkin. Lekin bu muhim emas.
Chunki sizga buning kerakiyam yo'q. Siz qidiruv tizimida so'rovlarni kiritib, qanday ishlashini o'ylamang. Siz gazli avtomatdan gazli suvni sotib olishingiz mumkin, uning qanday ishlashi haqida bilmasdan. Siz mashinani haydashingiz mumkin, dvigatelning qanday ishlashini tushunmasdan, va umuman maktab darajasidagi fizika bilmasdan. Bularning barchasi ob'ektga yo'naltirilgan dasturlashning asosiy tamoyillaridan biri -
inkapsulyatsiya tufayli mumkin. Ushbu mavzudagi turli maqolalarni o'qiyotganingizda, dasturlashda ikkita keng tarqalgan tushuncha -
inkapsulyatsiya va
yashirinlik bor, va mualliflar "inkapsulyatsiya" so'zi ostida bir narsani yoki boshqasini tushunadilar (shunday bo'lgan). Biz ikkala terminni ham ko'rib chiqamiz, shunda sizda to'liq tushunchaga ega bo'lishingiz uchun. Dastlabki ma'nosi "inkapsulyatsiya" dasturlashda -
ma'lumotlar va ular bilan ishlash usullarini bir paketda ("kapsula") birlashtirishdir. Java tilida paket-kapsula rolini
klass o'ynaydi. Klass o'z ichida
ma'lumotlar (klassning maydonlari) va bu ma'lumotlar bilan ishlash
usullari ni o'z ichiga oladi.
Bu sizga oddiy ko'rinishi mumkin, lekin boshqa dasturlash kontseptsiyalarida hammasi boshqacha tuzilgan. Masalan, funksional dasturlashda ma'lumotlar ularga nisbatan amallardan qat'iy ajratilgan. OOPda (ob'ektga yo'naltirilgan dasturlash) dasturlar klass-kapsulalardan iborat bo'lib, ular bir vaqtning o'zida ma'lumotlar ham, ular bilan ishlash uchun funksiyalar hamdir. Endi
yashirinlik haqida gaplashamiz. Qanday qilib biz turli murakkab mexanizmlardan foydalanamiz, ularning qanday tuzilganligini va qanday ishlashini tushunmasdanmi? Hammasi oddiy: ularning yaratuvchilari oddiy va oson
interfeysni taqdim etishgan. Gazli avtomatda interfeys - bu paneldagi tugmalar. Bir tugmani bosish bilan stakan hajmini tanlaysiz. Ikkinchi tugmani bosib, siropni tanlaysiz. Uchinchisi muzni qo'shadi. Va bu sizga qilish kerak bo'lgan hammasi. U qanday qilib ichida tuzilganligi muhim emas. Eng muhimi -
shunday tuzilgan, shunda foydalanuvchi gazli suv olish uchun uchta tugmani bosishi kerak. Mashina bilan ham xuddi shunday. Ichidagi nima sodir bo'layotgani muhim emas. Eng muhimi -
chap pedal bosilganda mashina oldinga ketadi, o'ng pedal bosilganda tormozlanadi. Bu yashirinlikning mohiyatidir. Dasturning barcha "ichki qismi" foydalanuvchidan yashirilgan. Bu ma'lumot foydalanuvchi uchun ortiqcha, kerak emas. Foydalanuvchiga yakuniy natija kerak, ichki jarayon emas. Masalan,
Auto klassiga nazar solaylik:
public class Auto {
public void gas() {
/*mashina ichida murakkab narsalar sodir bo'ladi
natijada u oldinga harakatlanadi*/
}
public void brake() {
/*mashina ichida murakkab narsalar sodir bo'ladi
natijada u tormozlanadi*/
}
public static void main(String[] args) {
Auto auto = new Auto();
//Foydalanuvchi uchun hammasi shunday ko'rinadi
//bir pedal bosildi - yurdi
auto.gas();
//boshqa pedal bosildi - tormozlandi
auto.brake();
}
}
Java dasturida amalga oshiriladigan yashirinlik mana shunday ko'rinadi. Haqiqiy hayotda bo'lgani kabi: foydalanuvchiga interfeys (metodlar) taqdim etilgan. Agar u dasturning mashinasida harakat qilishini xohlasa, kerakli metodni chaqirish kifoya. Va bu metodlarning ichida nima sodir bo'layotgani - bu ortiqcha ma'lumot, eng muhimi, hammasi kerakli tarzda ishlashi. Bu yerda biz
tashqi ko'rinishni yashirish haqida gaplashdik. Undan tashqari, Java'da
ma'lumotlarni yashirish ham mavjud. Bu haqida biz
getter'lar va setter'lar darsida yozgan edik, lekin eslatish zarar qilmaydi. Masalan,
Cat klassida:
public class Cat {
public String name;
public int age;
public int weight;
public Cat(String name, int age, int weight) {
this.name = name;
this.age = age;
this.weight = weight;
}
public Cat() {
}
public void sayMeow() {
System.out.println("Miyov!");
}
}
Ehtimol, oldingi darsdan bu klass muammosi nimada ekanligini eslab qoldingizmi? Agar yo'q bo'lsa - eslab o'tamiz. Muammo shundaki, uning ma'lumotlari (maydonlari) hamma uchun ochiq, va boshqa dasturchi dasturning ichida ismi yo'q, vazni 0 va yoshi -1000 yil bo'lgan mushuk yaratishi mumkin:
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "";
cat.age = -1000;
cat.weight = 0;
}
Bunday holda siz doimiy kuzatib turishingiz mumkin, kimdir sizning hamkasblaringizdan noto'g'ri holatda ob'ekt yaratadimi yoki yo'qmi, lekin bunday "noto'g'ri ob'ektlar"ni yaratishning imkoniyatini butunlay yo'qotish yanada yaxshi bo'lar edi.
Ma'lumotlarni yashirishda bizga yordam beradiganlar:
- kirish modifikatorlari (private, protected, package default);
- getter'lar va setter'lar.
- Ob'ektning to'g'ri holatini nazorat qilish. Bunga yuqoridagi misollar: setter va private modifikatori tufayli, biz 0 vaznda mushuklardan dasturimizni himoyaladik.
- Foydalanuvchi uchun interfeys orqali qulaylik. Biz foydalanuvchiga ochiq qoldirgan metodlar orqali "tashqariga" chiqamiz. Ular orqali kerakli natijaga erishish uchun ularni chaqirish kifoya, va ularning ishlash tafsilotlariga kirish shart emas.
- Koddagi o'zgarishlar foydalanuvchilarga ta'sir qilmaydi. Biz barcha o'zgarishlarni ichki metodlarda amalga oshiramiz. Bu foydalanuvchiga ta'sir qilmaydi: u qanday qilib avtomatik ravishda auto.gas() ni chaqiradi, xuddi shunday qilib u ham yozishi mumkin. Va u metodning acmalari o'zgaradi yoki yo'q, u uchun sezilmay qoladi: u qanday bo'lsa shunday natijani oladi.
GO TO FULL VERSION