JavaRush /Блоги Java /Random-TG /Принсипҳои OOP

Принсипҳои OOP

Дар гурӯҳ нашр шудааст
Java забони ба an object нигаронидашуда мебошад. Ин маънои онро дорад, ки шумо бояд барномаҳои Java-ро бо услуби ба an object нигаронидашуда нависед. Ва ин услуб ба истифодаи an objectҳо ва синфҳо дар барнома асос ёфтааст.

Принсипҳои асосии OOP:

Принсипҳои OOP - 1Биёед бо ёрии мисолҳо кӯшиш кунем, ки фаҳмем, ки синфҳо ва an objectҳо чӣ гунаанд, инчунин чӣ гуна принсипҳои асосии OOP дар амал татбиқ карда шаванд: абстраксия, мерос, полиморфизм ва инкапсуляция.

Объект чист?

Ҷаҳоне, ки мо дар он зиндагӣ мекунем, аз ашё иборат аст. Агар ба гирду атроф нигарем, мебинем, ки моро хонаҳо, дарахтон, мошинҳо, мебелҳо, зарфҳо, компютерҳо иҳота кардаанд. Њамаи ин ашёњо предметњо буда, њар кадоми онњо маљмўи хусусиятњо, рафтор ва маќсадњои хос доранд. Мо ба an objectҳо одат кардаем ва мо онҳоро ҳамеша барои мақсадҳои мушаххас истифода мебарем. Масалан, агар ба кор рафтан лозим бошад, мошинро истифода мебарем, агар хӯрок хӯрдан хоҳем, табақҳоро истифода мебарем ва агар истироҳат кардан лозим бошад, дивани бароҳат лозим аст. Одам одат кардааст, ки барои ҳалли масъалаҳои ҳаёти ҳаррӯза an objectивӣ фикр кунад. Ин яке аз сабабҳои истифодаи an objectҳо дар барномасозӣ буд ва ин равиши эҷоди барномаҳоро ба an object нигаронида номиданд. Як мисол меорем. Тасаввур кунед, ки шумо модели нави телефонро таҳия кардаед ва мехоҳед истеҳсоли оммавии онро оғоз кунед. Ҳамчун тарроҳи телефон, шумо медонед, ки он барои чӣ аст, он чӣ гуна кор мекунад ва аз кадом қисмҳо иборат аст (корпус, микрофон, баландгӯяк, симҳо, тугмаҳо ва ғайра). Аммо, танҳо шумо медонед, ки ин қисмҳоро чӣ гуна пайваст кардан лозим аст. Бо вуҷуди ин, шумо нақша надоред, ки телефонҳоро шахсан истеҳсол кунед; барои ин шумо тамоми ҳайати кормандон доред. Барои он ки шумо набояд ҳар дафъа фаҳмонед, ки чӣ тавр қисмҳои телефонро пайваст кунед ва то ҳамаи телефонҳои истеҳсолшуда якхела шаванд, пеш аз оғози истеҳсоли онҳо, шумо бояд дар шакли як расм кашед. тавсифи сохтори телефон. Дар OOP чунин тавсиф, расм, диаграмма ё қолаб класс номида мешавад, ки ҳангоми иҷрои барнома аз он an object сохта мешавад. Синф тавсифи an objectе мебошад, ки то ҳол сохта нашудааст, ба монанди қолаби умумӣ, ки аз майдонҳо, усулҳо ва созанда иборат аст ва an object намунаи синфест, ки дар асоси ин тавсиф сохта шудааст.

OOP абстраксия

Акнун биёед дар бораи он фикр кунем, ки чӣ тавр мо метавонем аз an objectи ҷаҳони воқеӣ ба an objectи барнома гузарем, телефонро ҳамчун мисол истифода барем. Таърихи ин воситаи иртибот зиёда аз 100 сол аст ва телефони муосир бар хилофи пешгузаштаи асри 19 як дастгоҳи хеле мураккабтар аст. Вақте ки мо телефонро истифода мебарем, мо дар бораи сохтор ва равандҳои дар дохor он рухдода фикр намекунем. Мо танҳо аз функсияҳои таҳиягарони телефон истифода мебарем - тугмаҳо ё экрани сенсорӣ барои интихоби рақам ва занг задан. Яке аз аввалин интерфейсҳои телефонӣ тугмае буд, ки шумо барои занг задан ба он рӯ овардаед. Албатта, ин чандон қулай набуд. Бо вучуди ин даста вазифаи худро дуруст ичро кард. Агар шумо ба телефони муосиртарин ва аввалин назар андозед, шумо метавонед дарҳол ҷузъиёти муҳимтаринро муайян кунед, ки ҳам барои дастгоҳи охири асри 19 ва ҳам барои смартфони ултра муосир муҳиманд. Ин занг задан (занидани рақам) ва қабули занг аст. Аслан, ин он чизест, ки телефонро телефон месозад, на чизи дигар. Ҳоло мо принсипро дар OOP татбиқ кардем - нишон додани хусусиятҳо ва иттилооти муҳимтарин дар бораи an object. Ин принсипи OOP абстраксия номида мешавад. Абстраксия дар OOP инчунин метавонад ҳамчун роҳи муаррифии унсурҳои мушкилоти ҷаҳони воқеӣ ҳамчун an objectҳо дар барнома муайян карда шавад. Абстраксия ҳамеша бо ҷамъбасти баъзе маълумот дар бораи хосиятҳои an objectҳо ё an objectҳо алоқаманд аст, бинобар ин чизи асосӣ ҷудо кардани иттилооти муҳим аз иттилооти ночиз дар заминаи масъалаи ҳалшаванда аст. Дар ин ҳолат, метавонад якчанд сатҳи абстраксия вуҷуд дошта бошад. Биёед кӯшиш кунем, ки принсипи абстраксияро дар телефонҳои худ татбиқ кунем. Аввалан, биёед намудҳои маъмултарини телефонҳоро аз замони аввал то имрӯз қайд кунем. Масалан, онхоро дар шакли диаграммае, ки дар расми 1 нишон дода шудааст, нишон додан мумкин аст. Принсипҳои OOP - 2Акнун бо ёрии абстраксия мо метавонем маълумоти умумиро дар ин иерархияи an objectхо кайд кунем: типи маъмули абстрактии an objectхо — телефон, характеристикаи умумии телефон - соли таъсиси он ва интерфейси умумӣ - ҳама телефонҳо қодиранд қабул ва ирсоли зангҳо. Ин аст он чизе ки дар Java ба назар мерасад:
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);
}
Дар асоси ин синфи абстрактӣ, мо метавонем намудҳои нави телефонҳоро дар барнома бо истифода аз дигар принсипҳои асосии Java OOP эҷод кунем, ки мо онҳоро дар зер баррасӣ хоҳем кард.

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

Бо ёрии абстраксия мо он чизеро, ки барои ҳама an objectҳо умумӣ аст, таъкид мекунем. Бо вуҷуди ин, ҳар як модели телефон инфиродист ва то андозае аз дигарон фарқ мекунад. Чӣ тавр мо метавонем дар барнома сарҳадҳо кашем ва ин фардиятро муайян кунем? Чӣ тавр мо метавонем боварӣ ҳосил кунем, ки ҳеҷ як аз корбарон тасодуфан ё дидаю дониста телефони моро шикаста наметавонад ё кӯшиш кунад, ки як моделро ба модели дигар табдил диҳад? Барои ҷаҳони ашёҳои воқеӣ ҷавоб равшан аст: шумо бояд ҳамаи қисмҳоро ба корпуси телефон гузоред. Дар ниҳоят, агар мо ин корро накунем ва тамоми даруни телефон ва симҳои пайвасткунандаи онҳоро берун гузорем, ҳатман як таҷрибаомӯзе пайдо мешавад, ки мехоҳад кори телефони моро "беҳтар кунад". Барои пешгирӣ кардани чунин дахолат дар тарҳрезӣ ва кори an object, OOP принсипи инкапсуляцияро истифода мебарад - принсипи дигари асосии OOP, ки дар он атрибутҳо ва рафтори an object дар як синф муттаҳид карда мешаванд, татбиқи дохorи an object аз истифодабаранда ва интерфейси кушода барои кор бо an object пешбинӣ шудааст. Вазифаи барномасоз муайян кардани он аст, ки кадом атрибутҳо ва усулҳо дастраси омма хоҳанд буд ва кадомашон татбиқи дохorи an object мебошанд ва набояд тағир дода шаванд.

Инкапсуляция ва назорати дастрасӣ

Фарз мекунем, ки ҳангоми истеҳсол маълумот дар бораи он дар қафои телефон кандакорӣ карда мешавад: соли истеҳсоли он ё логотипи ширкати истеҳсолкунанда. Ин маълумот ба таври мушаххас ин моделро тавсиф мекунад - ҳолати он. Мо метавонем бигӯем, ки таҳиягари телефон дар бораи тағирнопазирии ин маълумот ғамхорӣ кардааст - гумон аст, ки касе дар бораи нест кардани кандакорӣ фикр кунад. Дар ҷаҳони Java ҳолати an objectҳои оянда дар синф бо истифода аз майдонҳо ва рафтори онҳо бо истифода аз усулҳо тасвир карда мешавад. Қобorяти тағир додани ҳолат ва рафтор бо истифода аз тағирдиҳандаҳои дастрасӣ ба майдонҳо ва усулҳо - private, protected, public, ва default(дастрасии пешфарз) амалӣ карда мешавад. Масалан, мо тасмим гирифтем, ки соли офариниш, номи истеҳсолкунандаи телефон ва яке аз усулҳо ба татбиқи дохorи синф тааллуқ доранд ва онҳоро дигар an objectҳои барнома тағир додан мумкин нест. Бо истифода аз code, синфро ба таври зерин тавсиф кардан мумкин аст:
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("Дзынь-дзынь");
}

 }
Тағирдиҳанда privateмайдонҳо ва усулҳои синфро танҳо дар дохor он синф дастрас мекунад. Ин маънои онро дорад, ки privateмайдонҳоро аз берун дастрас кардан мумкин нест ва privateусулҳоро даъват кардан мумкин нест. Пинҳон кардани дастрасӣ ба усул openConnectionинчунин ба мо имкон медиҳад, ки татбиқи дохorи ин усулро озодона тағир диҳем, зеро ин усул кафолат дода мешавад, ки аз ҷониби дигар an objectҳо истифода нашаванд ва ба кори онҳо халал нарасонанд. Барои кор бо an objectи худ мо усулҳоро callбо истифода аз ringтағирдиҳанда кушода мемонем public. Таъмини усулҳои оммавӣ барои кор бо an object низ як қисми механизми инкапсуляция мебошад, зеро агар дастрасӣ ба an object комилан рад карда шавад, он бефоида мешавад.

Мерос

Биёед бори дигар ба диаграммаи телефон назар андозем. Шумо мебинед, ки он иерархияро ифода мекунад, ки дар он модели дар поён ҷойгиршуда дорои тамоми хусусиятҳои моделҳои дар шоха болотар ҷойгиршуда ва инчунин худаш мебошад. Масалан, смартфон барои муошират шабакаи мобorро истифода мебарад (хосиятҳои телефони мобилӣ дорад), бесим ва сайёр аст (хосиятҳои телефони бесим дорад) ва занг зада метавонад (хосиятҳои телефон дорад). Дар ин ҳолат, мо метавонем дар бораи мероси хосиятҳои an object сӯҳбат кунем. Дар барномасозӣ, мерос ин истифодаи синфҳои мавҷуда барои муайян кардани синфҳои нав мебошад. Биёед мисоли эҷоди синфи смартфонро бо истифода аз мерос дида бароем. Ҳама телефонҳои бесим бо батареяҳои барқгиранда кор мекунанд, ки мӯҳлати муайяни корӣ дар тӯли соат доранд. Пас биёед ин амволро ба синфи телефонҳои бесим илова кунем:
public abstract class WirelessPhone extends AbstractPhone {

    private int hour;

    public WirelessPhone(int year, int hour) {
        super(year);
        this.hour = hour;
    }
    }
Телефонҳои мобилӣ хосиятҳои телефони бесимро мерос мегиранд, мо инчунин ба ин синф татбиқ callва усулҳоро илова кардем 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);
    }
}
Ва ниҳоят, синфи смартфон, ки бар хилофи телефонҳои мобorи классикӣ, дорои системаи оператсионии мукаммал аст. Шумо метавонед барномаҳои наверо, ки ин системаи оператсионӣ дастгирӣ мекунад, ба смартфони худ илова кунед ва ҳамин тавр, функсияи онро васеъ кунед. Бо истифода аз code, синфро ба таври зерин тавсиф кардан мумкин аст:
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);
}

}
Тавре ки шумо мебинед, Smartphoneмо барои тавсифи синф хеле кам рамзи нав эҷод кардем, аммо мо синфи нав бо функсияҳои нав гирифтем. Истифодаи принсипи мероси OOP метавонад миқдори codeро ба таври назаррас коҳиш диҳад ва аз ин рӯ кори барномасозро осонтар кунад.

Полиморфизм

Агар мо ба ҳамаи моделҳои телефон назар кунем, пас, сарфи назар аз фарқиятҳои намуди зоҳирӣ ва тарҳрезии моделҳо, мо метавонем баъзе рафтори маъмулиро дар онҳо муайян кунем - ҳамаи онҳо метавонанд занг зананд ва қабул кунанд ва маҷмӯи хеле равшан ва оддии тугмаҳои идоракуниро доранд. Бо истифода аз яке аз принсипҳои асосии OOP, ки аллакай ба мо маълум аст, абстраксия дар истилоҳи барномасозӣ, мо метавонем бигӯем, ки an objectи телефон як интерфейси умумӣ дорад. Аз ин рӯ, корбарони телефон метавонанд бо истифода аз як тугмаҳои идоракунӣ (механикӣ ё ламсӣ) бидуни ворид шудан ба ҷузъиёти техникии дастгоҳ моделҳои гуногунро истифода баранд. Ҳамин тавр, шумо ҳамеша аз телефони мобилӣ истифода мебаред ва шумо метавонед ба осонӣ аз ҳамтои худ занг занед. Принсип дар OOP, вақте ки барнома метавонад an objectҳои дорои интерфейси якхеларо бидуни маълумот дар бораи сохтори дохorи an object истифода барад, полиморфизм номида мешавад . Тасаввур кунем, ки дар барномаи мо мо бояд корбареро тавсиф кунем, ки метавонад бо ягон модели телефон барои занг задан ба корбари дигар истифода кунад. Инро чӣ тавр кардан мумкин аст:
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);
    }
}
 }
Акнун биёед моделҳои гуногуни телефонро тавсиф кунем. Яке аз аввалин моделҳои телефон:
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");
    }
}
Телефони муқаррарӣ:
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");
    }
}
Ва ниҳоят, телефони видеоии аҷиб:
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);
    }
  }
Биёед an objectҳоро дар усул эҷод кунем main()ва усулро санҷем 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
Бо даъват кардани як усул дар an object user, мо натиҷаҳои гуногун гирифтем. Интихоби татбиқи усули мушаххас callдар дохor усул callAnotherUserдар асоси намуди мушаххаси an objectи даъватшаванда ҳангоми иҷрои барнома ба таври динамикӣ анҷом дода мешавад. Ин бартарии асосии полиморфизм - интихоби татбиқ ҳангоми иҷрои барнома мебошад. Дар мисолҳои синфҳои телефонии дар боло овардашуда, мо методро бартарӣ доданро истифода бурдем, ки усули амалисозии дар синфи асосӣ муайяншударо бидуни тағир додани имзои метод тағир медиҳад. Ин аслан иваз кардани метод аст ва он усули навест, ки дар зерсинф муайян карда мешавад, ки ҳангоми иҷрои барнома даъват карда мешавад. Одатан, ҳангоми бекор кардани усул, эзоҳ истифода мешавад @Override, ки ба компилятор мегӯяд, ки имзоҳои усулҳои бекоршуда ва бекоркуниро тафтиш кунад. Дар натиҷа , боварӣ ҳосил кунед, ки услуби барномаи шумо ба консепсияи OOP ва принсипҳои java OOP мувофиқат кунад, ин маслиҳатҳоро иҷро кунед:
  • хосиятҳои асосии an objectро нишон диҳед;
  • хосиятҳо ва рафтори умумиро қайд кунед ва ҳангоми сохтани an objectҳо меросро истифода баред;
  • истифода бурдани намудҳои абстрактӣ барои тавсифи an objectҳо;
  • Кӯшиш кунед, ки ҳамеша усулҳо ва майдонҳои марбут ба татбиқи дохorи синфро пинҳон кунед.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION