JavaRush /Java blogi /Random-UZ /OOP tamoyillari

OOP tamoyillari

Guruhda nashr etilgan
Java - bu ob'ektga yo'naltirilgan til. Bu shuni anglatadiki, Java dasturlarini ob'ektga yo'naltirilgan uslubdan foydalanib yozishingiz kerak. Va bu uslub dasturda ob'ektlar va sinflardan foydalanishga asoslangan.

OOPning asosiy tamoyillari:

OOP tamoyillari - 1Keling, misollar yordamida sinflar va ob'ektlar nima ekanligini, shuningdek, OOP ning asosiy tamoyillarini amalda qanday qo'llashni tushunishga harakat qilaylik: abstraktsiya, meros, polimorfizm va inkapsulyatsiya.

Ob'ekt nima?

Biz yashayotgan dunyo ob'ektlardan iborat. Atrofga nazar tashlasak, bizni uylar, daraxtlar, mashinalar, mebellar, idish-tovoqlar, kompyuterlar o'rab olganini ko'ramiz. Bu ob'ektlarning barchasi ob'ektlar bo'lib, ularning har biri o'ziga xos xususiyatlar, xatti-harakatlar va maqsadlarga ega. Biz ob'ektlarga o'rganib qolganmiz va biz ulardan har doim juda aniq maqsadlarda foydalanamiz. Masalan, ishga borishimiz kerak bo'lsa, mashinadan foydalanamiz, ovqatlanmoqchi bo'lsak, idish-tovoqdan foydalanamiz, dam olishimiz kerak bo'lsa, qulay divan kerak. Inson kundalik hayotdagi muammolarni hal qilish uchun ob'ektiv fikrlashga odatlangan. Bu dasturlashda ob'ektlardan foydalanishning sabablaridan biri edi va dasturlarni yaratishga bunday yondashuv ob'ektga yo'naltirilgan deb nomlandi. Keling, misol keltiraylik. Tasavvur qiling-a, siz yangi telefon modelini ishlab chiqdingiz va uni ommaviy ishlab chiqarishni yo'lga qo'ymoqchisiz. Telefon dizayneri sifatida siz u nima uchun ekanligini, qanday ishlashini va qanday qismlardan iboratligini bilasiz (g'ilof, mikrofon, dinamik, simlar, tugmalar va boshqalar). Biroq, bu qismlarni qanday ulashni faqat siz bilasiz. Biroq, siz telefonlarni shaxsan ishlab chiqarishni rejalashtirmayapsiz, buning uchun sizda butun xodimlar mavjud. Telefon qismlarini qanday ulash kerakligini har safar tushuntirib o'tirmasligingiz uchun va ishlab chiqarilayotgan barcha telefonlar bir xil bo'lib chiqishi uchun ularni ishlab chiqarishni boshlashdan oldin, siz telefon shaklida chizma chizishingiz kerak bo'ladi. telefon tuzilishi tavsifi. OOPda bunday tavsif, chizma, diagramma yoki shablon sinf deb ataladi, undan dastur bajarilganda ob'ekt yaratiladi. Sinf - maydonlar, usullar va konstruktordan iborat umumiy shablon kabi hali yaratilmagan ob'ektning tavsifi va ob'ekt - bu tavsif asosida yaratilgan sinfning namunasidir.

OOP abstraktsiyasi

Keling, telefonni misol qilib, real dunyodagi ob'ektdan dasturdagi ob'ektga qanday o'tishimiz mumkinligi haqida o'ylab ko'raylik. Ushbu aloqa vositasining tarixi 100 yildan oshadi va zamonaviy telefon, 19-asrdagi avvalgisidan farqli o'laroq, ancha murakkab qurilma. Telefondan foydalanganda biz uning tuzilishi va uning ichida sodir bo'ladigan jarayonlar haqida o'ylamaymiz. Raqamni tanlash va qo'ng'iroq qilish uchun biz telefon ishlab chiquvchilari tomonidan taqdim etilgan funksiyalardan - tugmalar yoki sensorli ekrandan foydalanamiz. Birinchi telefon interfeyslaridan biri siz qo'ng'iroq qilish uchun aylantirgan tugma edi. Albatta, bu juda qulay emas edi. Shunga qaramay, tutqich o'z vazifasini to'g'ri bajardi. Agar siz eng zamonaviy va eng birinchi telefonni ko'rsangiz, 19-asr oxiridagi qurilma uchun ham, ultra zamonaviy smartfon uchun ham muhim bo'lgan eng muhim tafsilotlarni darhol aniqlashingiz mumkin. Bu qo'ng'iroq qilish (raqamni terish) va qo'ng'iroqni qabul qilish. Aslida, bu telefonni boshqa narsa emas, balki telefon qiladi. Endi biz OOPda printsipni qo'lladik - ob'ekt haqidagi eng muhim xususiyatlar va ma'lumotlarni ajratib ko'rsatish. OOP ning ushbu printsipi abstraktsiya deb ataladi. OOPda abstraktsiyani real muammoning elementlarini dasturdagi ob'ektlar sifatida ko'rsatish usuli sifatida ham aniqlash mumkin. Abstraktsiya har doim ob'ektlar yoki ob'ektlarning xususiyatlari to'g'risidagi ba'zi ma'lumotlarni umumlashtirish bilan bog'liq, shuning uchun asosiy narsa hal qilinayotgan muammo kontekstida muhim ma'lumotni ahamiyatsiz ma'lumotlardan ajratishdir. Bunday holda, abstraktsiyaning bir necha darajalari bo'lishi mumkin. Keling, mavhumlik tamoyilini telefonlarimizga qo'llashga harakat qilaylik. Birinchidan, birinchidan hozirgi kungacha eng keng tarqalgan telefon turlarini ajratib ko'rsatamiz. Masalan, ularni 1-rasmda ko'rsatilgan diagramma shaklida tasvirlash mumkin.Endi OOP tamoyillari - 2abstraksiya yordamida ob'ektlarning ushbu ierarxiyasidagi umumiy ma'lumotlarni ajratib ko'rsatishimiz mumkin: ob'ektlarning umumiy mavhum turi - telefon, umumiy xarakteristikasi. telefon - yaratilgan yil va umumiy interfeys - barcha telefonlar qo'ng'iroqlarni qabul qilish va yuborish imkoniyatiga ega. Bu Java-da qanday ko'rinishga ega:
public abstract class AbstractPhone {
    private int year;

    public AbstractPhone(int year) {
        this.year = year;
    }
    public abstract void call(int outputNumber);
    public abstract void ring (int inputNumber);
}
Ushbu mavhum sinfga asoslanib, biz boshqa asosiy Java OOP tamoyillaridan foydalangan holda dasturda yangi turdagi telefonlarni yaratishimiz mumkin, biz ularni quyida ko'rib chiqamiz.

Inkapsulyatsiya

Abstraktsiya yordamida biz barcha ob'ektlar uchun umumiy bo'lgan narsani ajratib ko'rsatamiz. Biroq, har bir telefon modeli individualdir va boshqalardan biroz farq qiladi. Qanday qilib dasturda chegaralarni chizishimiz va bu individuallikni belgilashimiz mumkin? Qanday qilib foydalanuvchilarning hech biri bizning telefonimizni tasodifan yoki qasddan sindira olmasligiga yoki bir modelni boshqasiga o'tkazishga urinmasligiga qanday ishonch hosil qilishimiz mumkin? Haqiqiy ob'ektlar dunyosi uchun javob aniq: siz barcha qismlarni telefon korpusiga qo'yishingiz kerak. Axir, agar biz buni qilmasak va telefonning barcha ichki qismlarini va ularni bog'laydigan simlarni tashqarida qoldirsak, telefonimiz ishini "yaxshilamoqchi" bo'lgan qiziquvchan eksperimentator albatta paydo bo'ladi. Ob'ektni loyihalash va ishlatishda bunday aralashuvni oldini olish uchun OOP inkapsulyatsiya printsipidan foydalanadi - OOP ning yana bir asosiy printsipi, unda ob'ektning atributlari va xatti-harakatlari bir sinfda birlashtirilgan, ob'ektning ichki amalga oshirilishi yashiringan. foydalanuvchi va ob'ekt bilan ishlash uchun ochiq interfeys taqdim etiladi. Dasturchining vazifasi qaysi atributlar va usullar ommaga ochiq bo'lishini va qaysi biri ob'ektning ichki ilovalari ekanligini va ularni o'zgartirmaslik kerakligini aniqlashdan iborat.

Inkapsulyatsiya va kirishni boshqarish

Aytaylik, ishlab chiqarish jarayonida bu haqda ma'lumot telefonning orqa tomoniga o'yib yozilgan: ishlab chiqarilgan yili yoki ishlab chiqaruvchi kompaniyasining logotipi. Ushbu ma'lumot ushbu modelni - uning holatini aniq tavsiflaydi. Aytishimiz mumkinki, telefon ishlab chiqaruvchisi ushbu ma'lumotlarning o'zgarmasligi haqida g'amxo'rlik qilgan - gravyurani olib tashlash haqida hech kim o'ylamasligi dargumon. Java dunyosida kelajakdagi ob'ektlarning holati maydonlar yordamida sinfda tasvirlangan va ularning xatti-harakati usullar yordamida tasvirlangan. Holat va xatti-harakatlarni o'zgartirish qobiliyati maydonlar va usullarga kirish modifikatorlari yordamida amalga oshiriladi - private, protected, public, va default(standart kirish). Misol uchun, biz yaratilgan yil, telefon ishlab chiqaruvchisi nomi va usullardan biri sinfning ichki amalga oshirilishiga tegishli va dasturdagi boshqa ob'ektlar tomonidan o'zgartirilmasligiga qaror qildik. Koddan foydalanib, sinfni quyidagicha ta'riflash mumkin:
public class SomePhone {

    private int year;
    private String company;
    public SomePhone(int year, String company) {
        this.year = year;
        this.company = company;
    }
private void openConnection(){
    //findComutator
    //openNewConnection...
}
public void call() {
    openConnection();
    System.out.println("I'm calling a number");
}

public void ring() {
    System.out.println("Дзынь-дзынь");
}

 }
Modifikator privatesinfning maydonlari va usullarini faqat shu sinf ichida mavjud qiladi. Bu shuni anglatadiki, privatemaydonlarga tashqaridan kirish mumkin emas va privateusullarni chaqirib bo'lmaydi. Usulga kirishni yashirish openConnectionbizga ushbu usulning ichki amalga oshirilishini erkin o'zgartirish imkoniyatini ham qoldiradi, chunki bu usul boshqa ob'ektlar tomonidan ishlatilmasligi kafolatlanadi va ularning ishlashini buzmaydi. Obyektimiz bilan ishlash uchun modifikator callyordamida usullarni ochiq qoldiramiz . Ob'ekt bilan ishlashning ommaviy usullarini ta'minlash ham inkapsulyatsiya mexanizmining bir qismidir, chunki ob'ektga kirish butunlay rad etilsa, u foydasiz bo'lib qoladi.ringpublic

Meros olish

Keling, telefon jadvaliga yana qaraylik. Ko'rinib turibdiki, u ierarxiyani ifodalaydi, unda quyida joylashgan model filialda yuqoriroqda joylashgan modellarning barcha xususiyatlariga va o'ziga xos xususiyatlarga ega. Misol uchun, smartfon aloqa uchun uyali tarmoqdan foydalanadi (uyali telefon xususiyatlariga ega), simsiz va portativ (simsiz telefon xususiyatlariga ega), qo'ng'iroqlarni qabul qilishi va amalga oshirishi mumkin (telefon xususiyatlariga ega). Bunday holda, ob'ekt xususiyatlarini meros qilib olish haqida gapirish mumkin. Dasturlashda meros - yangilarini aniqlash uchun mavjud sinflardan foydalanish. Merosdan foydalangan holda smartfon sinfini yaratish misolini ko'rib chiqaylik. Barcha simsiz telefonlar qayta zaryadlanuvchi batareyalar bilan ishlaydi, ular soatlarda ma'lum ishlash muddatiga ega. Keling, ushbu xususiyatni simsiz telefonlar sinfiga qo'shamiz:
public abstract class WirelessPhone extends AbstractPhone {

    private int hour;

    public WirelessPhone(int year, int hour) {
        super(year);
        this.hour = hour;
    }
    }
Uyali telefonlar simsiz telefonning xususiyatlarini meros qilib oladi, shuningdek, biz ushbu sinfga callva usullarini amalga oshirishni qo'shdik ring:
public class CellPhone extends WirelessPhone {
    public CellPhone(int year, int hour) {
        super(year, hour);
    }

    @Override
    public void call(int outputNumber) {
        System.out.println("Calling a number" + outputNumber);
    }

    @Override
    public void ring(int inputNumber) {
        System.out.println("A subscriber is calling you" + inputNumber);
    }
}
Va nihoyat, klassik mobil telefonlardan farqli o'laroq, to'liq operatsion tizimga ega bo'lgan smartfonlar sinfi. Siz ushbu operatsion tizim tomonidan qo'llab-quvvatlanadigan yangi dasturlarni smartfoningizga qo'shishingiz mumkin, shu bilan uning funksionalligini kengaytirasiz. Koddan foydalanib, sinfni quyidagicha ta'riflash mumkin:
public class Smartphone extends CellPhone {

    private String operationSystem;

    public Smartphone(int year, int hour, String operationSystem) {
        super(year, hour);
        this.operationSystem = operationSystem;
    }
public void install(String program){
    System.out.println("Installing" + program + "For" + operationSystem);
}

}
Ko'rib turganingizdek, Smartphonebiz sinfni tavsiflash uchun juda kam yangi kod yaratdik, ammo bizda yangi funksiyalarga ega yangi sinf mavjud. OOP meros tamoyilidan foydalanish kod miqdorini sezilarli darajada kamaytirishi mumkin va shuning uchun dasturchining ishini osonlashtiradi.

Polimorfizm

Agar biz barcha telefon modellarini ko'rib chiqsak, modellarning tashqi ko'rinishi va dizaynidagi farqlarga qaramay, biz ulardagi ba'zi umumiy xatti-harakatlarni aniqlashimiz mumkin - ularning barchasi qo'ng'iroqlarni qabul qilishi va amalga oshirishi va juda aniq va oddiy boshqaruv tugmalari to'plamiga ega. Bizga allaqachon ma'lum bo'lgan OOP ning asosiy tamoyillaridan birini dasturlash nuqtai nazaridan abstraksiyani qo'llagan holda, telefon ob'ekti bitta umumiy interfeysga ega ekanligini aytishimiz mumkin. Shu sababli, telefon foydalanuvchilari qurilmaning texnik tafsilotlariga kirmasdan, bir xil boshqaruv tugmalari (mexanik yoki sensorli) yordamida turli modellardan juda qulay foydalanishlari mumkin. Shunday qilib, siz doimiy ravishda uyali telefondan foydalanasiz va uning statsionar hamkasbidan osongina qo'ng'iroq qilishingiz mumkin. Dastur bir xil interfeysga ega ob'ektlardan ob'ektning ichki tuzilishi haqida ma'lumotsiz foydalanishi mumkin bo'lgan OOP printsipi polimorfizm deb ataladi . Tasavvur qilaylik, bizning dasturimizda boshqa foydalanuvchiga qo'ng'iroq qilish uchun istalgan telefon modelidan foydalana oladigan foydalanuvchini tasvirlashimiz kerak. Buni qanday qilish kerak:
public class User {
    private String name;

    public User(String name) {
        this.name = name;
            }

    public void callAnotherUser(int number, AbstractPhone phone){
// here it is polymorphism - using the abstract type AbstractPhone phone in the code!
        phone.call(number);
    }
}
 }
Keling, turli xil telefon modellarini tasvirlab beraylik. Birinchi telefon modellaridan biri:
public class ThomasEdisonPhone extends AbstractPhone {

public ThomasEdisonPhone(int year) {
    super(year);
}
    @Override
    public void call(int outputNumber) {
        System.out.println("Turn the Handle");
        System.out.println("Give me the phone number, sir");
    }

    @Override
    public void ring(int inputNumber) {
        System.out.println("Phone calls");
    }
}
Oddiy statsionar telefon:
public class Phone extends AbstractPhone {

    public Phone(int year) {
        super(year);
    }

    @Override
    public void call(int outputNumber) {
        System.out.println("I'm calling a number" + outputNumber);
    }

    @Override
    public void ring(int inputNumber) {
        System.out.println("Phone calls");
    }
}
Va nihoyat, ajoyib video telefon:
public class VideoPhone extends AbstractPhone {

    public VideoPhone(int year) {
        super(year);
    }
    @Override
    public void call(int outputNumber) {
        System.out.println("I connect a video channel for the subscriber" + outputNumber );
    }
    @Override
    public void ring(int inputNumber) {
        System.out.println("You have an incoming video call..." + inputNumber);
    }
  }
Keling, usulda ob'ektlar yaratamiz main()va usulni sinab ko'ramiz callAnotherUser:
AbstractPhone firstPhone = new ThomasEdisonPhone(1879);
AbstractPhone phone = new Phone(1984);
AbstractPhone videoPhone=new VideoPhone(2018);
User user = new User("Andrey");
user.callAnotherUser(224466,firstPhone);
// Rotate the knob
// Tell me the number of the subscriber, sir
user.callAnotherUser(224466,phone);
//Call number 224466
user.callAnotherUser(224466,videoPhone);
//I connect the video channel for subscriber 224466
Ob'ektda bir xil usulni chaqirib user, biz turli xil natijalarga erishdik. callUsul doirasida muayyan usulni amalga oshirishni tanlash callAnotherUserdasturni bajarish jarayonida chaqiruvchi ob'ektning o'ziga xos turiga qarab dinamik ravishda amalga oshirildi. Bu polimorfizmning asosiy afzalligi - dasturni bajarish jarayonida amalga oshirishni tanlash. Yuqoridagi telefon klassi misollarida biz metodni bekor qilish usulidan foydalandik, bu usulning imzosini o'zgartirmasdan, asosiy sinfda belgilangan usulni amalga oshirishni o'zgartiradigan usul. Bu mohiyatan usulni almashtirish bo'lib, dastur ishga tushganda chaqiriladigan kichik sinfda aniqlangan yangi usul. Odatda, usulni bekor qilishda annotatsiya ishlatiladi @Override, bu kompilyatorga bekor qilingan va bekor qilingan usullarning imzolarini tekshirishni aytadi. Natijada , dasturingiz uslubi OOP kontseptsiyasi va OOP java tamoyillariga mos kelishini ta'minlash uchun quyidagi maslahatlarga amal qiling:
  • ob'ektning asosiy xususiyatlarini ajratib ko'rsatish;
  • ob'ektlarni yaratishda umumiy xususiyatlar va xatti-harakatlarni ajratib ko'rsatish va merosdan foydalanish;
  • ob'ektlarni tasvirlash uchun mavhum turlardan foydalanish;
  • Sinfni ichki amalga oshirish bilan bog'liq usullar va maydonlarni har doim yashirishga harakat qiling.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION