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

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

Группада жарыяланган
Салам! Сиз качандыр бир ойлонуп көрдүңүз беле, эмне үчүн Java дал ушундай иштелип чыккан? Сиз класстарды түзөсүз деген мааниде, алардын негизинде - an objectтер, класстарда методдор ж.б. Бирок эмне үчүн тилдин структурасы программалар башка нерседен эмес, класстардан жана 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 жана анын түпкү атасы бири-биринен анчалык деле айырмаланbyte :) Бул Simula пайда болушу жаңы концепциянын – an objectиге багытталган программалоонун жаралышын белгилегенине байланыштуу. Wikipedia ООПтун төмөнкүдөй аныктамасын берет: Объектке багытталган программалоо (OOP) бул программаны an objectтердин жыйындысы катары көрсөтүүгө негизделген программалоо методологиясы, алардын ар бири белгилүү бир класстын инстанциясы болуп саналат жана класстар мурас иерархиясын түзөт. Бул, менин оюмча, абдан ийгorктүү. Сиз жакында Java тorн үйрөнө баштадыңыз, бирок анда сизге бейтааныш сөздөр дээрлик жок :) Бүгүнкү күндө OOP эң кеңири таралган программалоо методологиясы. Javaдан тышкары, OOP принциптери сиз уккан көптөгөн популярдуу тилдерде колдонулат. Булар C++ (компьютердик оюндарды иштеп чыгуучулар тарабынан жигердүү колдонулат), Objective-C жана Swift (алар Apple түзмөктөрү үчүн программаларды жазышат), Python (машина үйрөнүүдө эң көп суроо-талапка ээ), PHP (эң популярдуу веб-иштеп чыгуу тилдеринин бири), JavaScript (жөнөкөйраак айтканда, алар эмне кылbyte) жана башкалар. Чынында, бул OOP "принциптери" кандай? кененирээк айтып берели.

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

Бул негиздер. Объектке багытталган программалоонун парадигмасын түзгөн 4 негизги өзгөчөлүк. Аларды түшүнүү - ийгorктүү программист болуунун ачкычы. Объектке багытталган программалоонун принциптери – 3

Принцип 1. Мурас

Жакшы жаңылык, сиз OOP принциптеринин айрымдары менен мурунтан эле таанышсыз! :) Биз буга чейин лекцияларда бир нече жолу мураска кабылганбыз жана аны менен иштөөгө үлгүрдүк. Мурас - бул учурдагы (ата-энелик) класстын негизинде жаңы классты сүрөттөөгө мүмкүндүк берүүчү механизм. Бул учурда, ата-класстын касиеттери жана функционалдуулугу жаңы класс тарабынан алынган. Мурас эмне үчүн зарыл жана ал кандай пайдаларды берет? Биринчиден, codeду кайра колдонуу. Ата-энелер класстарында сүрөттөлгөн талаалар жана ыкмалар тукум класстарда колдонулушу мүмкүн. Унаалардын бардык түрлөрү 10 жалпы талаа жана 5 окшош ыкмаларга ээ болсо, аларды ата-эне классына коюу керек Auto. Аларды урпак класстарында эч кандай көйгөйсүз колдоно аласыз. Катуу артыкчылыктары: сан жагынан да (азыраак code) жана натыйжада сапаттык жактан да (класстар бир топ жөнөкөй болуп калат). Ошол эле учурда, тукум куучулук механизми абдан ийкемдүү, жана сиз тукумдарга жетишпеген функцияларды өзүнчө кошо аласыз (айрым талаалар же белгилүү бир класска мүнөздүү жүрүм-турум). Жалпысынан, кадимки жашоодогудай: биз баарыбыз ата-энебизге кандайдыр бир жагынан окшошпуз, бирок алардан кандайдыр бир жагынан айырмаланабыз :)

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

Бул абдан жөнөкөй принцип. Абстракция an objectтин негизги, эң маанилүү мүнөздөмөлөрүн бөлүп көрсөтүү жана тескерисинче - экинчи даражадагы, анча маанилүү эмес мүнөздөмөлөрдү жокко чыгарууну билдирет. Келгиле, дөңгөлөктү кайра ойлоп таппай, класстар жөнүндөгү эски лекциядан бир мисалды эстейли. Компаниянын кызматкерлеринин файлдык кабинетин түзүп жатабыз дейли. Кызматкер an objectтерин түзүү үчүн биз класс жаздык Employee. Компания файлында алардын сүрөттөлүшү үчүн кандай мүнөздөмөлөр маанилүү? Толук аты-жөнү, туулган күнү, социалдык камсыздандыруу номери, салык идентификациялык номери. Бирок бул түрдөгү картада анын бою, көз жана чачтын түсү бизге керек болушу күмөн. Ишканага кызматкер тууралуу бул маалымат керек эмес. Демек, класс үчүн , , жана , Employeeөзгөрмөлөрүн коюп, көздүн түсү сыяктуу бизге керексиз маалыматтардан баш тартып, аны абстракциялайбыз. Бирок агенттик үчүн фотомодельдердин каталогун түзсөк, кырдаал кескин өзгөрөт. Мода моделин сүрөттөө үчүн биз үчүн бийиктик, көздүн түсү жана чачтын түсү абдан маанилүү, бирок ИННдин кереги жок. Ошондуктан класста , , өзгөрмөлөрдү түзөбүз . String nameint ageint socialInsuranceNumberint taxNumberModelString heightString hairString eyes

3-принцип: Инкапсуляция

Биз буга чейин эле жолукканбыз. Javaдагы инкапсуляция маалыматтарга жетүү мүмкүнчүлүгүн жана аны өзгөртүү мүмкүнчүлүгүн чектөө дегенди билдирет. Көрүнүп тургандай, ал "капсула" деген сөздүн негизинде түзүлгөн. Бул "капсулада" биз эч кимдин өзгөрүшүн каалабаган биз үчүн маанилүү маалыматтарды жашырабыз. Жашоодон жөнөкөй мисал. Сиздин атыңыз жана фамorяңыз бар. Аларды сиз тааныгандардын баары билет. Бирок алар сиздин атыңызды жана фамorяңызды өзгөртүүгө мүмкүнчүлүгү жок. Бул процесс, кимдир бирөө, паспорт столунда "инкапсуляцияланган" деп айтууга болот: ал жерде сиз аты-жөнүн жана фамorясын гана өзгөртө аласыз, аны сиз гана кыла аласыз. Башка "колдонуучулар" сиздин атыңызды жана фам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Эми шилтеме түзүүгө жана ага an object дайындоого аракет кылалы Dog.
public class Main {

   public static void main(String[] args) {

       Animal dog = new Dog();
       dog.voice();
   }
}
Кайсы ыкма деп аталат деп ойлойсуз? Animal.voice()же Dog.voice()? Класстын ыкмасы деп аталат Dog: Woof-woof! Биз маалымдама түздүк Animal, бирок an object өзүндөй иштейт Dog. Керек болсо өзүн мышык, жылкы же башка жаныбардай алып жүрө алат. Негизгиси - Animalбелгилүү бир тукум классынын an objectисине жалпы типтеги шилтеме ыйгаруу. Бул логикалуу, анткени бардык иттер жаныбарлар. Биз "an objectтер кандай түргө жараша өзүн башкача алып жүрүшөт" деп айтканыбызда ушуну айткыбыз келген. Эгерде биз 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!");
   }
}
Эми биз shearan 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 жана бул чечимдердин комбинациялары». Милдеттер, өзүңүздөр көрүп тургандай, акыркы ондогон жылдар ичинде кыйла татаал болуп калды. Бул маалымат түрлөрү татаал болуп калды дегенди билдирет. Бул ООПтун пайда болушунун дагы бир себеби. Теңдеме менен мисалды жөнөкөй примитивдерди колдонуу менен оңой чечсе болот, бул жерде эч кандай an object талап кылынbyte. Бирок сиз ойлоп тапкан кээ бир класстарды колдонбой туруп, оюндун аягы менен көйгөйдү сүрөттөп берүү кыйынга турат. Бирок, ошол эле учурда, аны класстарда жана an objectтерде сүрөттөп берүү абдан оңой: бизге Оюн классы, Stalker классы, Аяктоо классы, Оюнчунун чечими классы, Оюн Момент классы ж.б.у.с. керек болот. Башкача айтканда, маселени чече баштабай эле, биз башыбызда анын чечorшинин “эскиздерин” оңой эле элестете алабыз. Проблемалардын татаалданышы программисттерди маселени бөлүктөргө бөлүүгө аргасыз кылды. Бирок proceduresалык программалоодо бул оңой болгон жок. Ал эми көбүнчө программа анын иштешинин бардык мүмкүн болгон варианттары менен бутактардын бир тутам "дарагы" болгон. Белгилүү шарттарга жараша программа тигил же бул тармак боюнча аткарылган. Чакан программалар үчүн бул параметр ыңгайлуу болгон, бирок чоң тапшырманы бөлүктөргө бөлүү абдан кыйын болчу. Бул муктаждык ООПтун пайда болушунун дагы бир себеби болуп калды. Бул концепция программисттерге программаны класстардын «модулдарына» бөлүү мүмкүнчүлүгүн берди, алардын ар бири иштин өз бөлүгүн аткарган. Бардык an objectтер бири-бири менен өз ара аракеттенип, биздин программанын ишин түзөт. Мындан тышкары, биз жазган codeду программанын башка жеринде кайра колдонсо болот, бул да көп убакытты үнөмдөйт.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION