JavaRush /Java blogi /Random-UZ /Java-da inkapsulyatsiya tamoyillari

Java-da inkapsulyatsiya tamoyillari

Guruhda nashr etilgan
Salom! Bugungi ma'ruza inkapsulyatsiyaga bag'ishlanadi va biz uni darhol misollar bilan boshlaymiz :) Sizning oldingizda tanish soda mashinasi. Sizga bitta savolim bor: u qanday ishlaydi? Batafsil javob berishga harakat qiling: stakan qaerdan keladi, ichidagi harorat qanday saqlanadi, muz qayerda saqlanadi, mashina qanday sirop qo'shishni tushunadi va hokazo. Katta ehtimol bilan sizda bu savollarga javob yo'q. Ehtimol, hamma ham bunday mashinalardan foydalanmaydi, ular bugungi kunda unchalik mashhur emas. Keling, yana bir misol keltirishga harakat qilaylik. Siz har kuni ko'p marta ishlatishingizni bilgan narsangiz. Oh, menda bir fikr bor! Google qidiruviInkapsulyatsiya tamoyillari - 2 qanday ishlashini bizga ayting . Siz kiritgan so'zlar asosida ma'lumotni qanday aniq izlaydi? Nima uchun bu natijalar yuqorida, boshqalarda emas? Har kuni Google’dan foydalansangiz ham, buni bilmasligingiz mumkin. Lekin bu muhim emas. Axir, buni bilishingiz shart emas. Qidiruv tizimiga uning qanday ishlashi haqida o'ylamasdan so'rovlarni kiritishingiz mumkin. Soda qanday ishlashini bilmasdan, avtomatdan sotib olishingiz mumkin. Siz avtomobilni ichki yonish dvigatelining ishlashini o'rganmasdan va fizikani umuman bilmasdan, hatto maktab darajasida ham haydashingiz mumkin. Bularning barchasi ob'ektga yo'naltirilgan dasturlashning asosiy tamoyillaridan biri - inkapsulyatsiya tufayli mumkin . Ushbu mavzu bo'yicha turli maqolalarni o'qiyotganingizda, ehtimol siz dasturlashda ikkita umumiy tushuncha mavjudligiga duch keldingiz - inkapsulyatsiya va yashirish . Va "inkapsulyatsiya" so'zi bilan mualliflar u yoki bu narsani anglatadi (bu sodir bo'lganda). To'liq tushunchaga ega bo'lishingiz uchun ikkala shartni ham ajratamiz. Dasturlashda " inkapsulyatsiya " so'zining asl ma'nosi ma'lumotlar va ushbu ma'lumotlar bilan ishlash usullarining bir paketdagi ("kapsula") birikmasidir. Java-da sinf kapsula paketi vazifasini bajaradi . Sinfda ma'lumotlar (sinf maydonlari) va ushbu ma'lumotlar bilan ishlash usullari mavjud. Bu sizga ravshan ko'rinadi, lekin boshqa dasturlash tushunchalarida hamma narsa boshqacha ishlaydi. Masalan, funktsional dasturlashda ma'lumotlar undagi operatsiyalardan qat'iy ravishda ajratiladi. OOP (ob'ektga yo'naltirilgan dasturlash) da dasturlar kapsula sinflaridan iborat bo'lib, ular ham ma'lumotlar, ham ular bilan ishlash uchun funktsiyalardir. Endi yashirish haqida gapiraylik . Qanday qilib biz har xil murakkab mexanizmlardan ularning qanday ishlashini va nimaga asoslanganini tushunmasdan foydalanamiz? Hammasi oddiy: ularning yaratuvchilari oddiy va qulay interfeysni taqdim etganInkapsulyatsiya tamoyillari - 3. Soda mashinasida interfeys paneldagi tugmalardir. Bitta tugmani bosish orqali siz stakanning ovoz balandligini tanlaysiz. Ikkinchisini bosish orqali siz siropni tanlaysiz. Uchinchisi muz qo'shish uchun javobgardir. Va bu siz qilishingiz kerak bo'lgan yagona narsa. Mashinaning ichida qanday qilib aniq ishlab chiqilganligi muhim emas. Asosiysi, u soda olish uchun foydalanuvchi uchta tugmani bosish kerak bo'lgan tarzda yaratilgan . Mashina bilan ham xuddi shunday. Uning ichida nima bo'layotgani muhim emas. Asosiysi, o'ng pedalni bosganingizda, mashina oldinga siljiydi va chap pedalni bosganingizda, u sekinlashadi . Aynan mana shu yashirinishning mohiyati. Dasturning barcha "ichki qismlari" foydalanuvchidan yashiringan. Uning uchun bu ma'lumot ortiqcha va keraksizdir. Foydalanuvchiga ichki jarayon emas, balki yakuniy natija kerak. Misol sifatida sinfni ko'rib chiqaylik Auto:
public class Auto {

   public void gas() {

       /*some complicated things are happening inside the car
       as a result of which it goes forward*/
   }

   public void brake() {

       /*some complicated things are happening inside the car
       as a result of which it slows down*/
   }

   public static void main(String[] args) {

       Auto auto = new Auto();

       // How everything looks to the user

       //pressed one pedal - went
       auto.gas();

       //pressed another pedal - braked
       auto.brake();
   }
}
Amalga oshirishni yashirish Java dasturida shunday ko'rinadi. Hamma narsa haqiqiy hayotdagidek: foydalanuvchi interfeys (usullar) bilan ta'minlangan. Agar biror harakatni bajarish uchun dasturda mashina kerak bo'lsa, u faqat kerakli usulni chaqirishi kerak. Va bu usullar ichida sodir bo'ladigan narsa keraksiz ma'lumotlar, asosiysi, hamma narsa kerak bo'lganidek ishlaydi. Bu erda biz amalga oshirishni yashirish haqida gaplashdik . Bundan tashqari, Java-da ma'lumotlarni yashirish ham mavjud . Biz bu haqda ma'ruzada oluvchilar va sozlagichlar haqida yozgan edik , lekin eslatib qo'ysak zarar bo'lmaydi. Masalan, bizda sinf mavjud Cat:
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("Meow!");
   }


}
Ehtimol, oxirgi ma'ruzadan bu sinfning muammosi nima ekanligini eslaysizmi? Agar yo'q bo'lsa, eslaylik. Muammo shundaki, uning ma'lumotlari (maydonlari) hamma uchun ochiq va boshqa dasturchi dasturda og'irligi 0 va yoshi -1000 yil bo'lgan nomsiz mushukni osongina yaratishi mumkin:
public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
Bunday vaziyatda siz hamkasblaringizdan biri noto'g'ri holatga ega ob'ektlarni yaratayotganini diqqat bilan kuzatib borishingiz mumkin, ammo bunday "noto'g'ri ob'ektlar" ni yaratish imkoniyatini istisno qilish yaxshiroqdir. Inkapsulyatsiya tamoyillari - 4 Ular bizga ma'lumotlarni yashirishda yordam beradi:
  1. kirish modifikatorlari ( maxfiy , himoyalangan , standart paket );
  2. oluvchilar va o'rnatuvchilar.
U erda biz, masalan, kimdir mushukning yoshiga qarab salbiy raqam berishga urinayotganligini tekshirishimiz mumkin. Yuqorida aytib o'tganimizdek, inkapsulyatsiya bo'yicha turli maqolalar mualliflari inkapsulyatsiya (ma'lumotlar va usullarni birlashtirish) yoki yashirish yoki ikkalasini anglatadi. Java ikkala mexanizmga ham ega (boshqa OOP tillarida bu shart emas), shuning uchun oxirgi variant eng to'g'ri hisoblanadi. Inkapsulyatsiyadan foydalanish bizga bir qator muhim afzalliklarni beradi:
  1. Ob'ektning to'g'ri holatini kuzatish. Yuqorida bunga misollar bor edi: sozlagich va xususiy modifikator tufayli biz dasturimizni 0 vaznli mushuklardan himoya qildik.

  2. Interfeys tufayli foydalanuvchilar uchun qulaylik. Biz foydalanuvchilarga kirish uchun faqat "tashqarida" usullarni qoldiramiz. Natijani olish uchun unga qo'ng'iroq qilish kifoya qiladi va u umuman ularning ishlarining tafsilotlarini o'rganishga hojat yo'q.

  3. Kodga kiritilgan o'zgartirishlar foydalanuvchilarga ta'sir qilmaydi. Biz barcha o'zgarishlarni usullar ichida qilamiz. Bu foydalanuvchiga ta'sir qilmaydi: u avtomashinaning gazi uchun auto.gas() ni yozgan, shuning uchun uni yozadi. Va gas() usulida biror narsani o'zgartirganimiz unga ko'rinmas bo'lib qoladi: u avvalgidek shunchaki kerakli natijani oladi.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION