JavaRush /Java блогы /Random-KK /OOP принциптері

OOP принциптері

Топта жарияланған
Java – an objectіге бағытталған тіл. Бұл an objectілі-бағытталған стильді пайдаланып Java бағдарламаларын жазу керек дегенді білдіреді. Ал бұл стиль бағдарламада an objectілер мен класстарды пайдалануға негізделген.

OOP негізгі принциптері:

OOP принциптері – 1Мысалдардың көмегімен қандай сыныптар мен an objectілер екенін, сондай-ақ OOP негізгі принциптерін тәжірибеде қалай қолдануға болатынын түсінуге тырысайық: абстракция, мұрагерлік, полиморфизм және инкапсуляция.

Объект дегеніміз не?

Біз өмір сүріп жатқан әлем заттардан тұрады. Айналамызға қарасақ, айналамызда үйлер, ағаштар, көліктер, жиһаздар, ыдыс-аяқтар, компьютерлер бар. Бұл заттардың барлығы an objectілер болып табылады және олардың әрқайсысының белгілі бір сипаттамалары, мінез-құлқы және мақсаты бар. Біз an objectілерге үйреніп қалғанбыз және біз оларды әрқашан өте нақты мақсаттарда қолданамыз. Мысалы, жұмысқа бару керек болса, көлікті, тамақтанғымыз келсе, ыдыс-аяқты пайдаланамыз, ал демалу керек болса, ыңғайлы диван қажет. Адам күнделікті өмірдегі мәселелерді шешу үшін an objectивті ойлауға дағдыланған. Бұл программалауда an objectілерді пайдалану себептерінің бірі болды және бағдарламаларды құрудың бұл тәсілі an objectілі-бағытталған деп аталды. Мысал келтірейік. Сіз жаңа телефон үлгісін жасап шығардыңыз және оның жаппай өндірісін іске қосқыңыз келеді деп елестетіңіз. Телефон дизайнері ретінде сіз оның не үшін екенін, қалай жұмыс істейтінін және қандай бөліктерден тұратынын білесіз (корпус, микрофон, динамик, сымдар, түймелер және т.б.). Дегенмен, бұл бөліктерді қалай қосу керектігін сіз ғана білесіз. Дегенмен, сіз телефондарды жеке өндіруді жоспарламайсыз, бұл үшін сізде қызметкерлердің толық құрамы бар. Телефонның бөліктерін қалай қосу керектігін әр уақытта түсіндіріп жатпау үшін және өндірістегі барлық телефондар бірдей болып шығуы үшін, оларды шығаруды бастамас бұрын, сізге сызба түрінде сурет салу қажет болады. телефон құрылымының сипаттамасы. OOP-те мұндай сипаттама, сызба, диаграмма немесе шаблон класс деп аталады, одан бағдарлама орындалған кезде an object құрылады. Класс - өрістерден, әдістерден және конструктордан тұратын жалпы үлгі сияқты әлі жасалмаған an objectінің сипаттамасы, ал an object - осы сипаттама негізінде жасалған класс данасы.

OOP абстракциясы

Енді телефонды мысалға ала отырып, нақты әлемдегі нысаннан бағдарламадағы нысанға қалай өтуге болатынын ойластырайық. Бұл байланыс құралының тарихы 100 жылдан асады және қазіргі телефон 19-ғасырдағы бұрынғы телефоннан айырмашылығы, әлдеқайда күрделі құрылғы. Біз телефонды пайдаланған кезде оның құрылымы мен оның ішінде болып жатқан процестер туралы ойламаймыз. Нөмірді таңдау және қоңырау шалу үшін телефон әзірлеушілері ұсынатын функцияларды – түймелерді немесе сенсорлық экранды ғана пайдаланамыз. Алғашқы телефон интерфейстерінің бірі қоңырау шалу үшін бұрылған түйме болды. Әрине, бұл өте ыңғайлы емес еді. Соған қарамастан, тұтқа өз қызметін дұрыс атқарды. Ең заманауи және ең алғашқы телефонды қарасаңыз, 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ілерге ортақ нәрсені ерекшелейміз. Дегенмен, әрбір телефон моделі жеке және басқалардан біршама ерекшеленеді. Бағдарламада шекараны қалай сызып, осы даралықты белгілей аламыз? Пайдаланушылардың ешқайсысы телефонымызды кездейсоқ немесе әдейі бұза алмайтынына немесе бір модельді екіншісіне түрлендіруге тырыспайтынына қалай көз жеткізуге болады? Нақты нысандар әлемі үшін жауап анық: телефонның корпусына барлық бөлшектерді салу керек. Ақыр соңында, егер біз мұны жасамасақ және телефонның барлық ішкі бөліктерін және оларды байланыстыратын сымдарды сыртында қалдырмасақ, біздің телефонның жұмысын «жақсартқысы» келетін ізденімпаз экспериментатор болады. Объектінің дизайны мен жұмысына мұндай араласуды болдырмау үшін OOP инкапсуляция принципін қолданады - an objectінің атрибуттары мен мінез-құлқы бір сыныпта біріктірілетін, an objectінің ішкі іске асырылуы жасырын болатын OOP-тың тағы бір негізгі принципі. пайдаланушы және нысанмен жұмыс істеу үшін ашық интерфейс беріледі. Бағдарламалаушының жұмысы – қандай атрибуттар мен әдістер жалпыға қолжетімді болатынын және қайсысы an objectінің ішкі іске асырылуы және өзгертілмеуі керектігін анықтау.

Инкапсуляция және қол жеткізуді басқару

Өндіріс кезінде ол туралы ақпарат телефонның артқы жағында ойып жазылған делік: шығарылған жылы немесе өндіруші компанияның логотипі. Бұл ақпарат осы модельді - оның жағдайын нақты сипаттайды. Телефон әзірлеушісі бұл ақпараттың өзгермейтіндігіне қамқорлық жасады деп айта аламыз - гравюраны жою туралы ешкім ойламауы екіталай. Java әлемінде болашақ an objectілердің күйі өрістер арқылы сыныпта сипатталады, ал олардың әрекеті әдістер арқылы сипатталады. Күй мен мінез-құлықты өзгерту мүмкіндігі өрістер мен әдістерге кіру модификаторлары арқылы жүзеге асырылады - private, protected, public, және default(әдепкі қатынас). Мысалы, біз жасалған жылы, телефон өндірушісінің атауы және әдістердің бірі сыныптың ішкі іске асыруына жатады және бағдарламадағы басқа нысандар арқылы өзгертілмейді деп шештік. Кодты пайдалана отырып, сыныпты келесідей сипаттауға болады:
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сыныптың өрістері мен әдістерін тек сол сынып ішінде қолжетімді етеді. privateБұл өрістерге сырттан кіруге болмайтынын және privateәдістерді шақыруға болмайтынын білдіреді . Әдіске қол жеткізуді жасыру openConnectionбізге осы әдістің ішкі іске асырылуын еркін өзгерту мүмкіндігін береді, өйткені бұл әдіс басқа нысандармен пайдаланылмауға кепілдік беріледі және олардың жұмысын бұзбайды. Объектімізбен жұмыс істеу үшін модификатор callарқылы әдістерді ашық қалдырамыз . Объектімен жұмыс істеудің жалпы әдістерін ұсыну да инкапсуляция механизмінің бөлігі болып табылады, өйткені an objectіге кіруге толық тыйым салынса, ол пайдасыз болады.ringpublic

Мұрагерлік

Телефон диаграммасына тағы да назар аударайық. Оның иерархияны білдіретінін көруге болады, онда төменде орналасқан үлгі тармақта жоғары орналасқан үлгілердің барлық сипаттамаларына және өзінің жеке сипаттамаларына ие. Мысалы, смартфон байланыс үшін ұялы желіні пайдаланады (ұялы телефонға тән қасиеттерге ие), сымсыз және портативті (сымсыз телефон қасиеттеріне ие), қоңырауларды қабылдап, соға алады (телефон қасиеттері бар). Бұл жағдайда 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);
    }
}
Ақырында, классикалық ұялы телефондардан айырмашылығы, толыққанды операциялық жүйесі бар смартфондар класы. Осы операциялық жүйе қолдайтын жаңа бағдарламаларды смартфонға қосып, оның функционалдығын кеңейте аласыз. Кодты пайдалана отырып, сыныпты келесідей сипаттауға болады:
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біз сыныпты сипаттау үшін өте аз жаңа code жасадық, бірақ жаңа функционалдығы бар жаңа сынып алдық. OOP мұрагерлік принципін пайдалану codeтың көлемін айтарлықтай азайтуы мүмкін, сондықтан бағдарламашының жұмысын жеңілдетеді.

Полиморфизм

Егер біз барлық телефон үлгілерін қарастыратын болсақ, онда модельдердің сыртқы түрі мен дизайнындағы айырмашылықтарға қарамастан, біз олардағы кейбір жалпы мінез-құлықты анықтай аламыз - олардың барлығы қоңырауларды қабылдап, қабылдай алады және басқару түймелерінің жеткілікті анық және қарапайым жиынтығына ие. Бізге бұрыннан белгілі OOP негізгі принциптерінің бірін бағдарламалау терминдерінде абстракцияны қолдана отырып, телефон an objectісінің бір ортақ интерфейсі бар деп айтуға болады. Сондықтан телефон пайдаланушылары құрылғының техникалық бөлшектеріне кірмей-ақ бірдей басқару түймелерін (механикалық немесе сенсорлық) пайдаланып әртүрлі модельдерді өте ыңғайлы пайдалана алады. Осылайша, сіз үнемі ұялы телефонды пайдаланасыз және оның стационарлық әріптесінен оңай қоңырау шала аласыз. Бағдарлама an objectінің ішкі құрылымы туралы ақпаратсыз бірдей интерфейсі бар an objectілерді пайдалана алатын OOP принципі полиморфизм деп аталады . Біздің бағдарламамызда басқа пайдаланушыға қоңырау шалу үшін кез келген телефон үлгісін пайдалана алатын пайдаланушыны сипаттау керек деп елестетіп көрейік. Мұны қалай істеу керек:
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);
    }
  }
Әдісте нысандарды жасап 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
Нысан бойынша бірдей әдісті шақыру арқылы userбіз әртүрлі нәтижелерге қол жеткіздік. callӘдіс ішінде нақты әдісті іске асыруды таңдау callAnotherUserбағдарламаны орындау кезінде шақырылатын an objectінің нақты түріне негізделген динамикалық түрде жасалды. Бұл полиморфизмнің басты артықшылығы – бағдарламаны орындау кезінде іске асыруды таңдау. Жоғарыдағы телефон сыныбының мысалдарында әдіс қолтаңбасын өзгертпей, негізгі сыныпта анықталған әдісті іске асыруды өзгертетін әдісті қайта анықтауды қолдандық. Бұл негізінен әдісті ауыстыру және бұл бағдарлама іске қосылған кезде шақырылатын ішкі сыныпта анықталған жаңа әдіс. Әдетте, әдісті қайта анықтау кезінде @Overrideкомпиляторға қайта анықталған және қайта анықтау әдістерінің қолтаңбаларын тексеруді айтатын annotation пайдаланылады. Нәтижесінде , бағдарламаңыздың стилі OOP тұжырымдамасына және OOP java принциптеріне сәйкес келетініне көз жеткізу үшін мына кеңестерді орындаңыз:
  • an objectінің негізгі сипаттамаларын бөліп көрсету;
  • жалпы сипаттарды және мінез-құлықты бөлектеңіз және an objectілерді жасау кезінде мұраны пайдаланыңыз;
  • an objectілерді сипаттау үшін дерексіз типтерді қолдану;
  • Сыныптың ішкі іске асырылуына қатысты әдістер мен өрістерді әрқашан жасыруға тырысыңыз.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION