Салам! Сиз качандыр бир ойлонуп көрдүңүз беле, эмне үчүн Java дал ушундай иштелип чыккан? Сиз класстарды түзөсүз деген мааниде, алардын негизинде - an objectтер, класстарда методдор ж.б. Бирок эмне үчүн тилдин структурасы программалар башка нерседен эмес, класстардан жана an objectтерден тургандай? Эмне үчүн «an object» түшүнүгү ойлоп табылып, биринчи планга коюлган? Бардык тилдер ушундай иштейби жана эгер андай болбосо, ал Javaга кандай артыкчылыктарды берет? Көрүнүп тургандай, суроолор абдан көп :) Келгиле, бүгүнкү лекцияда алардын ар бирине жооп бергенге аракет кылалы.
Кристен Нигаард жана Оле Йохан Дал - Simula жаратуучулары
Бул Simula программалоо стандарттары боюнча байыркы тил болуп көрүнөт, бирок Java менен алардын "үй-бүлөлүк" байланышы көзгө көрүнүп турат. Кыязы, сиз анда жазылган codeду оңой окуп, анын эмне кылганын жалпысынан түшүндүрсөңүз болот :)
OOP принциптери:
Объектке багытталган программалоо деген эмне (OOP)
Албетте, Java кандайдыр бир себептерден улам an objectтерден жана класстардан турат. Бул анын жаратуучуларынын каалоосу, жада калса алардын ойлоп табуусу да эмес. Объекттерге негизделген башка көптөгөн тилдер бар. Мындай биринчи тил Simula деп аталып, ал 1960-жылдары Норвегияда ойлоп табылган. Башка нерселер менен катар, Simula " класс " жана " метод " түшүнүктөрүн киргизди .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ктүү программист болуунун ачкычы.Принцип 1. Мурас
Жакшы жаңылык, сиз OOP принциптеринин айрымдары менен мурунтан эле таанышсыз! :) Биз буга чейин лекцияларда бир нече жолу мураска кабылганбыз жана аны менен иштөөгө үлгүрдүк. Мурас - бул учурдагы (ата-энелик) класстын негизинде жаңы классты сүрөттөөгө мүмкүндүк берүүчү механизм. Бул учурда, ата-класстын касиеттери жана функционалдуулугу жаңы класс тарабынан алынган. Мурас эмне үчүн зарыл жана ал кандай пайдаларды берет? Биринчиден, codeду кайра колдонуу. Ата-энелер класстарында сүрөттөлгөн талаалар жана ыкмалар тукум класстарда колдонулушу мүмкүн. Унаалардын бардык түрлөрү 10 жалпы талаа жана 5 окшош ыкмаларга ээ болсо, аларды ата-эне классына коюу керекAuto
. Аларды урпак класстарында эч кандай көйгөйсүз колдоно аласыз. Катуу артыкчылыктары: сан жагынан да (азыраак code) жана натыйжада сапаттык жактан да (класстар бир топ жөнөкөй болуп калат). Ошол эле учурда, тукум куучулук механизми абдан ийкемдүү, жана сиз тукумдарга жетишпеген функцияларды өзүнчө кошо аласыз (айрым талаалар же белгилүү бир класска мүнөздүү жүрүм-турум). Жалпысынан, кадимки жашоодогудай: биз баарыбыз ата-энебизге кандайдыр бир жагынан окшошпуз, бирок алардан кандайдыр бир жагынан айырмаланабыз :)
Принцип 2. Абстракция
Бул абдан жөнөкөй принцип. Абстракция an objectтин негизги, эң маанилүү мүнөздөмөлөрүн бөлүп көрсөтүү жана тескерисинче - экинчи даражадагы, анча маанилүү эмес мүнөздөмөлөрдү жокко чыгарууну билдирет. Келгиле, дөңгөлөктү кайра ойлоп таппай, класстар жөнүндөгү эски лекциядан бир мисалды эстейли. Компаниянын кызматкерлеринин файлдык кабинетин түзүп жатабыз дейли. Кызматкер an objectтерин түзүү үчүн биз класс жаздыкEmployee
. Компания файлында алардын сүрөттөлүшү үчүн кандай мүнөздөмөлөр маанилүү? Толук аты-жөнү, туулган күнү, социалдык камсыздандыруу номери, салык идентификациялык номери. Бирок бул түрдөгү картада анын бою, көз жана чачтын түсү бизге керек болушу күмөн. Ишканага кызматкер тууралуу бул маалымат керек эмес. Демек, класс үчүн , , жана , Employee
өзгөрмөлөрүн коюп, көздүн түсү сыяктуу бизге керексиз маалыматтардан баш тартып, аны абстракциялайбыз. Бирок агенттик үчүн фотомодельдердин каталогун түзсөк, кырдаал кескин өзгөрөт. Мода моделин сүрөттөө үчүн биз үчүн бийиктик, көздүн түсү жана чачтын түсү абдан маанилүү, бирок ИННдин кереги жок. Ошондуктан класста , , өзгөрмөлөрдү түзөбүз . String name
int age
int socialInsuranceNumber
int taxNumber
Model
String height
String hair
String 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!");
}
}
Эми биз 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
. Ошол эле учурда алардын жүрүм-туруму ар кандай : үндөрүн башкача колдонушат. Cat
Dog
Cat
Dog
GO TO FULL VERSION