Inkapulyatsiya

All lectures for UZ purposes
Daraja, Dars
Mavjud

— Salom, Amigo! Bugungi leksiyamniinkapsulyatsiyaga. bag'ishlamoqchiman. Bu nimaligini umumiy olganda bilasan.

Инкапсуляция - 1

Inkapulyatsiyaning qanday afzalliklari bor? Ular yetarli darajada ko'p, ammo menimcha, to'rttasini ajratish mumkin:

1) Valid ichki holat.

Dasturlarda ko'pincha shunday vaziyatlar yuzaga keladi, bir necha sinflar bitta obyekt bilan o'zaro aloqada bo'lishadi. Natijada, ularning birgalikdagi ishlashi obyekt ichidagi ma'lumotlarning yaxlitligini buzadi — obyekt normal ishlay olmaydi.

Shuning uchun obyekt o'zining ichki ma'lumotlarining o'zgarishini kuzatishi kerak, va eng yaxshisi – ularni o'zi amalga oshirishi kerak.

Agar biz sinfning biror o'zgaruvchisi boshqalar tomonidan o'zgartirilmasligini xohlasak, biz uni private deb e'lon qilamiz, va faqat shu sinfning metodlari unga kirishlari mumkin bo'ladi. Agar o'zgaruvchilar qiymatini faqat o'qishni xohlasak, o'zgartirmasdan, kerakli o'zgaruvchilar uchun public getter qo'shamiz.

Masalan, biz hamma bizning kolleksiyamizda elementlar sonini bilishni xohlaymiz, ammo hech kim uni bizning ruxsatimizsiz o'zgartira olmaydi. Shunda biz private int count va public getCount() metodini e'lon qilamiz.

Inkapulyatsiyaning to'g'ri ishlatilishi hech bir sinfga bizning sinfimizning ichki ma'lumotlariga to'g'ridan-to'g'ri kirishni va, demak, ularni bizning nazoratimizsiz o'zgartirishni taqiqlaydi. Faqat o'sha sinfning metodlari orqali, o'zgartirilgan o'zgaruvchilar bilan bir xil metodlar orqali.

Boshqa dasturchilar har doim sening sinflarni o'zlariga eng qulay tarzda ishlatishini taxmin qilish yaxshiroqdir, senga emas (sening sinfingga) eng xavfsiz tarzda. Bu shunday xatolarni yuzaga keltiradi, va ulardan oldinroq qutilishga urinishlar mavjud.

2) Uzatilgan argumentlarni nazorat qilish.

Ba'zan, bizning sinfimiz metodlariga uzatilgan argumentlarni nazorat qilish kerak bo'ladi. Masalan, bizning sinfimiz «inson» obyektini ta'riflaydi va uning tug'ilish sanasini belgilashga imkon beradi. Biz barcha uzatilgan ma'lumotlarni dastur mantiqi va sinfimiz mantiqiga mos kelishini tekshirishimiz kerak. Masalan, 13-oyni qabul qilmaslik, 30-fevral tug'ilish sanasi va hokazo.

— Nega kimdir tug'ilish sanasida 30-fevralni ko'rsatishi kerak?

— Birinchidan – bu foydalanuvchining ma'lumotlarni kiritishda xatolik bo'lishi mumkin.

Ikkinchidan, dasturning ishlashi yetib borishi uchun, unda ko'plab xatolar bo'lishi mumkin. Masalan, shunday vaziyat yuzaga kelishi mumkin.

Dasturchi ertangi kun tug'ilganlarni belgilash uchun dastur yozadi. Masalan, bugun 3-mart. Dastur kundan 2 qo'shadi va 5-martda tug'ilganlarni izlaydi. Hammasi to'g'ri ko'rinadi.

Lekin, 30-mart kelganida dastur hech kimni topa olmaydi, chunki taqvimda 32-mart yo'q. Dasturning xatolarini minimallashtirish uchun metodlarga uzatilgan ma'lumotlarni tekshirish qo'shadi.

— ArrayListni o'rganganimizda, uning kodini ko'rganimda, get va set metodlarida indexni tekshirish bo'lgan: index noldan katta yoki teng va massiv uzunligidan kichik. Agar massivda bunday indexli element bo'lmasa, istisno tashlanardi.

— Ha, bu kiruvchi ma'lumotlarni tekshirishning klassik misoli.

3) Sinflar kodini o'zgartirishda xatolarni minimallashtirish.

Tasavvur qilaylik, biz katta loyihada ishtirok etganimizda bir juda foydali sinf yozdik. U shunday chiqdiki, boshqa dasturchilar uni o'z kodlarida yuzlab joylarda ishlatishdi.

Sinf juda foydali bo'lib chiqdi, shunday qilib sen uni yaxshilashga qaror qilasan. Agar sen bu sinfdagi ba'zi metodlarni olib tashlasang, o'nlab odamlarning kodi kompilatsiyalanmaydi. Ularga hammasini tezda qayta ishlash kerak bo'ladi. Va qanchalik ko'p qayta ishlash, shunchalik ko'p xatolar. Sen bir qancha yig'ilishlarni sindirib, va seni nafratlanishadi.

Agar biz private deb e'lon qilingan metodlarni o'zgartirsak, biz bilib olamizki, hech qanday sinf bunday metodlarni chaqirmagan. Biz ularni qayta ishlashimiz, parametrlar sonini va ularning turlarini o'zgartirishimiz mumkin, va bog'liq kod hali ham ishlashda davom etadi. Yoki, hech bo'lmaganda, kompilatsiya qilinadi.

4) Bizning obyektnimizning tashqi obyektlar bilan o'zaro aloqasini belgilash.

Biz obyektimiz bilan qilinadigan ba'zi harakatlarni cheklashimiz mumkin. Masalan, biz obyekt faqat bitta nusxada yaratilishini xohlaymiz. Hattoki, loyihaning bir necha joyida bir vaqtda yuzaga kelishi kerak bo'lsa ham. Va biz buni inkapsulyatsiya tufayli amalga oshirishimiz mumkin.

Инкапсуляция - 2

Inkapulyatsiya qo'shimcha cheklovlarni qo'shishga imkon beradi, ular esa qo'shimcha afzalliklarga aylantirish mumkin. Masalan, String sinfi immutable (o'zgarmas) obyekt sifatida amalga oshirilgan. String sinfining obyektlar o'zaro mulkini o'zgartirmaydi, ular yaratiligandan o'limga qadar. String sinfining barcha metodlari (remove, substring, …), yangi qatorni qaytaradi, chaqirilgan obyektni hech qanday o'zgartirishsiz.

— Hai, bu qanday qiziq narsa ekan, axir.

— Inkapulyatsiya juda qiziqarli narsa.

— Ha, albatta.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION