Tajriba ishi №12 Mavzu;Inkapsulyatsiya Agarda muhandis ishlab chiqarish jarayonida rezistorni qo’llasa, u buni yangidan ixtiro qilmaydi, omborga (magazinga) borib mos parametrlarga muvofiq kerakli detalni tanlaydi. Bu holda muhandis joriy rezistor qanday tuzilganligiga e’tiborini qaratmaydi, rezistor faqatgina zavod xarakteristikalariga muvofiq ishlasa yetarlidir. Aynan shu tashqi konstruktsiyada qo’llaniladigan yashirinlik yoki obyektni yashirinligi yoki avtonomligi xossasi inkapsulyatsiya deyiladi.
Inkapsulyatsiya yordamida berilganlarni yashirish ta’minlanadi. Bu juda yaxshi xarakteristika bo’lib foydalanuvchi o’zi ishlatayotgan obyektning ichki ishlari haqida umuman o’ylamaydi. Haqiqatan ham, xolodilnikni ishlatishda refrijektorni ishlash tamoyilini bilish shart emas. Yaxshi ishlab chiqilgan dastur obyektini qo’llashda uning ichki o’zgaruvchilarining o’zaro munosabati haqida qayg’urish zarur emas.
Yana bir marta takrorlash joizki, rezistorni samarali qo’llash uchun uning ishlash tamoyili va ichki qurilmalari haqidagi ma’lumotlarni bilish umuman shart emas. Rezistorning barcha xususiyatlari inkapsulyatsiya qilingan, ya’ni yashirilgan. Rezistor faqatgina o’z funksiyasini bajarishi etarlidir.
C++ tilida inkapsulyatsiya tamoyili sinf deb ataluvchi nostandart tiplarni(foydalanuvchi tiplarini) hosil qilish orqali himoya qilinadi.
To’g’ri aniqlangan sinf obyektini butun dasturiy modul sifatida ishlatish mumkin. Haqiqiy sinfning barcha ichki ishlari yashirin bo’lishi lozim. To’g’ri aniqlangan sinfning foydalanuvchilari uning qanday ishlashini bilishi shart emas, ular sinf qanday vazifani bajarishini bilsalar etarlidir.
Sinf elementini e’lon qilishda bir nechta kalit so’zlardan foydalaniladi: public, private, protected.
Umumiy (public) komponentalar dasturni ixtiyoriy qismida murojaat xuquqiga ega. Ulardan, ixtiyoriy funksiya ushbu sinf ichida va sinf tashqarida foydalansa xam bo’ladi.
Xususiy (private) komponentalar sinf ichida murojaat xuquqiga ega, lekin sinf tashqarisidan esa murojaat kilish mumkin emas. Komponentalardan ushbu ular tavsiflangan sinfdagi funksiya - a’zolari yoki “do’stona”- funksiyalar orqali foydalanish mumkin.
Ximoyalangan (protected) komponentalar sinf ichida va xosila sinflarda murojaat xuquqiga ega.
Ulardan eng muhimlari public (ochiq) va private(yopiq) kalit so’zlari bo’lib, ular orqali obyektning a’zolariga murojaat qilish imkoniyati chegaralanadi.
Sinfning barcha usullari va xossalari boshlang’ich holda yopiq deb e’lon qilinadi. Yopiq a’zolarga faqatgina shu sinfning usullari orqaligina murojaat qilish mumkin. Obyektning ochiq a’zolariga esa dasturdagi barcha funksiyalar murojaat qilishlari mumkin. Sinf a’zolariga murojaat qilish imkonini belgilash juda muhim xususiyat bo’lib, bu masalani yechishda uncha katta tajribaga ega bo’lmagan dasturlarchilar ko’pincha qiyinchiliklarga duch keladilar. Bu holatni batafsilroq tushuntirish uchun mavzuni quyidagi masalamizni ko’ramiz
Class Mushuk { unsigned int itsYosh; unsigned int itsOgirlik; void Miyovlash();} Bu tarzda sinfni e’lon qilishda itsYosh va itsOgirlik maydonlari ham, Miyovlash() usuli ham yopiq a’zo sifatida aniqlanadi. Dasturda yuqoridagi tartibda Mushuk sinfi e’lon qilingan bo’lsa va bu sinf ekzemplyari bo’lgan obyektning itsYosh a’zosiga main() funksiyasi tanasidan turib murojaat qilsak kompilyator xatolik ro’y berganligi haqida xabar beradi.
Mushuk Baroq; Baroq.itsYosh = 5 // Xatolik! // Yopik a’zoga murojaat qilish mumkin emas. Inkapsulyatsiya Agarda muhandis ishlab chiqarish jarayonida rezistorni qo’llasa, u buni yangidan ixtiro qilmaydi, omborga (magazinga) borib mos parametrlarga muvofiq kerakli detalni tanlaydi. Bu holda muhandis joriy rezistor qanday tuzilganligiga e’tiborini qaratmaydi, rezistor faqatgina zavod xarakteristikalariga muvofiq ishlasa etarlidir. Aynan shu tashqi konstruktsiyada qo’llaniladigan yashirinlik yoki obyektni yashirinligi yoki avtonomligi xossasi inkapsulyatsiya deyiladi.
Inkapsulyatsiya yordamida berilganlarni yashirish ta’minlanadi. Bu juda yaxshi xarakteristika bo’lib foydalanuvchi o’zi ishlatayotgan obyektning ichki ishlari haqida umuman o’ylamaydi. Haqiqatan ham, xolodilnikni ishlatishda refrijektorni ishlash tamoyilini bilish shart emas. Yaxshi ishlab chiqilgan dastur obyektini qo’llashda uning ichki o’zgaruvchilarining o’zaro munosabati haqida qayg’urish zarur emas.
Yana bir marta takrorlash joizki, rezistorni samarali qo’llash uchun uning ishlash tamoyili va ichki qurilmalari haqidagi ma’lumotlarni bilish umuman shart emas. Rezistorning barcha xususiyatlari inkapsulyatsiya qilingan, ya’ni yashirilgan. Rezistor faqatgina o’z funksiyasini bajarishi etarlidir.
C++ tilida inkapsulyatsiya tamoyili sinf deb ataluvchi nostandart tiplarni(foydalanuvchi tiplarini) hosil qilish orqali himoya qilinadi.
Sinflar qanday tuzilishga ega ekanligi bilan keyinroq tanishib chiqamiz.
To’g’ri aniqlangan sinf obyektini butun dasturiy modul sifatida ishlatish mumkin. Haqiqiy sinfning barcha ichki ishlari yashirin bo’lishi lozim. To’g’ri aniqlangan sinfning foydalanuvchilari uning qanday ishlashini bilishi shart emas, ular sinf qanday vazifani bajarishini bilsalar etarlidir.
Sinf elementini e’lon qilishda bir nechta kalit so’zlardan foydalaniladi: public, private, protected.
Umumiy (public) komponentalar dasturni ixtiyoriy qismida murojaat xuquqiga ega. Ulardan, ixtiyoriy funksiya ushbu sinf ichida va sinf tashqarida foydalansa xam bo’ladi.
Xususiy (private) komponentalar sinf ichida murojaat xuquqiga ega, lekin sinf tashqarisidan esa murojaat kilish mumkin emas. Komponentalardan ushbu ular tavsiflangan sinfdagi funksiya - a’zolari yoki “do’stona”- funksiyalar orqali foydalanish mumkin.
Ximoyalangan (protected) komponentalar sinf ichida va xosila sinflarda murojaat xuquqiga ega.
Ulardan eng muhimlari public (ochiq) va private(yopiq) kalit so’zlari bo’lib, ular orqali obyektning a’zolariga murojaat qilish imkoniyati chegaralanadi.
Sinfning barcha usullari va xossalari boshlang’ich holda yopiq deb e’lon qilinadi. Yopiq a’zolarga faqatgina shu sinfning usullari orqaligina murojaat qilish mumkin. Obyektning ochiq a’zolariga esa dasturdagi barcha funksiyalar murojaat qilishlari mumkin. Sinf a’zolariga murojaat qilish imkonini belgilash juda muhim xususiyat bo’lib, bu masalani yechishda uncha katta tajribaga ega bo’lmagan dasturlarchilar ko’pincha qiyinchiliklarga duch keladilar. Bu holatni batafsilroq tushuntirish uchun mavzuni boshida keltirilgan masalamizga qaytamiz.
Class Mushuk { unsigned int itsYosh; unsigned int itsOgirlik; void Miyovlash(); } Bu tarzda sinfni e’lon qilishda itsYosh va itsOgirlik maydonlari ham, Miyovlash() usuli ham yopiq a’zo sifatida aniqlanadi. Dasturda yuqoridagi tartibda Mushuk sinfi e’lon qilingan bo’lsa va bu sinf ekzemplyari bo’lgan obyektning itsYosh a’zosiga main() funksiyasi tanasidan turib murojaat qilsak kompilyator xatolik ro’y berganligi haqida xabar beradi.
Mushuk Baroq; Baroq.itsYosh = 5 // Xatolik! // Yopik a’zoga murojaat qilish mumkin emas. Statik elementlar hamda funksiyalar Shu paytgacha, har bir yaratilgan element o‘zining xususiy ma’lumotlar elementiga ega bo’lar edi. Lekin, shunday holat bo’ladiki, bitta sinf doirasidagi obyektlarning ba’zi elementlari o‘zaro bog’langan bo’ladi. Masalan, ish vaqti bir xil bo’lgan 1000 ta ishchining oylik maoshini hisoblaydigan dastur tuzish taklif qilinayotgan bo’lsin. Soliq stavkasini aniqlash uchun dastur har bir ishchining sharoitini bilishi kerak. Buning uchun aytaylik, state_of_employee nomli sinfdan foydalanamiz. Agar, ishchilar bir xil sharoitda ishlasa, demak, dastur barcha employee tipidagi obyektlar uchun (barcha ishchilar uchun) ushbu elementlardan o’zaro moslikda foydalanadi. Ushbu holatda dastur, bitta axborotning 999 ta nusxasidan foydalanish bilan xotiradan foydalanish hajmini kamaytiradi. Sinfning elementidan o’zaro moslikda foydalanish uchun, ushbu element static (statik) deb e’lon qilinishi zarur. Agar, dastur ushbu elementga yangi qiymat o’zlashtirsa, hamma obyekt elementi ushbu yangi qiymatni qabul qiladi. Sinf elementi static deb e’lon qilinganidan so’ng, u umumiy (global) o’zgaruvchi sifatida e’lon qilinishi zarur. #include //strcpy() uchun
#include //printf() uchun
#include //_getch() uchun
using namespace std;
class book_series
{
public:
book_series(char *, char *, float);
void show_book(void);
void set_pages(int);
private:
static int page_count; //bu umumiy element hisoblanadi
char title[64];
char author[64];
float price;
};
int book_series::page_count; //sinfdan tashqarida umumiy o`zgaruvchini e`lon qilish
void book_series::set_pages(int pages)
{
page_count = pages;
}
book_series::book_series(char *title, char *author, float price) //Sinfning konstruktori
{
strcpy(book_series::title, title); /*string sinfiga ulanish uchun zarur bo`lgan, strcpy() funksiyasi*/
strcpy(book_series::author, author);
book_series::price = price;
}
void book_series:: show_book (void)
{
printf("Sarlavha: %s\n",title);
printf("Muallif:%s\n",author);
printf("Narx: %.2f\n",price);
printf("Sahifalar: %d\n",page_count);
}
int main()
{
book_series programming("Studiing C++", "Author1", 22.95);
//programming obyektini konstruktor yordamida yaratish
book_series word( "Studiing to work with Word for Windows 7", "Author2", 19.95);
//word obyektini konstruktor yordamida yaratish
word.set_pages(256); /*Word obyektining sahifalari soni beriladi, bu programmingga ham ta'sir qiladi*/
programming.show_book ();
word.show_book() ;
programming.set_pages(512); //page_countni o`zgartirish
programming.show_book(); //obyekt ma`lumotlarini ekranga chiqarish
//programming
word.show_book(); //obyekt ma`lumotlarini ekranga chiqarish
//word
_getch();
}