JavaRush /Java блогу /Random-KY /OOP принциптери

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

Группада жарыяланган
Java an objectиге багытталган тил болуп саналат. Бул an objectке багытталган стилди колдонуу менен Java программаларын жазуу керек дегенди билдирет. Жана бул стиль программада an objectилерди жана класстарды колдонууга негизделген.

ООПтун негизги принциптери:

OOP принциптери - 1Келгиле, мисалдардын жардамы менен класстар жана an objectтер эмне экенин, ошондой эле OOPтин негизги принциптерин практикада кантип колдонууну түшүнүүгө аракет кылалы: абстракция, тукум куучулук, полиморфизм жана инкапсуляция.

Объект деген эмне?

Биз жашап жаткан дүйнө an objectтерден турат. Айланабызды карасак, айланабызды үйлөр, бак-дарактар, машиналар, эмеректер, идиш-аяктар, компьютерлер курчап турат. Бул нерселердин баары an objectилер болуп саналат жана алардын ар бири белгилүү бир өзгөчөлүктөргө, жүрүм-турумга жана максатка ээ. Биз an objectтерге көнүп калганбыз жана аларды дайыма өзгөчө максаттар үчүн колдонобуз. Мисалы, жумушка барышыбыз керек болсо машина менен, тамактанабыз десек идиш-аяк колдонобуз, эс алышыбыз керек болсо ыңгайлуу диван керек. Адам күнүмдүк турмуштагы көйгөйлөрдү чечүү үчүн an objectивдүү ойлонууга көнүп калган. Бул программалоодо an objectтерди колдонуунун себептеринин бири болгон жана программаларды түзүүгө мындай мамиле an objectиге багытталган деп аталды. Мисал келтирели. Элестетиңиз, сиз телефондун жаңы моделин иштеп чыктыңыз жана анын массалык өндүрүшүн баштоону каалайсыз. Телефондун дизайнери катары сиз анын эмне үчүн экенин, кандай иштешин жана кандай бөлүктөрдөн (кап, микрофон, динамик, зымдар, баскычтар ж.б.) тураарын билесиз. Бирок, бул бөлүктөрүн кантип туташтыруу керектигин сиз гана билесиз. Бирок, сиз жеке телефон чыгарууну пландаган жоксуз, бул үчүн сизде кызматкерлердин бүтүндөй штаты бар. Телефондун бөлүктөрүн кантип туташтыруу керектигин ар дайым түшүндүрүп отура бербеш үчүн жана өндүрүштөгү бардык телефондор бирдей болуп чыгышы үчүн, аларды чыгараардан мурун, сиз телефондун чиймесин түрүндөгү чиймени жасашыңыз керек. телефондун түзүлүшүнүн сүрөттөлүшү. OOPде мындай сүрөттөмө, чийме, диаграмма же шаблон класс деп аталат, андан программа аткарылганда an object түзүлөт. Класс - талаалардан, методдордон жана конструктордон турган жалпы шаблон сыяктуу али түзүлө элек an objectтин сүрөттөлүшү, ал эми an object бул сүрөттөмөнүн негизинде түзүлгөн класстын үлгүсү.

OOP абстракция

Эми телефонду мисал катары колдонуп, реалдуу дүйнөдөгү an objectтен программадагы an objectке кантип өтө аларыбызды ойлонуп көрөлү. Бул байланыш каражатынын тарыхы 100 жылдан ашат жана азыркы телефон 19-кылымдагы мурункусунан айырмаланып, бир топ татаал түзүлүш. Телефонду колдонгондо анын түзүлүшү жана анын ичинде болуп жаткан процесстер жөнүндө ойлонбойбуз. Биз жөн гана телефонду иштеп чыгуучулар тарабынан берилген функцияларды – баскычтарды же сенсордук экранды колдонуп, номерди тандап, чалууларды жасайбыз. Биринчи телефон интерфейстеринин бири сиз чалуу үчүн бурган баскыч болгон. Албетте, бул абдан ыңгайлуу болгон жок. Ошого карабастан, туткасы өз милдетин так аткарган. Эгер сиз эң заманбап жана эң биринчи телефонду карасаңыз, 19-кылымдын аягындагы аппарат үчүн да, ультра заманбап смартфон үчүн да маанилүү болгон эң маанилүү деталдарды дароо аныктай аласыз. Бул чалуу (номерди терүү) жана чалуу кабыл алуу. Негизи бул телефонду башка нерсе эмес, телефон кылат. Эми биз OOP принцибин колдондук - an object жөнүндө эң маанилүү мүнөздөмөлөрдү жана маалыматты бөлүп көрсөтүү. ООПтун бул принциби абстракция деп аталат. OOPдогу абстракцияны программадагы an objectтер катары реалдуу проблеманын элементтерин көрсөтүү жолу катары да аныктаса болот. Абстракция ар дайым an objectтердин же an objectтердин касиеттери жөнүндө кээ бир маалыматтарды жалпылоо менен байланышкан, ошондуктан эң негизгиси чечorп жаткан маселенин контекстинде маанилүү маалыматты анча маанилүү эмес маалыматтан бөлүп алуу болуп саналат. Бул учурда абстракциянын бир нече деңгээли болушу мүмкүн. Телефондорубузга абстракция принцибин колдонууга аракет кылалы. Биринчиден, келгиле, телефондордун эң кеңири таралган түрлөрүн биринчиден бүгүнкү күнгө чейин бөлүп көрөлү. Мисалы, аларды 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 инкапсуляция принциби колдонулат - an objectтин атрибуттары жана жүрүм-туруму бир класста бириктирилген, an objectтин ички ишке ашырылышы жашырылган OOPтун дагы бир негизги принциби. колдонуучу жана an object менен иштөө үчүн ачык интерфейс каралган. Программисттин милдети кайсы атрибуттар жана методдор жалпыга жеткorктүү болоорун жана кайсынысы an objectтин ички ишке ашырылышы жана өзгөртүлбөшү керектигин аныктоо.

Инкапсуляция жана мүмкүндүктү башкаруу

Өндүрүш учурунда телефондун арткы бетинде ал жөнүндө маалымат чегилген: анын чыгарылган жылы же өндүрүүчүнүн компаниясынын логотиби деп коёлу. Бул маалымат бул моделди өзгөчө мүнөздөйт - анын абалы. Телефонду иштеп чыгуучу бул маалыматтын өзгөрбөстүгүнө кам көргөн деп айта алабыз - гравюраны алып салуу жөнүндө кимдир бирөө ойлошу күмөн. Java дүйнөсүндө келечектеги an objectтердин абалы талааларды колдонуу менен класста сүрөттөлөт, ал эми алардын жүрүм-туруму методдор аркылуу сүрөттөлөт. Абалды жана жүрүм-турумду өзгөртүү мүмкүнчүлүгү талааларга жана ыкмаларга кирүү модификаторлорун колдонуу менен ишке ашырылат - private, protected, public, жана default(демейки мүмкүндүк). Мисалы, биз түзүлгөн жылы, телефон өндүрүүчүнүн аты жана ыкмаларынын бири класстын ички ишке ашырууга таандык жана программадагы башка an objectтер тарабынан өзгөртүлүшү мүмкүн эмес деп чечтик. Кодду колдонуу менен класс төмөнкүчө сүрөттөлүшү мүмкүн:
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бизге бул методдун ички ишке ашырылышын эркин өзгөртүү мүмкүнчүлүгүн калтырат, анткени бул ыкма башка an objectтер тарабынан колдонулбоого кепилдик берилет жана алардын ишин үзгүлтүккө учуратпайт. Объектибиз менен иштөө үчүн модификатордун 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);
    }
  }
Методдо 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
Объект боюнча бир эле ыкманы чакыруу менен user, биз ар кандай жыйынтыктарды алдык. callМетоддун ичинде конкреттүү ыкманы ишке ашырууну тандоо callAnotherUserпрограмманы аткаруу учурунда чакыруучу an objectтин конкреттүү түрүнүн негизинде динамикалык түрдө ишке ашырылган. Бул полиморфизмдин негизги артыкчылыгы - программаны аткаруу учурунда ишке ашырууну тандоо. Жогорудагы телефон классынын мисалдарында биз методду жокко чыгарууну колдондук, бул метод кол тамгасын өзгөртпөстөн, базалык класста аныкталган ыкманы ишке ашырууну өзгөрткөн ыкма. Бул негизи ыкманы алмаштыруу жана бул программа иштеп жатканда чакырылган субкласста аныкталган жаңы ыкма. Адатта, методду жокко чыгарууда annotation колдонулат @Override, ал компиляторго жокко чыгарылган жана жокко чыгаруу ыкмаларынын колдорун текшерүүнү айтат. Натыйжада , программаңыздын стor OOP концепциясына жана OOP java принциптерине шайкеш келүүсүн камсыздоо үчүн бул кеңештерди аткарыңыз:
  • an objectтин негизги мүнөздөмөлөрүн бөлүп көрсөтүү;
  • an objectтерди түзүүдө жалпы касиеттерди жана жүрүм-турумду бөлүп көрсөтүү жана мурасты колдонуу;
  • an objectтерди сүрөттөө үчүн абстракттуу түрлөрүн колдонуу;
  • Класстын ички ишке ашырууга байланыштуу ыкмаларын жана талааларын ар дайым жашырууга аракет кылыңыз.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION