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

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

Топта жарияланған
Сәлеметсіз бе! Сіз Java-ның неге осылай жасалғанын ойлап көрдіңіз бе? Сіз класстарды жасайсыз деген мағынада, олардың негізінде - an objectілер, сыныптарда әдістер бар және т.б. Бірақ неге тілдің құрылымы бағдарламалар басқа нәрседен емес, сыныптар мен an objectілерден тұратындай? Неліктен «нысан» ұғымы ойлап табылып, бірінші орынға қойылды? Барлық тілдер осылай жұмыс істей ме және егер олай болмаса, Java-ға қандай артықшылықтар береді? Көріп отырғаныңыздай, сұрақтар өте көп :) Олардың әрқайсысына бүгінгі дәрісте жауап беруге тырысайық.

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

  1. Мұрагерлік
  2. Абстракция
  3. Инкапсуляция
  4. Полиморфизм

Объектіге бағытталған бағдарламалау (OOP) дегеніміз не

Әрине, Java белгілі бір себептермен an objectілер мен сыныптардан тұрады. Бұл оны жасаушылардың қалауы емес, тіпті олардың ойлап табуы да емес. Объектілерге негізделген көптеген басқа тілдер бар. Мұндай алғашқы тіл Simula деп аталды және ол 1960 жылдары Норвегияда ойлап табылған. Басқа нәрселермен қатар, Simula « сынып » және « әдіс » ұғымдарын енгізді . Объектіге бағытталған программалаудың принциптері – 2
Кристен Найгаард және Оле Йохан Дал - Simula жасаушылар
Бағдарламалау стандарттары бойынша Simula ежелгі тіл болып көрінеді, бірақ олардың Java-мен «отбасылық» байланысы жай көзге көрінеді. Сіз ондағы жазылған codeты оңай оқып, оның не істейтінін жалпы түрде түсіндіре аласыз :)
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;
Кодтық мысал Simula - 50 жыл OOP мақаласынан алынған . Көріп отырғаныңыздай, Java және оның арғы тегі бір-бірінен соншалықты ерекшеленбейді :) Бұл Simula-ның пайда болуы жаңа концепцияның - an objectілі-бағытталған бағдарламалаудың дүниеге келуіне байланысты. Wikipedia OOP-тың келесі анықтамасын береді: Объектіге бағытталған бағдарламалау (OOP) - бағдарламаны an objectілердің жиынтығы ретінде көрсетуге негізделген бағдарламалау әдістемесі, олардың әрқайсысы белгілі бір сыныптың данасы болып табылады және сыныптар мұра иерархиясын құрайды. Бұл, менің ойымша, өте сәтті. Сіз жақында Java тілін үйрене бастадыңыз, бірақ оның ішінде сізге бейтаныс сөздер әрең бар :) Бүгінгі таңда OOP ең кең таралған бағдарламалау әдістемесі болып табылады. Java-дан басқа, OOP принциптері сіз естіген көптеген танымал тілдерде қолданылады. Бұл C++ (оны компьютерлік ойын жасаушылар белсенді пайдаланады), Objective-C және Swift (олар Apple құрылғыларына арналған бағдарламаларды жазады), Python (машиналық оқытуда ең сұранысқа ие), PHP (веб-әзірлеудің ең танымал тілдерінің бірі), JavaScript (қарапайымырақ олар не істемейтінін айтады) және басқалары. Шындығында, OOP-тің бұл «қағидалары» қандай? Толығырақ айтып берейік.

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

Бұл негіз. Объектіге бағытталған бағдарламалау парадигмасын бірге құрайтын 4 негізгі мүмкіндік. Оларды түсіну табысты бағдарламашы болудың кілті болып табылады. Объектіге бағытталған программалаудың принциптері – 3

1-қағида. Мұрагерлік

Жақсы жаңалық, сіз OOP қағидаларының кейбірімен бұрыннан таныссыз! :) Біз лекцияларда мұрагерлікпен бірнеше рет кездестік және онымен жұмыс істеуге уақытымыз болды. Мұрагерлік - бұл бар (ата-аналық) класс негізінде жаңа классты сипаттауға мүмкіндік беретін механизм. Бұл жағдайда ата-аналық сыныптың қасиеттері мен функционалдығы жаңа класс арқылы алынады. Мұрагерлік не үшін қажет және ол қандай артықшылықтар береді? Ең алдымен, codeты қайта пайдалану. Ата-аналық сыныптарда сипатталған өрістер мен әдістерді ұрпақ сыныптарында пайдалануға болады. Егер көліктердің барлық түрлерінде 10 жалпы өріс және 5 бірдей әдіс болса, оларды тек ата-аналық сыныпқа қою керек Auto. Сіз оларды ұрпақ сыныптарында еш қиындықсыз пайдалана аласыз. Тұрақты артықшылықтар: сандық жағынан да (code аз) және нәтижесінде сапалық (сыныптар әлдеқайда қарапайым болады). Бұл ретте мұра механизмі өте икемді және сіз жетіспейтін функцияларды ұрпақтарға бөлек қосуға болады (кейбір өрістер немесе белгілі бір сыныпқа тән мінез-құлық). Жалпы, кәдімгі өмірдегідей: біз бәріміз де ата-анамызға қандай да бір жағынан ұқсаспыз, бірақ кейбір жағынан олардан өзгешеміз :)

Принцип 2. Абстракция

Бұл өте қарапайым принцип. Абстракция дегеніміз - an objectінің негізгі, ең маңызды сипаттамаларын бөлектеу және керісінше - қайталама, елеусіздерді алып тастау. Дөңгелекті қайта ойлап таппай-ақ, сабақтар туралы ескі лекциядан мысалды еске түсірейік. Біз компания қызметкерлерінің файлдық шкафын жасаймыз делік. Қызметкер нысандарын жасау үшін біз класс жаздық Employee. Компания файлында оларды сипаттау үшін қандай сипаттамалар маңызды? Аты-жөні, туған күні, әлеуметтік сақтандыру нөмірі, салық сәйкестендіру нөмірі. Бірақ мұндай картада оның бойы, көз және шаш түсі қажет болуы екіталай. Компанияға қызметкер туралы бұл ақпарат қажет емес. Сондықтан сынып үшін , , және , Employeeайнымалыларын орнатамыз және көздің түсі сияқты бізге қажет емес ақпараттан бас тартып, оны абстракциялаймыз. Бірақ егер агенттікке фотомодельдер каталогын жасасақ, жағдай күрт өзгереді. Сән үлгісін сипаттау үшін біз үшін биіктік, көздің түсі және шаш түсі өте маңызды, бірақ СТН нөмірі қажет емес. Сондықтан сыныпта , , айнымалыларын жасаймыз . String nameint ageint socialInsuranceNumberint taxNumberModelString heightString hairString eyes

3-қағида: Инкапсуляция

Біз бұған дейін кездестірдік. Java тіліндегі инкапсуляция деректерге қол жеткізуді және оны өзгерту мүмкіндігін шектеуді білдіреді. Көріп отырғаныңыздай, ол «капсула» сөзіне негізделген. Бұл «капсулада» біз ешкімнің өзгерткісі келмейтін кейбір маңызды деректерді жасырамыз. Өмірден қарапайым мысал. Сіздің атыңыз бен тегіңіз бар. Оларды сіз білетіндердің бәрі біледі. Бірақ олардың аты-жөніңізді өзгертуге рұқсаты жоқ. Бұл процесс төлқұжат кеңсесінде «инкапсулирленген» деп айтуға болады: онда сіз тек атыңызды және фамorяңызды өзгерте аласыз және оны тек сіз жасай аласыз. Басқа «пайдаланушылар» сіздің атыңыз бен тегіңізге тек оқуға рұқсаты бар :) Тағы бір мысал - сіздің пәтеріңіздегі ақша. Оларды бөлменің ортасында көрінетін жерде қалдыру жақсы идея емес. Кез келген «пайдаланушы» (үйіңізге келген адам) сіздің ақшаңыздың нөмірін өзгерте алады, яғни. оларды алыңыз. Оларды сейфке салып қойған дұрыс. Сіз ғана қол жеткізе аласыз және тек арнайы codeпен. Сіз бұрыннан жұмыс істеген инкапсуляцияның айқын мысалдары қатынас модификаторлары ( private, publicт.б.) және қабылдаушы-баптауыштары болып табылады. Егер ageсынып өрісі Catинкапсуляцияланбаған болса, кез келген адам жаза алады:
Cat.age = -1000;
Ал инкапсуляция механизмі өрісті ageорнатушы әдісімен қорғауға мүмкіндік береді, онда жастың теріс сан болуы мүмкін еместігін тексеруге болады.

Принцип 4. Полиморфизм

Полиморфизм - бұл бірнеше түрге бір тип сияқты қарау мүмкіндігі. Бұл жағдайда an objectілердің мінез-құлқы олар жататын түріне байланысты әр түрлі болады. Біраз күрделі естіледі ме? Енді анықтап көрейік. Ең қарапайым мысал – жануарларды алайық. AnimalБір әдіспен класс құрайық - voice(), және оның екі ұрпағы - Catжәне 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!");
   }
}
AnimalЕнді сілтеме жасап , оған нысан тағайындап көрейік Dog.
public class Main {

   public static void main(String[] args) {

       Animal dog = new Dog();
       dog.voice();
   }
}
Қай әдісті атайды деп ойлайсыз? Animal.voice()немесе Dog.voice()? Сынып әдісі келесідей аталады Dog: Woof-woof! Біз анықтаманы жасадық Animal, бірақ нысан өзін сияқты әрекет етеді Dog. Қажет болса, ол өзін мысық, жылқы немесе басқа жануар сияқты ұстай алады. AnimalЕң бастысы, белгілі бір ұрпақ класының an objectісіне жалпы типтегі сілтемені тағайындау . Бұл қисынды, өйткені барлық иттер жануарлар. «Объектілер олардың түріне байланысты әр түрлі болады» деген кезде біз мұны меңзеген едік. Егер біз нысанды жасайтын болсақ Cat-
public static void main(String[] args) {

   Animal cat = new Cat();
   cat.voice();
}
әдіс voice()"Мияу!" «Бір типті бірнеше түрмен жұмыс істеу қабілеті» нені білдіреді? Бұл да өте оңай. Біз жануарларға арналған шаштараз жасап жатырмыз деп елестетейік. Біздің шаштараз барлық жануарларды кесуге қабілетті болуы керек, сондықтан біз shear()параметрі бар әдісті («кесу») жасаймыз Animal- біз кесетін жануар.
public class AnimalBarbershop {

   public void shear(Animal animal) {

       System.out.println("The haircut is ready!");
   }
}
shearАл енді әдіске an objectілерді де Cat, an objectілерді де бере аламыз 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);
}
Міне, нақты мысал: сынып бір типтегідей типтермен AnimalBarbershopжұмыс істейді . Сонымен қатар олардың мінез-құлқы әртүрлі : дауыстарын басқаша қолданады. CatDogCatDog

OOP пайда болу себептері

Неліктен бұл жаңа бағдарламалау тұжырымдамасы - OOP - тіпті пайда болды ? Бағдарламалаушылардың жұмыс істейтін құралдары болды: мысалы, proceduresалық тілдер. Оларды түбегейлі жаңа нәрсені ойлап табуға не итермеледі? Ең алдымен, олардың алдында тұрған міндеттердің күрделенуі. Егер 60 жыл бұрын бағдарламашының тапсырмасы «осындай және осындай математикалық теңдеуді есептеу» сияқты көрінсе, қазір бұл «StalKER ойыны үшін пайдаланушының A, B, C, D ойын сәтінде қандай шешімдер қабылдағанына байланысты 7 түрлі аяқталуларды орындау» сияқты көрінуі мүмкін. , E, F және осы шешімдердің комбинациясы». Міндеттер, өздеріңіз көріп отырғандай, соңғы онжылдықтарда күрделене түскені анық. Бұл деректер түрлері күрделене түскенін білдіреді. Бұл OOP пайда болуының тағы бір себебі. Теңдеуімен мысалды қарапайым примитивтер арқылы оңай шешуге болады, мұнда ешқандай нысандар қажет емес. Бірақ сіз ойлап тапқан кейбір сыныптарды қолданбай, ойынның аяқталуымен байланысты мәселені сипаттау қиын болады. Бірақ сонымен бірге оны сыныптар мен нысандарда сипаттау өте оңай: бізге Game класы, Stalker класы, Ending класы, Ойыншының шешімі сыныбы, Ойын сәті сыныбы және т.б. қажет болатыны анық. Яғни, мәселені шешуге кіріспестен де, біз оны шешудің «эскиздерін» басымызға оңай елестете аламыз. Есептердің күрделене түсуі бағдарламашыларды есепті бөліктерге бөлуге мәжбүр етті. Бірақ proceduresалық бағдарламалауда бұл оңай болған жоқ. Көбінесе бағдарлама оның жұмыс істеуінің барлық мүмкін нұсқалары бар көптеген бұтақтардың «ағаштары» болды. Белгілі бір шарттарға байланысты бағдарлама бір немесе басқа сала бойынша орындалды. Шағын бағдарламалар үшін бұл опция ыңғайлы болды, бірақ үлкен тапсырманы бөліктерге бөлу өте қиын болды. Бұл қажеттілік OOP пайда болуының тағы бір себебі болды. Бұл концепция бағдарламашыларға бағдарламаны сыныптардың «модульдеріне» бөлуге мүмкіндік берді, олардың әрқайсысы жұмыстың өз бөлігін орындады. Барлық an objectілер өзара әрекеттесе отырып, біздің бағдарламаның жұмысын құрайды. Сонымен қатар, біз жазған codeты бағдарламаның басқа жерінде қайта пайдалануға болады, бұл да көп уақытты үнемдейді.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION