среда, 24 априла, 2024
Како да...?

Увод у објектно-оријентисано програмирање (2. део)

Аутор: Амар Туфо

У објављеном 47. броју ЛиБРЕ! часописа о слободном софтверу имали сте прилику прочитати нешто детаљнији увод у сам термин и срж објектно-оријентисаног програмирања гдје смо настојали упознати вас са новим начином развоја софтвера, његовим предностима, али и манама. У овом, другом дијелу чланка, о објектно-орјентисаном програмирању, упознат ћемо Вас са термином класе и објекта, видјет ћете на практичном примјеру како се креира једна цијела класа, а како се креира објекат, те његово позивање у самом програму. Споменут ћемо термин мутатора и аксесора, те начин његове примјене на практичном примјеру. Треба напоменути још једанпут како овај чланак није увод у програмирање нити је намјењен почетницима с обзиром на то да је чланак написан под претпоставком да сте већ раније радили у Ц++ програмском језику и да познајете основне типове података и петље.

Шта је класа, а шта објекат?

Једна од новина које објектно-орјентисано програмирање уводи у развој софтвера јесу класе и објекти. Прије него погледамо како се засебно пишу класе, треба да укратко разјаснимо шта је то класа а шта објекат.

Најједноставнији одговор на питање шта је класа јесте да је то кориснички тип података. Дакле, класа као главна карактеристика ООП-а омогућава програмеру декларацију свог типа података коју он касније може искористити онолико пута колико му то затреба и тамо гдје му затреба. С друге стране, свака се класа састоји од података чланица класе који могу бити јавног (енг. public) или приватног (енг. private) метода приступа, те заштићени (енг. protected) метод приступа. С обзиром на то да су сви подаци чланице класе декларисани као приватни, њима се приступа користећи посебне функције по имену мутатори и аксесори или гетер (енг. getter) и сетер (енг. setter) функције. Да бисмо боље разумјели овај текст о класама и објектима, погледајмо примјер једне једноставне класе.

Горњи примјер приказује једноставну класу Student са подацима члановима класе height, age и name. У овој класи, као што се види, height и age су тип дабл док је name типа стринг. Сви подаци у овом примјеру класе су приватног типа. Новина у овој класи јесте код после линије void setHeight(double sheight), који представља функције мутатора и аксесора.

Засебно писање класе и креирање објекта?

Претходно у тексту је поменуто како је класа кориснички тип података те је такођер поменуто од којих се метода приступа састоји једна класа. Међутим, није поменуто шта је објекат те како се креира објекат унутар класе. Најбољи примјер објекта је рецимо ауто, авион, пас, мачка. Сваки објекат има своје атрибуте, рецимо ауто има тежину, боју, четири точка, четвера врата. То се у програмирању назива објекат. Да би се један ауто направио, прво се изради нацрт са изгледом аута. Тај нацрт аута би био класа, а сам ауто би био објекат. У програмирању, објекат је саставни дио класе и он се израђује у њој. У нашем случају, студент је објекат који има своје име (стринг), године (интиџер) те тежину (дабл). Сада ми можемо израдити нашу класу која би изгледала овако:

Овако изгледа наша класа по имену Студент којој смо додјелили њене атрибуте. Већ је написано како се свака класа састоји од три метода приступа чланицама а то су јавни, приватни и заштићени. Но, у нашем случају, ми користимо само прва два наведена метода. Како се онда креира објекат и шта је објекат уопште? Најједноставније речено, објекат је инстанца класе или примерак класе.

У овој нашој класи Студент ми ћемо креирати објекат по имену student1. Дакле, ово је објекат наше класе а користит ћемо га како бисмо додјелили нашем студенту име (student1.setName = “Amar”).

Обзиром да су класе кориснички типови података, добар програмер ће класу увијек засебно писати и дефинисати је као свој тип података. То је исто када креирамо засебну ЦСС датотеку наше веб странице те ју касније само увежемо у нашу ХТМЛ датотеку. Погледајте оба случаја:

Слика: Изглед готове веб странице са ЦСС форматирањем

Слика: ХТМЛ изворни код веб странице

Слика: ЦСС датотека веб странице

Вјероватно се питате зашто смо убацили ХТМЛ/ЦСС wеб страницу као примјер која нема никакве везе са класама и објектима. У питању је веома добра пракса да се ЦСС датотека пише засебно од ХТМЛ датотеке а да се касније само повеже. Исту праксу примјењујемо на класе и објекте.

Слика: Изглед класе Студент

Слика: Декларисање типова чланица класе Студент

Укратко, на слици 4 се види како наша класа почиње са #ifndef ,#define, чиме се дефинише кориснички тип података. У Ц++-у, класа почиње малим почетним словом class Student , док назив класе пишемо великим почетним словом. Једном када декларирамо све чланове наше класе као на слици изнад, декларацију класе завршавамо #endif. Тиме је наша класа декларисана. Међутим, на слици 5 која приказује дефиницију функција чланица класе, имамо приказану употребу мутатора и аксесора. Уколико Вас којим случајем буни дио кода на слици 5 Student::setAge, ради се о оператору за разрешење досега (::, енг. scope operator). Оператор за разрешење досега чита декларисане податке из моје класе како би се студенту додјелиле његове године или име. Овако се правилно креира једна класа, а обавезно Вам препоручујемо да радите на исти начин те избјегавајте писање класе унутар main.cpp датотеке како не би дошло до непрегледности у коду, а предност је и лакша модификација и отклањање насталих грешака. Посљедњи дио нашег програма који нам је остао, јесте да се класа повеже у main.cpp датотеку. Оно што треба додатно напонету додати јесте и то што једном када се класа креира, овисно о развојном окружењу које користите, ваља имати на уму да је класа хедер датотека, односно, student.h која садржи декларације прототипова функција те исто име се додјељује за датотеку student.cpp која садржи дефиниције прототипова функција.

Још једна важна ствар коју користи наша класа јесу мутатори и аксесори. Дакле, шта су уопште мутатори и аксесори? Укратко, мутатор је посебна функција класе која поставља вриједност на варијаблу приватног члана класе док аксесор враћа вриједност члана класе. Горња класа Студент има декларисане функције класе користећи се мутаторима и аксесорима а у наставку ћемо погледати како се дефинишу функције класе. Најједноставније речено, мутатори и аксесори су у ствари функције којима се варијаблама додјељују њихове вриједности. Ми у овом нашем програму имамо студента коме желимо да доделимо име и да се његово име врати на излаз пошто се програм компајлира. Име студента је типа стринг па кодом то пишемо овако:

string name;

Сада морамо употребом функције мутатора (сетер) поставити име нашег студента, а то радимо употребом оператора за разрешење досега :: овако:

void Student::setName (std::string sname) { std::string name = sname; }

std::string Student::getName(void) { return _name; }

Једанпут када смо дефинисали прототипове функција, у главном дијелу кода треба само да додјелимо вриједности нашој варијабли, у овом случају да дамо име нашем студенту. Прво се креира објекат који изгледа овако:

Student student; //ovo je objekat

Сада додјелимо име нашем студенту на овај начин.

student.setName(“Amar”);

cout «”\n Name: “ «student.getName()«endl;

Сада поново можемо обратити пажњу на наш цијели програм у који је повезана наша класа а који изгледа овако:

Слика: Изглед цијелог програма main.cpp

Други дио чланка о објектно–орјентисаном програмирању био је нешто детаљнији с обзиром на то да је креиран практични програм по имену Student v1.0 у којем је приказана израда класе и објекта, мутатора и аксесора. У трећем дијелу чланка приказат ћемо начин компајлирања овог Ц++ програма користећи Терминал и ГНУ/Г++ компајлер.

Претходни део