Сәлеметсіз бе! Сіз Java-ның неге осылай жасалғанын ойлап көрдіңіз бе? Сіз класстарды жасайсыз деген мағынада, олардың негізінде - 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 және оның арғы тегі бір-бірінен соншалықты ерекшеленбейді :) Бұл Simula-ның пайда болуы жаңа концепцияның - an objectілі-бағытталған бағдарламалаудың дүниеге келуіне байланысты. Wikipedia OOP-тың келесі анықтамасын береді: Объектіге бағытталған бағдарламалау (OOP) - бағдарламаны an objectілердің жиынтығы ретінде көрсетуге негізделген бағдарламалау әдістемесі, олардың әрқайсысы белгілі бір сыныптың данасы болып табылады және сыныптар мұра иерархиясын құрайды. Бұл, менің ойымша, өте сәтті. Сіз жақында Java тілін үйрене бастадыңыз, бірақ оның ішінде сізге бейтаныс сөздер әрең бар :) Бүгінгі таңда OOP ең кең таралған бағдарламалау әдістемесі болып табылады. Java-дан басқа, OOP принциптері сіз естіген көптеген танымал тілдерде қолданылады. Бұл C++ (оны компьютерлік ойын жасаушылар белсенді пайдаланады), Objective-C және Swift (олар Apple құрылғыларына арналған бағдарламаларды жазады), Python (машиналық оқытуда ең сұранысқа ие), PHP (веб-әзірлеудің ең танымал тілдерінің бірі), JavaScript (қарапайымырақ олар не істемейтінін айтады) және басқалары. Шындығында, OOP-тің бұл «қағидалары» қандай? Толығырақ айтып берейік.
OOP принциптері
Бұл негіз. Объектіге бағытталған бағдарламалау парадигмасын бірге құрайтын 4 негізгі мүмкіндік. Оларды түсіну табысты бағдарламашы болудың кілті болып табылады.1-қағида. Мұрагерлік
Жақсы жаңалық, сіз OOP қағидаларының кейбірімен бұрыннан таныссыз! :) Біз лекцияларда мұрагерлікпен бірнеше рет кездестік және онымен жұмыс істеуге уақытымыз болды. Мұрагерлік - бұл бар (ата-аналық) класс негізінде жаңа классты сипаттауға мүмкіндік беретін механизм. Бұл жағдайда ата-аналық сыныптың қасиеттері мен функционалдығы жаңа класс арқылы алынады. Мұрагерлік не үшін қажет және ол қандай артықшылықтар береді? Ең алдымен, codeты қайта пайдалану. Ата-аналық сыныптарда сипатталған өрістер мен әдістерді ұрпақ сыныптарында пайдалануға болады. Егер көліктердің барлық түрлерінде 10 жалпы өріс және 5 бірдей әдіс болса, оларды тек ата-аналық сыныпқа қою керекAuto
. Сіз оларды ұрпақ сыныптарында еш қиындықсыз пайдалана аласыз. Тұрақты артықшылықтар: сандық жағынан да (code аз) және нәтижесінде сапалық (сыныптар әлдеқайда қарапайым болады). Бұл ретте мұра механизмі өте икемді және сіз жетіспейтін функцияларды ұрпақтарға бөлек қосуға болады (кейбір өрістер немесе белгілі бір сыныпқа тән мінез-құлық). Жалпы, кәдімгі өмірдегідей: біз бәріміз де ата-анамызға қандай да бір жағынан ұқсаспыз, бірақ кейбір жағынан олардан өзгешеміз :)
Принцип 2. Абстракция
Бұл өте қарапайым принцип. Абстракция дегеніміз - an objectінің негізгі, ең маңызды сипаттамаларын бөлектеу және керісінше - қайталама, елеусіздерді алып тастау. Дөңгелекті қайта ойлап таппай-ақ, сабақтар туралы ескі лекциядан мысалды еске түсірейік. Біз компания қызметкерлерінің файлдық шкафын жасаймыз делік. Қызметкер нысандарын жасау үшін біз класс жаздықEmployee
. Компания файлында оларды сипаттау үшін қандай сипаттамалар маңызды? Аты-жөні, туған күні, әлеуметтік сақтандыру нөмірі, салық сәйкестендіру нөмірі. Бірақ мұндай картада оның бойы, көз және шаш түсі қажет болуы екіталай. Компанияға қызметкер туралы бұл ақпарат қажет емес. Сондықтан сынып үшін , , және , Employee
айнымалыларын орнатамыз және көздің түсі сияқты бізге қажет емес ақпараттан бас тартып, оны абстракциялаймыз. Бірақ егер агенттікке фотомодельдер каталогын жасасақ, жағдай күрт өзгереді. Сән үлгісін сипаттау үшін біз үшін биіктік, көздің түсі және шаш түсі өте маңызды, бірақ СТН нөмірі қажет емес. Сондықтан сыныпта , , айнымалыларын жасаймыз . String name
int age
int socialInsuranceNumber
int taxNumber
Model
String height
String hair
String 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
жұмыс істейді . Сонымен қатар олардың мінез-құлқы әртүрлі : дауыстарын басқаша қолданады. Cat
Dog
Cat
Dog
GO TO FULL VERSION