Kotlin Enkapsulatsiya. (Sinf/Class)

Inkapsulyatsiya tushunchasi

Kotlin tili obyektga mo’ljallangan dasturlash (OMD) prinsiplariga tayanadi:

  1. Inkapsulyasiya
  2. Vorislik
  3. Polimorfizm

Inkapsulyasiyalash - ma’lumotlarning va shu ma’lumotlar ustida ish olib boradigan kodlarning bitta obyektda birlashtirilishi. OMD atamachiligida ma’lumotlar obyekt ma’lumotlari a’zolari (data members) deb, kodlar obyektli usullar yoki funksiya-a’zolari (methods, member functions) deb ataladi. Inkapsulyasiya yordamida berilganlarni yashirish ta’minlanadi. Bu juda yaxshi xarakteristika bo’lib foydalanuvchi o’zi ishlatayotgan obyektning ichki ishlari haqida umuman o’ylamaydi. Yaxshi ishlab chiqilgan dastur obyektini qo’llashda uning ichki o’zgaruvchilarining o’zaro munosabati haqida qayg’urish zarur emas. Kotlin tilida inkapsulyasiya prinsipi sinf deb ataluvchi nostandart turlarni(foydalanuvchi turlarini) hosil qilish orqali himoya qilinadi. Sinf - bu maxsus turlar bo’lib, o’zida maydon, usullar va xossalarni mujassamlashtiradi. Sinf murakkab struktura bo’lib, ma’lumotlar ta’riflaridan tashqari, prosedura va funksiyalar ta’riflarini o’z ichiga oladi. Sinf jismoniy mohiyatga ega emas, tuzilmaning e’lon qilinishi uning eng yaqin analogiyasidir. Sinf obyektni yaratish uchun qo’llangandagina, xotira ajralib chiqadi. Bu jarayon ham sinf nusxasi (class intsance) ni yaratish deb ataladi. 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 yetarlidir. Aynan inkapsulyatsiyalash tufayli mustaqillik darajasi ortadi, chunki ichki detallar interfeys ortida yashiringan bo’ladi. Inkapsulyatsiyalash modullikning obyektga mo’ljallangan tavsifidir. Inkapsulyatsiyalash yordamida dasturiy ta’minotni ma’lum funksiyalarni bajaruvchi modullarga bo’lib tashlash mumkin. Bu funksiyalarni amalga oshirish detallari esa tashqi olamdan yashirin holda bo’ladi. Mohiyatan inkapsulyatsiyalash atamasi «germetik berkitilgan tashqi ta’sirlardan himoyalangan dastur qismi» degan ma’noni bildiradi. Agar biron-bir dasturiy obyektga inkapsulyatsiyalash qo’llangan bo’lsa, u holda bu obyekt qora quti sifatida olib qaraladi. Siz qora quti nima qilayotganini uning tashqi interfeysini ko’rib turganingiz uchungina bilishingiz mumkin. Qora quti biron narsa qilishga majburlash uchun, unga xabar yuborish kerak. Qora quti ichida nima codir bo’layotgani ahamiyatli emas, qora quti yuborilgan xabarga adekvat (moc ravishda) munosabatda bo’lishi muhimroqdir. Interfeys tashqi olam bilan tuzilgan o’ziga xos bitim bo’lib, unda tashqi obyektlar ushbu obyektga qanday talablar yuborishi mumkinligi ko’rsatilgan bo’ladi. Interfeys - obyetkni boshqarish pulti. Shuni ta’kidlab o’tish lozimki, «Casio» soatining suyuq kristalli displeyi ushbu obyektning ma’lumotlar a’zosi bo’ladi, boshqarish tugmachalari esa obyektli usullar bo’ladi. Soat tugmachalarini bosib, displeyda vaqtni o’rnatish ishlarini olib borish mumkin, ya’ni OMD atamalarini qo’llaydigan bo’lsak, usullar, ma’lumotlar a’zolarini o’zgartirib, obyekt holatini modifikasiya qiladi. 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 konstruksiyada qo’llaniladigan yashirinlik yoki obyektni yashirinligi yoki avtonomligi xossasi inkapsulyatsiya deyiladi. Yana bir marta takrorlash joizki, rezistorni samarali qo’llash uchun uning ishlash prinsipi va ichki qurilmalari haqidagi ma’lumotlarni bilish umuman shart emas. Rezistorning barcha xususiyatlari inkapsulyatsiya qilingan, ya’ni yashirilgan. Rezistor faqatgina o’z funksiyasini bajarishi yetarlidir.

Inkapsulyatsiyalash maqsadi

Inkapsulyatsiyalashdan to’g’ri foydalanish tufayli obyektlar bilan o’zgartiriladigan komponentlar (tarkibiy qismlar)dek muomala qilish mumkin. Bir obyekt boshqa obyektdan foydalana olishi uchun, u birinchi obyektning ommaviy interfeysidan qanday fodalanish kerakligini bilishi kifoya. Bunday mustaqillik uchta muhim afzallikka ega.

  1. Mustaqillik tufayli, obyektdan takroran foydalanish mumkin. Inkapsulyatsiyalash puxta amalga oshirilgan bo’lsa, obyektlar ma’lum bir programmaga bog’lanib qolgan bo’lmaydi. Ulardan imkoni bo’lgan hamma yerda foydalanish mumkin bo’ladi. Obyektdan boshqa biron o’rinda foydalanish uchun, uning interfeysidan foydalanib qo’ya qolish kifoya.
  2. Inkapsulyatsiyalash tufayli, obyektda boshqa obyektlar uchun ko’rinmas bo’lgan o’zgarishlarni amalga oshirish mumkin. Agar interfeys o’zgartirilmasa, barcha o’zgarishlar obyektdan foydalanayotganlar uchun ko’rinmas bo’ladi. Inkapsulyatsiyalash komponentni yaxshilash, amalga oshirish samaradorligini ta’minlash, xatolarni bartaraf etish imkonini beradi hamda bularning hammasi dasturning boshqa obyektlariga ta’sir ko’rsatmaydi. Obyektdan foydalanuvchilar ularda amalga oshirilayotgan barcha o’zgarishlardan avtomatik tarzda o’tadilar.
  3. Himoyalangan obyektdan foydalanishda obyekt va dasturning boshqa qismi o’rtasida biron-bir ko’zda tutilmagan o’zaro aloqalar bo’lishi mumkin emas. Agar obyekt boshqalardan ajratilgan bo’lsa, bu holda u dasturning boshqa qismi bilan faqat o’z interfeysi orqali aloqaga kirishishi mumkin. Shunday qilib, inkapsulyatsiyalash yordamida modulli dasturlarni yaratish mumkin.

Samarali inkapsulyasiyalash

Samarali inkapsulyasiyalashning uchta o’ziga xos belgisi quyidagicha:

  1. abstraksiya;
  2. joriy qilishning berkitilganligi;
  3. ma’suliyatning bo’linganligi.

Abstraksiya. Garchi obyektga mo’ljallangan tillar inkapsulyatsiyalashdan foydalanishga yordam bersada, biroq ular inkapsulyatsiyalashni kafolatlamaydi. Tobe va ishonchsiz kodni yaratib qo’yish oson. Samarali inkapsulyasiyalash - sinchkovlik bilan ishlab chiqish hamda abstraksiya va tajribadan foydalanish natijasi. Inkapsulyatsiyalashdan samarali foydalanish uchun dasturni ishlab chiqishda avval abstraksiyadan va uning bilan bog’liq konsepsiyalardan foydalanishni o’rganib olish lozim. Abstraksiya murakkab masalani soddalashtirish jarayonidir. Muayyan masalani yechishga kirishar ekansiz, siz barcha detallarni hisobga olishga urinmaysiz, balki yechimni osonlashtiradiganlarini tanlab olasiz. Aytaylik, siz yo’l harakati modelini tuzishingiz kerak. Shunisi ayonki, bu o’rinda siz svetoforlar, mashinalar, shosselar, bir tomonlama va ikkitomonlama ko’chalar, ob-havo sharoitlari va h.k. sinflarini yaratasiz. Ushbu elementlarning har biri transport harakatiga ta’sir ko’rsatadi. Biroq bu o’rinda hasharotlar va qushlar ham yo’lda paydo bo’lishi mumkin bo’lsada, siz ularning modelini yaratmaysiz. Chunki, siz mashinalar markalarini ham ajratib ko’rsatmaysiz. Siz haqiqiy olamni soddalashtirasiz hamda uning faqat asosiy elementlaridan foydalanasiz. Mashina - modelning muhim detali, biroq bu Kadillakmi yoki boshqa biron markadagi mashinami, yo’l harakati modeli uchun bu detallar ortiqcha. Abstraksiyaning ikkita afzal jihati bor. Birinchidan, u masala yechimini soddalashtiradi. Muhimi shundaki, abstraksiya tufayli dasturiy ta’minot komponentlaridan takroran foydalanish mumkin. Takroran qo’llanadigan komponentlarni yaratishda ular odatda g’oyat ixtisoslashadi. Ya’ni komponentlar biron-bir ma’lum masala yechimiga mo’ljallangani, yana ular keraksiz o’zaro bog’liqlikda bo’lgani sababli dastur fragmentining boshqa biron o’rinda takroran qo’llanishi qiyinlashadi. Imkoni boricha bir qator masalalarni yechishga qaratilgan obyektlarni yaratishga harakat qiling. Abstraksiya bitta masala yechimidan ushbu sohadagi boshqa masalalarni ham yechishda foydalanish imkonini beradi. Ikkita misolni ko’rib chiqamiz.

Birinchi misol: Bank kassasiga navbatda turgan odamlarni tasavvur qiling. Kassir bo’shaganda, uning darchasiga navbatda turgan birinchi mijoz yaqinlashadi. Shunday qilib, navbatdagi hamma odam birin-ketin kassir darchasi tomon suriladi. Navbatda turganlar «birinchi kelganga birinchi bo’lib xizmat ko’rsatildi» algoritmi bo’yicha surilib boradi.

Ikkinchi misol: Gazakxonada gamburgerli konveerni ko’rib chiqaylik. Navbatdagi yangi gamburger konveerga kelib tushganda, u gamburgerlar qatoridagi oxirgi gamburger yonidan joy oladi. Shuning uchun konveerdan olingan gamburger u yerda boshqalaridan ko’proq vaqt turib qolgan bo’ladi. Restoranlar «birinchi kelganga birinchi bo’lib xizmat ko’rsatildi» algoritmi bo’yicha ishlaydi. Garchi bu misollar butkul turlicha bo’lsada, ularda qandaydir umumiy tamoyil qo’llangan bo’lib, undan boshqa vaziyatlarda ham foydalanish mumkin. Boshqacha qilib aytganda, siz abstraksiyaga kelasiz. Bu misollarning har ikkalasida ham «birinchi kelganga birinchi bo’lib xizmat ko’rsatildi» algoritmi qo’llangan. Bu o’rinda navbat elementi nimani bildirishi muhim emas. Xaqiqatda ushbu element navbat oxiriga kelib qo’shilishi hamda navbatni uning boshiga yetganda tark etishigina muhimdir. Abstraksiya yordamida bir marta navbatni yaratib, keyinchalik uni boshqa dasturlarni yozishda qo’llash mumkinki, bu dasturlarda elementlarga «birinchi kelganga birinchi bo’lib xizmat ko’rsatildi» algoritmi bo’yicha ishlov beriladi. Samarali abstraksiyani bajarish uchun bir nechta qoidalarni ifodalash mumkin. -Qandaydir aniq holatni emas, umumiy holatni olib qarang. Turli masalalarga xos bo’lgan umumiy jihatni izlab toping. Shunchaki alohida xodisani emas, asosiy tamoyilni ko’ra bilishga harakat qiling. Garchi abstraksiya g’oyat qimmatli bo’lsada, biroq eng yechimli masalani yodingizdan chiqarmang. Abstraksiya hamma vaqt ham ochiq-oydin emas. Masalani yechar ekansiz, siz birinchi, ikkinchi va hatto, uchinchi martasiga ham abstraksiyani tanib ololmasligingiz mumkin. Muvaffaqiyatsizlikka tayyor turing. Amalda har bir vaziyat uchun to’g’ri keladigan abstrakt dasturni yozish mumkin emas. Abstraksiyani so’nggi maqsad sifatida emas, balki unga erishish yo’lidagi vosita sifatida olib qarash kerak. Muayyan xollarda abstraksiyani qo’llash kerak emas. Yaxshigina evristik qoida mavjud, bo’lib, unga ko’ra, agar siz biron bir masalani o’zaro o’xshash usullar bilan kamida uch marta yechgan bo’lsangiz, abstraksiyani faqat shunday masalalarga qo’llash tavsiya qilinadi. Abstrakt komponentni takroran qo’llash osonroq, chunki u biron-bir bitta o’ziga xos masalani yechishga emas, balki qator masalalarni yechishga mo’ljallangan. Biroq bu xol komponentdan shunchaki takroran foydalanishdan ko’ra ko’proq inkapsulyasiyalashga tegishli. Ichki detallarni yashirishga o’rganish g’oyat muhimdir. Ma’lumotlarning abstrakt turlarini qo’llash inkapsulyasiyalashni samarali qo’llashga imkon beradi. Joriy qilishni yashirish yordamida sirlarni yashirish. Abstraksiya samarali inkapsulyasiyalashning tarkibiy qismlaridan biri xolos. Tashqi ta’sirlardan mutlaqo himoyalanmagan abstrakt dasturni ham yozish mumkin. Aynan shuning uchun obyektning ichki joriy qilinishini berkitish kerak bo’ladi. Joriy qilishning berkitilganligi. Joriy qilishning berkitilganligi ikkita afzallikka ega:

  1. Obyektlarni foydalanuvchilardan himoyalaydi;
  2. Foydalanuvchilarni obyektlardan himoyalaydi;

Asl inkapsulyatsiyalash til darajasida qurilma til konstruksiyalari yordamida ta’minlanadi. Ma’lumotlarning abstrakt turlari - bu ma’lumotlar va ular ustida o’tkaziladigan operasiyalar to’plami. Ma’lumotlarning abstrakt turlari ichki axborot va holatni puxta ishlab chiqilgan interfeys ortida yashirar ekan, ular tilda ma’lumotlarning yangi turlarini aniqlashga imkon beradi. Bunday interfeysda ma’lumotlarning abstrakt turlari bo’linmas butunlik sifatida taqdim etilgan. Ma’lumotlarning abstrakt turlari inkapsulyatsiyalashni qo’llashni osonlashtiradi, chunki ular tufayli inkapsulyatsiyalashni vorisliksiz va polimorfizmsiz qo’llash mumkin, bu esa inkapsulyatsiyalashning aynan o’ziga diqqatni qaratish imkonini beradi. Ma’lumotlarning abstrakt turlari shuningdek tur tushunchasining qo’llanishini ham osonlashtiradi. Agar tur nima ekanini anglab olsak, bu holda obyektga mo’ljallangan yondoshuv ixtisoslashtirilgan foydalanuvchilik turlari yordamida tilni kengaytirishning tabiiy usulini taklif qilayotganini oson sezib olish mumkin.

Inkapsulyatsiyalash: namunaviy xatolar. Abstraksiyani o’ta darajada qo’llash sinfni yozishda ma’lum muammolarni keltirib chiqarishi mumkin. Barcha foydalanuvchilarga hamda barcha vaziyatlarda birdek to’g’ri keladigan sinfni yozish mumkin emas. Haddan tashqari abstraksiyalash ham xavfli bo’lishi mumkin. Hatto agar siz biron-bir elementning ishlab chiqilishida abstraksiyadan foydalangan bo’lsangiz, u shu bir elementda ham barcha vaziyatlarda ishlay olmasligi mumkin. Foydalanuvchining barcha ehtiyojlarini qondira oladigan sinfni yaratish juda qiyin. Abstraksiyaga o’ralashib qolish kerak emas, birinchi galda qo’yilgan masalani yechish kerak. Sinfga masalani yechish uchun kerak bo’lganidan ko’proq narsani kiritish tavsiya qilinmaydi. Birdaniga barcha masalalarni yechmang, e’tiboringizni bittasining yechimiga qarating. Va shundan so’nggina qilib bo’lingan ishga nisbatan abstraksiyani qo’llash usulini izlab ko’rish mumkin.