JavaRush /Java blogi /Random-UZ /OOP tamoyillari

OOP tamoyillari

Guruhda nashr etilgan
Salom! Java nima uchun shunday yaratilgani haqida hech o'ylab ko'rganmisiz? Siz sinflarni yaratasiz, ular asosida - ob'ektlar, sinflar usullari va boshqalar. Ammo nima uchun tilning tuzilishi shundayki, dasturlar boshqa narsadan emas, balki sinflar va ob'ektlardan iborat? Nima uchun "ob'ekt" tushunchasi ixtiro qilindi va birinchi o'ringa qo'yildi? Barcha tillar shu tarzda ishlaydimi va agar bo'lmasa, Java-ga qanday foyda keltiradi? Ko'rib turganingizdek, savollar juda ko'p :) Keling, bugungi ma'ruzamizda ularning har biriga javob berishga harakat qilaylik.

OOP tamoyillari:

  1. Meros olish
  2. Abstraktsiya
  3. Inkapsulyatsiya
  4. Polimorfizm

Ob'ektga yo'naltirilgan dasturlash (OOP) nima

Albatta, Java biron bir sababga ko'ra ob'ektlar va sinflardan iborat. Bu uni yaratuvchilarning injiqligi yoki hatto ularning ixtirosi ham emas. Ob'ektlarga asoslangan boshqa ko'plab tillar mavjud. Birinchi bunday til Simula deb nomlangan va u 1960-yillarda Norvegiyada ixtiro qilingan. Boshqa narsalar qatorida Simula " sinf " va " usul " tushunchalarini kiritdi . Ob'ektga yo'naltirilgan dasturlash tamoyillari - 2
Kristen Nygaard va Ole Yoxan Dahl - Simula yaratuvchilari
Simula dasturlash standartlari bo'yicha qadimiy til bo'lib tuyuladi, ammo ularning Java bilan "oilaviy" aloqasi yalang'och ko'z bilan ko'rinadi. Katta ehtimol bilan siz unda yozilgan kodni osongina o'qishingiz va nima qilishini umumiy ma'noda tushuntirishingiz mumkin :)
Begin
  Class Rectangle (Width, Height); Real Width, Height;

   Begin
      Real Area, Perimeter;

      Procedure Update;
      Begin
        Area := Width * Height;
              OutText("Rectangle is updating, Area = "); OutFix(Area,2,8); OutImage;
        Perimeter := 2*(Width + Height);
              OutText("Rectangle is updating, Perimeter = "); OutFix(Perimeter,2,8); OutImage;
      End of Update;

      Update;
      OutText("Rectangle created: "); OutFix(Width,2,6);
      OutFix(Height,2,6); OutImage;
   End of Rectangle;

       Rectangle Class ColouredRectangle (Color); Text Color;

  Begin
      OutText("ColouredRectangle created, color = "); OutText(Color);
      OutImage;
        End of ColouredRectangle;


         Ref(Rectangle) Cr;
   Cr :- New ColouredRectangle(10, 20, "Green");
End;
Kod misoli maqoladan olingan Simula - OOP 50 yil . Ko'rib turganingizdek, Java va uning ajdodi bir-biridan unchalik farq qilmaydi :) Bu Simulaning paydo bo'lishi yangi kontseptsiya - ob'ektga yo'naltirilgan dasturlashning tug'ilishi bilan bog'liq. Vikipediya OOPning quyidagi taʼrifini beradi: Obʼyektga yoʻnaltirilgan dasturlash (OOP) bu dasturni obʼyektlar toʻplami sifatida koʻrsatishga asoslangan dasturlash metodologiyasi boʻlib, ularning har biri maʼlum bir sinfning namunasi boʻlib, sinflar meros ierarxiyasini tashkil qiladi. Menimcha, bu juda muvaffaqiyatli. Siz yaqinda Java tilini o'rganishni boshladingiz, lekin unda siz uchun notanish so'zlar deyarli yo'q :) Bugungi kunda OOP eng keng tarqalgan dasturlash metodologiyasi hisoblanadi. Java-dan tashqari, OOP tamoyillari siz eshitgan ko'plab mashhur tillarda qo'llaniladi. Bular C++ (kompyuter oʻyinlarini ishlab chiquvchilar tomonidan faol qoʻllaniladi), Objective-C va Swift (ular Apple qurilmalari uchun dasturlar yozadilar), Python (mashina oʻrganishda eng koʻp talab), PHP (eng mashhur veb-ishlab chiqish tillaridan biri), JavaScript (oddiyroq, ular nima qilmasligini aytadi) va boshqalar. Aslida, OOPning bu "tamoyillari" nima? Keling, sizga batafsilroq aytib beraylik.

OOP tamoyillari

Bu asoslar. Birgalikda ob'ektga yo'naltirilgan dasturlash paradigmasini tashkil etuvchi 4 ta asosiy xususiyat. Ularni tushunish muvaffaqiyatli dasturchi bo'lishning kalitidir. Ob'ektga yo'naltirilgan dasturlash tamoyillari - 3

Prinsip 1. Meros

Yaxshi xabar shundaki, siz OOP ning ba'zi tamoyillari bilan allaqachon tanishsiz! :) Biz allaqachon ma'ruzalarda merosga bir necha bor duch kelganmiz va u bilan ishlashga ulgurdik. Meros - bu mavjud (ota-ona) asosida yangi sinfni tavsiflash imkonini beruvchi mexanizm. Bunday holda, ota-klassning xususiyatlari va funksionalligi yangi sinf tomonidan qarzga olinadi. Meros nima uchun zarur va u qanday imtiyozlarni beradi? Birinchidan, kodni qayta ishlatish. Ota-onalar sinflarida tasvirlangan maydonlar va usullar avlod sinflarida qo'llanilishi mumkin. Agar barcha turdagi avtomobillarda 10 ta umumiy maydon va 5 ta bir xil usul boʻlsa, ularni faqat ota-ona sinfiga qoʻyish kifoya Auto. Siz ularni hech qanday muammosiz avlod sinflarida ishlatishingiz mumkin. Qattiq afzalliklar: miqdoriy (kamroq kod) va natijada sifat jihatidan (sinflar ancha soddalashadi). Shu bilan birga, meros mexanizmi juda moslashuvchan va siz etishmayotgan funksiyalarni avlodlarga alohida qo'shishingiz mumkin (ba'zi maydonlar yoki ma'lum bir sinfga xos xatti-harakatlar). Umuman olganda, oddiy hayotda bo'lgani kabi: biz hammamiz ota-onamizga qaysidir ma'noda o'xshashmiz, lekin qaysidir jihatlari bilan ulardan farq qilamiz :)

2-tamoyil. Abstraktsiya

Bu juda oddiy printsip. Abstraktsiya ob'ektning asosiy, eng muhim xususiyatlarini ajratib ko'rsatishni va aksincha - ikkinchi darajali, ahamiyatsizlarini yo'q qilishni anglatadi. Keling, g'ildirakni qayta ixtiro qilmaylik va darslar haqidagi eski ma'ruzadan bir misolni eslaylik. Aytaylik, biz kompaniya xodimlarining fayllar kabinetini yaratamiz. Xodimlar ob'ektlarini yaratish uchun biz sinf yozdik Employee. Kompaniya faylida ularning tavsifi uchun qanday xususiyatlar muhim? To'liq ism, tug'ilgan sana, ijtimoiy sug'urta raqami, soliq identifikatsiya raqami. Ammo bu turdagi kartada uning bo'yi, ko'zlari va soch rangi kerak bo'lishi dargumon. Kompaniyaga xodim haqidagi bu ma'lumotlar kerak emas. Shuning uchun sinf uchun biz , , va , Employeeo'zgaruvchilarni o'rnatamiz va biz ko'z rangi kabi o'zimizga keraksiz ma'lumotlardan voz kechamiz va uni abstrakt qilamiz. Ammo agentlik uchun fotomodellar katalogini tuzadigan bo'lsak, vaziyat keskin o'zgaradi. Moda modelini tasvirlash uchun biz uchun balandlik, ko'z rangi va soch rangi juda muhim, ammo TIN raqami kerak emas. Shuning uchun sinfda biz , , o'zgaruvchilarni yaratamiz . String nameint ageint socialInsuranceNumberint taxNumberModelString heightString hairString eyes

3-tamoyil: Inkapsulyatsiya

Biz bunga allaqachon duch kelganmiz. Java-da inkapsulyatsiya ma'lumotlarga kirish va uni o'zgartirish imkoniyatini cheklashni anglatadi. Ko'rib turganingizdek, u "kapsula" so'ziga asoslangan. Ushbu "kapsula" da biz o'zimiz uchun muhim ma'lumotlarni yashiramiz, biz hech kimni o'zgartirishni xohlamaymiz. Hayotdan oddiy misol. Sizning ismingiz va familiyangiz bor. Siz bilgan hamma ularni biladi. Ammo ular sizning ismingiz va familiyangizni o'zgartirish huquqiga ega emaslar. Bu jarayon, deyish mumkinki, pasport idorasida "kapsullangan": u erda faqat ismingizni va familiyangizni o'zgartirishingiz mumkin va buni faqat siz qila olasiz. Boshqa "foydalanuvchilar" sizning ismingiz va familiyangizga faqat o'qish huquqiga ega :) Yana bir misol - sizning kvartirangizdagi pul. Ularni xonaning o'rtasida ko'rinadigan joyda qoldirish yaxshi fikr emas. Har qanday "foydalanuvchi" (uyingizga kelgan odam) sizning pulingiz raqamini o'zgartirishi mumkin, ya'ni. ularni oling. Ularni seyfga qo'yish yaxshiroqdir. Faqat siz va faqat maxsus kod bilan kirishingiz mumkin. Siz allaqachon ishlagan inkapsulyatsiyaning aniq misollari kirish modifikatorlari ( private, publicva hokazo) va getter-settersdir. Agar agesinf maydoni Catinkapsullanmagan bo'lsa, har kim yozishi mumkin:
Cat.age = -1000;
Va inkapsulyatsiya mexanizmi bizga maydonni agesozlash usuli bilan himoya qilish imkonini beradi, unda biz yoshning salbiy raqam bo'lishi mumkin emasligini tekshirishimiz mumkin.

4-tamoyil. Polimorfizm

Polimorfizm - bu bir nechta turlarga bir xil turdagi kabi munosabatda bo'lish qobiliyati. Bunday holda, ob'ektlarning xatti-harakati ular tegishli bo'lgan turga qarab farqlanadi. Biroz murakkab tuyuladimi? Keling, buni hozir aniqlaylik. Keling, eng oddiy misol - hayvonlarni olaylik. AnimalKeling, bitta usul bilan sinf yarataylik - voice(), va uning ikkita avlodi - Catva Dog.
public class Animal {

   public void voice() {

       System.out.println("Voice!");
   }
}

public class Dog extends Animal {


   @Override
   public void voice() {
       System.out.println("Bow-wow!");
   }
}

public class Cat extends Animal {

   @Override
   public void voice() {
       System.out.println("Meow!");
   }
}
AnimalKeling, havola yaratishga va unga ob'ekt belgilashga harakat qilaylik Dog.
public class Main {

   public static void main(String[] args) {

       Animal dog = new Dog();
       dog.voice();
   }
}
Sizningcha, qaysi usul chaqiriladi? Animal.voice()yoki Dog.voice()? Sinf usuli quyidagicha nomlanadi Dog: Woof-woof! Biz mos yozuvlar yaratdik Animal, lekin ob'ekt o'zini shunday tutadi Dog. Agar kerak bo'lsa, u mushuk, ot yoki boshqa hayvon kabi o'zini tutishi mumkin. Asosiysi, Animalma'lum bir avlod sinfining ob'ektiga umumiy turdagi havolani belgilash. Bu mantiqiy, chunki barcha itlar hayvonlardir. Biz "ob'ektlar qanday turiga qarab o'zini boshqacha tutadi" deganda nimani nazarda tutgan edik. Agar ob'ektni yaratadigan bo'lsak Cat-
public static void main(String[] args) {

   Animal cat = new Cat();
   cat.voice();
}
usul voice()"Miyav!" "Bir nechta turlar bilan bir xil turdagi kabi ishlash qobiliyati" nimani anglatadi? Bu ham ancha oson. Tasavvur qilaylik, biz hayvonlar uchun sartaroshxona yaratmoqdamiz. Bizning sartaroshxonamiz barcha hayvonlarni kesishga qodir bo'lishi kerak, shuning uchun biz kesadigan hayvon shear()parametri bilan usulni ("kesish") yaratamiz.Animal
public class AnimalBarbershop {

   public void shear(Animal animal) {

       System.out.println("The haircut is ready!");
   }
}
shearVa endi biz ob'ektlarni ham Cat, ob'ektlarni ham usulga o'tkazishimiz mumkin Dog!
public static void main(String[] args) {

   Cat cat = new Cat();
   Dog dog = new Dog();

   AnimalBarbershop barbershop = new AnimalBarbershop();

   barbershop.shear(cat);
   barbershop.shear(dog);
}
Mana yaqqol misol: sinf tiplar bilan xuddi bir turdagi kabi AnimalBarbershopishlaydi . Shu bilan birga, ular turli xil xatti-harakatlarga ega: ular o'z ovozlarini boshqacha ishlatishadi. CatDogCatDog

OOP paydo bo'lishining sabablari

Nima uchun bu yangi dasturlash kontseptsiyasi - OOP - paydo bo'ldi ? Dasturchilarda ishlaydigan vositalar bor edi: masalan, protsessual tillar. Ularni tubdan yangi narsani ixtiro qilishga nima undadi? Avvalo, ular oldida turgan vazifalarning murakkabligi. Agar 60 yil oldin dasturchining vazifasi “falon va shunga o‘xshash matematik tenglamani hisoblash”ga o‘xshagan bo‘lsa, endi bu “STALKER o‘yinining A, B, C, D o‘yin daqiqalarida foydalanuvchi qanday qarorlar qabul qilganiga qarab 7 xil yakunni amalga oshirish” kabi ko‘rinishi mumkin. , E, F va bu yechimlarning kombinatsiyasi." Ko'rib turganingizdek, so'nggi o'n yilliklarda vazifalar yanada murakkablashdi. Bu ma'lumotlar turlari murakkablashganini anglatadi. Bu OOP paydo bo'lishining yana bir sababidir. Tenglamali misol oddiy ibtidoiylar yordamida osonlikcha echilishi mumkin, bu erda hech qanday ob'ekt kerak emas. Ammo siz ixtiro qilgan ba'zi sinflardan foydalanmasdan o'yinning oxiri bilan bog'liq muammoni tasvirlash qiyin bo'ladi. Ammo shu bilan birga, uni sinflar va ob'ektlarda tasvirlash juda oson: bizga O'yin sinfi, Stalker sinfi, Ening sinfi, O'yinchining qarori sinfi, O'yin momenti sinfi va boshqalar kerak bo'ladi. Ya'ni, muammoni hal qilishni boshlamasdan ham, biz uning echimining "eskizlarini" boshimizda osongina tasavvur qilishimiz mumkin. Muammolarning ortib borayotgan murakkabligi dasturchilarni muammoni qismlarga ajratishga majbur qildi. Ammo protsessual dasturlashda bu unchalik oson emas edi. Va ko'pincha dastur uning ishlashi uchun barcha mumkin bo'lgan variantlarga ega bo'lgan bir nechta shoxlarning "darati" edi. Muayyan shartlarga qarab, dastur u yoki bu filial bo'ylab bajarildi. Kichik dasturlar uchun bu variant qulay edi, lekin katta vazifani qismlarga bo'lish juda qiyin edi. Bu ehtiyoj OOP paydo bo'lishining yana bir sababi bo'ldi. Ushbu kontseptsiya dasturchilarga dasturni har biri ishning o'ziga xos qismini bajaradigan bir nechta "modullar" ga bo'lish qobiliyatini berdi. Barcha ob'ektlar bir-biri bilan o'zaro ta'sirlashib, dasturimizning ishini tashkil qiladi. Bundan tashqari, biz yozgan kodni dasturning boshqa joylarida qayta ishlatish mumkin, bu ham ko'p vaqtni tejaydi.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION