Osnove objektno orijentisanog programiranja. Šta je OOP sa primjerima

Apstraktni tipovi podataka

Koncept apstraktnih tipova podataka je ključan u programiranju. Apstrakcija podrazumeva odvajanje i nezavisno razmatranje interfejsa i implementacije.

Pogledajmo primjer. Svi gledamo televizijske programe. Nazovimo televizor modulom ili objektom. Ovaj objekat ima interfejs sa korisnikom, odnosno kontrole (skup dugmadi), reprodukciju slike i zvuka. Što je interfejs napredniji, televizor je praktičniji za korišćenje. Programe mijenjamo pritiskom na određene tipke, a pritom ne razmišljamo o fizičkim procesima koji se dešavaju u televizoru. Stručnjaci znaju za ovo. Kada biramo televizor, zanimaju nas njegova cijena i parametri performansi, odnosno kvalitet slike, zvuka itd. Međutim, ne zanima nas šta je unutra. Drugim riječima, vraćamo se na svojstva objekta (modula), a to su interfejs i implementacija. Glavna svrha apstrakcije u programiranju je upravo odvajanje interfejsa od implementacije.

Vratimo se našem primjeru. Pretpostavimo da je neki subjekt uvjeren da dobro poznaje strukturu TV-a. Skida poklopac i počinje da ga "poboljšava". Iako to ponekad dovodi do nekih srednjih (lokalnih) uspjeha, krajnji rezultat je gotovo uvijek negativan. Stoga se takve radnje moraju zabraniti. U programiranju, ovo je podržano mehanizmima za uskraćivanje pristupa ili skrivanje internih komponenti. Svaki objekat (modul) ima pravo da upravlja „svojom imovinom“, odnosno ovim funkcijama i operacijama. Zanemarivanje ovog principa narušava stabilnost sistema i često dovodi do njegovog potpunog uništenja. Princip apstrakcije zahtijeva korištenje mehanizama skrivanja koji sprječavaju namjernu ili slučajnu modifikaciju unutrašnjih komponenti.

Apstrakcija podataka uključuje definisanje i razmatranje apstraktni tipovi podataka(ATD) ili, što je isto, nove vrste podataka koje unosi korisnik.

Apstraktni tip podataka je zbirka podataka zajedno sa mnogim operacijama koje se mogu izvesti na tim podacima.

Koncept objektno orijentisanog programiranja

Prema definiciji autoriteta u oblasti objektno orijentisanih metoda razvoja programa, Gradi Bucha, „objektno orijentisano programiranje (OOP) je metodologija programiranja koja se zasniva na predstavljanju programa kao zbirke objekata, od kojih svaki je implementacija određene klase (posebne vrste tipa), a klase čine hijerarhiju na principima heritabilnosti.”

Objektno orijentisana metodologija, kao i strukturna metodologija, kreirana je sa ciljem da disciplinuje proces razvoja velikih softverskih sistema i na taj način smanji njihovu složenost i cenu.

Objektno orijentirana metodologija teži istim ciljevima kao i strukturna, ali ih rješava iz drugog ugla. polazna tačka i u većini slučajeva vam omogućava upravljanje složenijim projektima od strukturirane metodologije.

Kao što znate, jedan od principa upravljanja složenošću projekta je dekompozicija. Gradi Booch razlikuje dvije vrste dekompozicije: algoritamsku (kako on naziva dekompoziciju podržanu strukturnim metodama) i objektno orijentisanu, razlika između kojih je, po njegovom mišljenju, sljedeća: „Podjela po algoritmima koncentriše pažnju na redoslijed događaja koji se dešavaju. , a podjela po objektima daje posebno značenje faktori koji ili izazivaju radnje ili su objekti primjene tih radnji.”

Drugim riječima, algoritamska dekompozicija više uzima u obzir strukturu odnosa između dijelova složenog problema, dok objektno orijentirana dekompozicija obraća više pažnje na prirodu odnosa.

U praksi se preporučuje korištenje oba tipa dekompozicije: pri kreiranju velikih projekata, preporučljivo je prvo koristiti objektno orijentirani pristup za kreiranje opće hijerarhije objekata koji odražavaju suštinu programabilnog zadatka, a zatim koristiti algoritamsku dekompoziciju. u module kako bi se pojednostavio razvoj i održavanje softverskog paketa.

OO programiranje je nesumnjivo jedno od najzanimljivijih područja za profesionalni razvoj softvera.

Objekti i klase

Osnovni blokovi objektno orijentisanog programa su objekti i klase. U smislu sadržaja, objekt se može predstaviti kao nešto što se osjeća ili zamišlja i ima dobro definirano ponašanje. Dakle, objekt se može vidjeti, dodirnuti ili barem znati da se tamo nalazi, na primjer predstavljen kao informacija pohranjena u memoriji računala. Definirajmo predmet, držeći se mišljenja Gradija Buče: „Predmet je opipljiv entitet koji jasno ispoljava svoje ponašanje.“

objekat - on je dio stvarnosti oko nas, odnosno postoji u vremenu i prostoru (pojam objekta u programiranju je prvi put uveden u jeziku Simula). Formalno, objekat je prilično teško definisati. To se može učiniti kroz neka svojstva, naime: objekt ima stanje, ponašanje i može se jedinstveno identificirati (drugim riječima, ima jedinstveno ime).

klasa - to je skup objekata koji imaju zajedničku strukturu i zajedničko ponašanje. Klasa je opis (apstrakcija) koji pokazuje kako se konstruiše varijabla ove klase koja postoji u vremenu i prostoru, tzv. objekt. Značenje rečenica “opis varijabli klase” i “opis klasnih objekata” je isto.

Objekt ima stanje, ponašanje i pasoš (sredstvo za njegovu nedvosmislenu identifikaciju); opisana je struktura i ponašanje objekata na časovima, od kojih su one varijable.

Hajde da sada definišemo koncepte stanje, ponašanje i identifikacija objekt.

Stanje objekta kombinuje sva svoja polja podataka (statička komponenta, tj. nepromenljiva) i trenutne vrednosti svakog od ovih polja (dinamička komponenta, tj. obično se menja).

Ponašanje izražava dinamiku promjena stanja objekta i njegovu reakciju na dolazne poruke, tj. kako objekt mijenja svoja stanja i stupa u interakciju s drugim objektima.

Identifikacija(prepoznavanje) objekta je svojstvo koje vam omogućava da razlikujete objekt od drugih objekata iste ili druge klase. Identifikacija se vrši preko jedinstvenog imena (pasoša), koje se dodjeljuje objektu u programu, kao i svaka druga varijabla.

Gore je već rečeno da vam proceduralni (kao i modularni) pristup omogućava pravljenje programa koji se sastoje od skupa procedura (potprograma) koji implementiraju date algoritme. S druge strane, objektno orijentirani pristup predstavlja programe kao skup objekata koji međusobno djeluju. Objekti komuniciraju putem poruka. Pretpostavimo da je naš objekat krug. Tada bi poruka poslana ovom objektu mogla biti: "nacrtaj sebe." Kada kažemo da je poruka poslana objektu, mi zapravo zovemo neki funkcija ovaj objekt (komponenta funkcije). Dakle, u gornjem primjeru ćemo pozvati funkciju koja će nacrtati krug na ekranu.

Osnovni principi OOP-a

Osnovni principi objektno orijentisanog stila programiranja uključuju:

  • pakovanje ili kapsuliranje;
  • nasljedstvo;
  • polimorfizam;
  • prijenos poruke.

Pakovanje (inkapsulacija)

uključuje kombiniranje podataka i funkcija koje manipuliraju ovim podacima u jednom objektu. Pristup nekim podacima unutar paketa može biti odbijen ili ograničen.

Objekt se karakterizira kao skup svih njegovih svojstava (na primjer, za životinje - prisustvo glave, ušiju, očiju itd.) i njihovih trenutnih vrijednosti (glava - velika, uši - dugačke, oči - žute, itd.), tako i skup radnji prihvatljivih za ovaj objekt (sposobnost jedenja, sjedenja, stajanja, trčanja itd.). Ova kombinacija u jednom objektu i "materijalnih" sastavnih dijelova (glava, uši, rep, šape) i radnji kojima se manipulira tim dijelovima (akcija "trčanja" brzo pomiče šape) naziva se inkapsulacija.

U OOP-u, podaci se nazivaju objektna polja, a algoritmi se nazivaju objektnim metodama.

Enkapsulacija vam omogućava da izolujete objekat iz njegovog spoljašnjeg okruženja u najvećoj mogućoj meri. To značajno povećava pouzdanost razvijenih programa, jer Algoritmi lokalizirani u objektu razmjenjuju relativno male količine podataka s programom, a količina i vrsta ovih podataka se obično pažljivo kontrolira. Kao rezultat toga, zamjena ili modifikacija algoritama i podataka inkapsuliranih u objektu, po pravilu, ne povlači loše sljedljive posljedice za program u cjelini. Još jedna važna posljedica enkapsulacije je lakoća razmjene objekata, njihovog prenošenja iz jednog programa u drugi.

Nasljedstvo

I strukturne i objektno orijentisane metodologije imaju za cilj izgradnju hijerarhijskog stabla odnosa između objekata (podzadataka). Ali ako je strukturna hijerarhija izgrađena na jednostavnom principu podjele cjeline na njene sastavne dijelove,

onda kada se kreira objektno orijentisana hijerarhija, uzima se drugačiji pogled na isti originalni objekat. Objektno orijentirana hijerarhija nužno odražava nasljeđivanje svojstava nadređenih (pretkrivenih) tipova objekata na podređene (osnovne) tipove objekata.

Prema Gradi Boochu, "nasljeđivanje je odnos između objekata u kojem jedan objekt ponavlja strukturu i ponašanje drugog."

Princip nasljeđivanja djeluje u životu svuda i svaki dan. Sisavci i ptice nasljeđuju karakteristike živih organizama, za razliku od biljaka, orao i gavran nasljeđuju zajedničko svojstvo ptica - sposobnost letenja. S druge strane, lavovi, tigrovi, leopardi nasljeđuju „strukturu“ i ponašanje karakteristično za predstavnike reda Felidae, itd.

Tipovi na najvišim nivoima objektno orijentisane hijerarhije uglavnom nemaju konkretne instance objekata. Ne postoji, na primjer, nijedan specifičan živi organizam koji se sam naziva "sisar" ili "ptica". Takvi tipovi se nazivaju apstraktnim. Specifične instance objekata, po pravilu, imaju tipove najnižih nivoa OO hijerarhije: “Krokodil Gena” je specifična instanca objekta tipa “krokodil”, “Matroskin mačka” je specifična instanca objekat tipa “mačka”.

Nasljeđivanje vam omogućava da koristite biblioteke klasa i razvijate ih (poboljšate i modificirate bibliotečke klase) u određenom programu. Nasljeđivanje vam omogućava da kreirate nove objekte promjenom ili dodavanjem svojstava postojećim. Objekt nasljeđivač prima sva polja i metode pretka, ali može dodati svoja polja, dodati svoje metode ili nadjačati naslijeđene metode istog imena svojim vlastitim metodama.

Princip nasljeđivanja rješava problem modifikacije svojstava objekta i daje OOP-u u cjelini izuzetnu fleksibilnost. Kada radi sa objektima, programer obično bira objekat koji je po svojim svojstvima najbliži rešavanju određenog problema, i od njega kreira jednog ili više potomaka koji „mogu” da rade ono što nije implementirano u roditelju.

Dosljedna implementacija principa “naslijediti i promijeniti” dobro se uklapa i u velikoj mjeri ohrabruje inkrementalni pristup razvoju velikih softverskih projekata.

Kada izgradite novu klasu nasljeđivanjem postojeće klase, možete:

  • dodati nove komponente podataka u novu klasu;
  • dodati nove komponente funkcije u novu klasu;
  • zamijenite u novoj klasi komponente funkcije naslijeđene od stare klase.

Polimorfizam

omogućava vam korištenje istih funkcija za rješavanje različitih problema. Polimorfizam se izražava u tome što se pod jednim imenom kriju različite radnje, čiji sadržaj zavisi od vrste objekta.

Polimorfizam je svojstvo povezanih objekata (tj. objekata koji imaju jednog zajedničkog roditelja) da rješavaju probleme koji su slični po značenju Različiti putevi. Na primjer, radnja "trčanja" uobičajena je za većinu životinja. Međutim, svaki od njih (lav, slon, krokodil, kornjača) izvodi ovu akciju na drugačiji način.

Sa tradicionalnim (neobjektno orijentiranim) pristupom programiranju, programer će pomicati životinje pozivajući poseban potprogram za određenu životinju i određenu akciju.

U okviru OOP-a, svojstva ponašanja objekta određena su skupom metoda uključenih u njega, programer samo ukazuje koji objekt treba da izvrši koju od njegovih inherentnih radnji i (za primjer koji se razmatra) jednom opisuje životinjske objekte sami će se kretati na njima svojstven način, koristeći metode uključene u svoj sastav. Promjenom algoritma određene metode u potomcima objekta, programer može dati ovim potomcima specifična svojstva koja roditelj nema. Da biste promijenili metodu, morate je nadjačati u djetetu, tj. deklarisati metod istog imena u potomku i implementirati potrebne akcije u njemu. Kao rezultat, dvije metode istog imena će raditi u nadređenom objektu i podređenom objektu, imajući različitu algoritamsku osnovu i, prema tome, dajući objektima različita svojstva. Ovo se zove polimorfizam objekata.

Tako će se u našem primjeru sa životinjskim objektima radnja „trčati“ nazvati polimorfnom radnjom, a raznolikost oblika manifestacije ove radnje nazvati će se polimorfizmom.

Opis tipa objekta

Klasa ili objekt je struktura podataka koja sadrži polja i metode. Kao i svaka struktura podataka, ona počinje rezerviranom riječi i završava operatorom kraj. Formalna sintaksa nije komplikovana: opis tipa objekta se dobija zamjenom riječi u opisu zapisa rekord na word objekt ili klasa i dodajte deklaraciju funkcija i procedura iznad polja.

Tip<имя типа объекта>= objekt
<поле>;
<поле>;
….
<метод>;
<метод>;
end ;

U ObjectPascal-u postoji posebna rezervirana riječ klasa za opisivanje objekata, posuđeno iz C++.

Tip<имя типа объекта>= klasa
<поле>;
….
<метод>;
<метод>;
end ;

ObjectPascal podržava oba modela opisa objekata.

Komponenta objekta je ili polje ili metoda. Polje sadrži naziv i tip podataka. Metoda je procedura ili funkcija deklarirana unutar deklaracije tipa objekta, uključujući posebne procedure koje kreiraju i uništavaju objekte (konstruktore i destruktore). Deklaracija metode unutar deklaracije tipa objekta sastoji se samo od zaglavlja. Ovo je vrsta preliminarnog opisa potprograma. Tijelo metode slijedi deklaraciju tipa objekta.

Primjer. Uvodi se tip objekta "predak" koji ima polje podataka Ime i može izvršiti dvije radnje:

  • proglasiti: “Ja sam predak!”;
  • daj svoje ime.

Upišite tPredoc = Naziv objekta: string; (polje podataka objekta)
Deklaracija o postupku ; (deklaracija metoda objekata)
Procedure MyName ;
End ;

Tekstovi potprograma koji implementiraju objektne metode moraju biti dati u odjeljku koji opisuje procedure i funkcije. Zaglavlja pri opisivanju implementacije metode ponavljaju zaglavlja data u opisu tipa, ali su dopunjena imenom objekta, koje je tačkom odvojeno od naziva procedure. U našem primjeru:

Procedura tPredoc.Declaration ; (implementacija metode objekta)
početi
writeln("Ja sam predak!");
end ;
Procedura tPredoc.MyName ; (implementacija metode objekta)
početi
writeln("Ja sam", Ime);
kraj;

Unutar opisa metoda za polja i metode ovog tipa naveden jednostavno imenom. Dakle, metoda MyName koristi polje Name bez eksplicitnog navođenja svog vlasništva nad objektom, kao da je izvršena implicitna izjava with<переменная_типа_объект>uradi.

Objekti također znače varijable tipa objekta - nazivaju se kopije. Kao i svaka varijabla, instanca ima ime i tip: oni moraju biti deklarisani.

…….(deklaracija tipa objekta i opis njegovih metoda)
var v 1: tPredoc ; (deklaracija instance objekta)
početi
v1. Ime:= "Petrov Nikolaj Ivanovič";
v1.Declaration;
v1.MyName
kraj.

Korištenje podatkovnog polja v1 objekta je ista sintaksa kao i korištenje polja zapisa. Pozivanje metoda instance objekta znači da se navedena metoda poziva s podacima objekta v 1. Kao rezultat, linije će biti prikazane na ekranu

Ja sam predak!
Ja sam Nikolaj Ivanovič Petrov

Slično zapisima, poljima varijabli tipa objekta može se pristupiti koristeći ili kvalificirane identifikatore ili with naredbu.

Na primjer, u tekstu programa, umjesto operatora

moguće je koristiti operator with ovog tipa

sa v1 do
početi
Ime:= "Petrov Nikolaj Ivanovič";
Deklaracija ;
Moje ime
End ;

Štaviše, upotreba with naredbe sa tipovima objekata, kao i za zapise, nije samo moguća, već i preporučljiva.

Hijerarhija tipova (nasljeđivanje)

Tipovi mogu biti raspoređeni u hijerarhiji. Objekt može naslijediti komponente drugog tipa objekta. Objekat naslednik je dete. Objekt koji se nasljeđuje je predak. Naglašavamo da se nasljeđivanje primjenjuje samo na tipove, a ne na instance objekata.

Ako se uvede tip objekta (predak, roditelj), a treba ga dopuniti poljima ili metodama, tada se uvodi novi tip, deklarisan kao nasljednik (potomak, tip djeteta) prvog i samo nova polja i metode su opisani. Potomak sadrži sva polja tipa pretka. Imajte na umu da su polja i metode pretka dostupne djetetu bez posebnih uputa. Ako opis potomka ponavlja imena polja ili metoda pretka, tada novi opisi nadjačavaju polja i metode pretka.

OOP uvijek počinje osnovnom klasom. Ovo je šablon za osnovni objekat. Sljedeći korak je definiranje nove klase, koja se zove izvedena klasa i proširenje je osnovne.

Izvedena klasa može uključivati ​​dodatne metode koje ne postoje u osnovnoj klasi. Može redefinirati metode (ili ih čak potpuno ukloniti).

Izvedena klasa ne bi trebala nadjačati sve metode osnovne klase. Svaki novi objekat nasljeđuje svojstva osnovne klase, potrebno je samo definirati one metode koje su nove ili su promijenjene. Sve ostale metode osnovne klase smatraju se dijelom izvedene klase. Ovo je zgodno jer... kada se metoda promijeni u osnovnoj klasi, ona se automatski mijenja u svim izvedenim klasama.

Proces nasljeđivanja se može nastaviti. Klasa koja je izvedena iz osnovne klase može sama postati osnovna klasa za druge izvedene klase. Na ovaj način, OO programi kreiraju hijerarhiju klasa.

Najčešće se struktura hijerarhije klasa opisuje kao stablo. Vrhovi stabla odgovaraju klasama, a korijen odgovara klasi koja opisuje nešto zajedničko (najčešće) svim ostalim klasama.

Nasljeđivanje po podređenim tipovima informacijskih polja i metodama njihovih roditeljskih tipova vrši se prema sljedećim pravilima.

Pravilo 1. Informacijska polja i metode roditeljskog tipa nasljeđuju svi njegovi podređeni tipovi, bez obzira na broj srednjih nivoa hijerarhije.

Pravilo 2. Pristup poljima i metodama roditeljskih tipova unutar definicije bilo kojeg podređenog tipa vrši se kao da su opisani u samom tipu djeteta.

Pravilo 3. Nijedan podređeni tip ne može koristiti identifikatore polja svojih roditeljskih tipova.

Pravilo 4. Podređeni tip može definirati proizvoljan broj vlastitih metoda i informacijskih polja.

Pravilo 5. Svaka promjena teksta u roditeljskoj metodi automatski utiče na sve metode podređenih tipova koji ga pozivaju.

Pravilo 6. Za razliku od informacionih polja, identifikatori metoda u podređenim tipovima mogu biti isti kao imena metoda u nadređenim tipovima. U ovom slučaju, kaže se da podređena metoda nadjačava (pritiskuje) roditeljski metod istog imena. Unutar tipa djeteta, kada se specificira ime takve metode, bit će pozvana podređena metoda, a ne roditelj.

Nastavimo s našim primjerom. Pored tipa pretka tPredoc koji smo uveli, možemo uvesti i tipove potomaka:

ture tSon= object(tPredoc) (Tip koji nasljeđuje tPredoc)
deklaracija o postupku; (preklapanje metoda predaka)
procedure Moje ime(Predoc: tPredoc);
end ;

Upišite tGrandSon=object(tSon) (tip naslijeđen od tSon)
deklaracija o postupku ; (preklapanje metoda predaka)
end ;

Ime tipa pretka je dato u zagradi iza riječi objekt. Napravili smo nasljednu hijerarhiju od tri tipa: tSon (“sin”) je nasljednik tipa tPredoc, a tip tGrandSon (“unuk”) je nasljednik tipa tSon. Tip tSon nadjačava metode Declaration i My N a m e, ali nasljeđuje polje Name. Tip tGrandSon poništava samo metodu Declaration i nasljeđuje polje Name od svog zajedničkog pretka, a nadjačani Declaration metod od svog neposrednog pretka (tip tSon).

Hajde da shvatimo šta tačno želimo da promenimo u roditeljskim metodama. Činjenica je da "sin" mora da proglasi nešto drugačije od svog pretka, odnosno da kaže "Ja sam otac!"

procedura tSon.Declaration ; (implementacija metoda potomaka objekata)
početi
writeln("Ja sam otac!");
kraj;

A kada daje svoje ime, "sin" mora dati sljedeće podatke:

  • I<фамилия имя отчество >
  • Ja sam sin<фамилия имя отчество своего предка>

procedura tSon .My Name (predoc: tPredoc);
početi
naslijeđeno Mu Name; (pozovite metodu neposrednog pretka)
writeln("Ja sam sin", predoc.Name, "a");
kraj;

U našem primjeru, potomak tSon iz metode My Name poziva metodu istog imena na svom tipu neposrednog pretka tPredoc. Ovaj poziv je predviđen direktivom naslijeđeno, nakon čega se poziva metoda neposrednog pretka. Ako postoji potreba da se pozove metoda udaljenog pretka u nekom tipu deteta na bilo kom nivou hijerarhije, onda se to može uraditi korišćenjem kvalifikovanog identifikatora, tj. eksplicitno naznačiti naziv tipa roditeljskog objekta i, odvojeno tačkom, naziv njegove metode:

A sada da se pozabavimo "unukom". Metoda u kojoj "unuk" kaže svoje ime je potpuno ista kao i njen neposredni predak (tip tSon), tako da nema potrebe da se zaobilazi ovaj metod, bolje je automatski naslijediti ovu metodu i koristiti je kao svoju. Ali u metodi Declaration treba da deklarirate “Ja sam unuk!”, tako da će se metoda morati redefinirati.

procedura tGrandSon.Declaration;
početi
writeln("Ja sam unuk!");
kraj;

Razmotrimo primjer programa u kojem definiramo instancu tipa tPredoc, zovemo je “djed”, instancu tipa tSon “father” i instancu tipa tGrandSon “unuk”. Zamolimo ih da se predstave.

Primjer programa koji koristi OOP

(naziv programa)
……………….
(odjeljak opisa tipova, uključujući tipove objekata tPredoc, tSon, tGrandSon)
(Napomena! Instance tipova objekata mogu se opisati kao upisane konstante, što smo i uradili u nastavku za primjer)
konst ded: tPredoc = (Ime: "Nikolaj Ivanovič Petrov");
otec: tSon = (Ime: "Petrov Sergej Nikolajevič");
vnuk: tGrandSon = (Ime: "Petrov Oleg Sergejevič");
(odjeljak opisa procedura i funkcija, gdje sve metode deklarirane u tipovima objekata moraju biti napisane)
početi
ded.Declaration; (pozivanje metoda zajedničkih predaka)
ded.My Name;
writeln;
otec.Declaration;
otec.MyName(ded); (pozivanje metoda otec objekta tipa tSon)
writeln;
vnuk.Declaration; (pozivanje metoda vnuk objekta tipa tGrandSon)
vnuk.MyName(otec);
kraj.

Naš program će prikazati:

Primjer prikaza rezultata

Ja sam predak!
Ja sam Nikolaj Ivanovič Petrov

Ja sam otac!
Ja sam Petrov Sergej Nikolajevič
Ja sam sin Petrova Nikolaja Ivanoviča

Ja sam unuk!
Ja sam Oleg Sergejevič Petrov
Ja sam sin Sergeja Nikolajeviča Petrova

Imajte na umu da u zaglavlju procedure tSon. MyName je dat tip podataka tPredoc kao parametar, a kada se koristi ova procedura, varijable tipa tPredoc i tSon mu se prosljeđuju. To je moguće jer je predak tip kompatibilan sa svojim potomcima. Suprotno nije istina. Ako zamijenimo tSon u zaglavlju procedure. MyName kada opisuje parametre tipa tPredoc na tSon, kompajler će ukazati na nekompatibilnost tipa kada koristi varijablu ded u otec liniji. Moje ime(ded).

Polimorfizam i virtuelne metode

Polimorfizam– ovo je svojstvo povezanih objekata (tj. objekata koji imaju isti roditelj) da rješavaju probleme sličnog značenja na različite načine.

Dvije ili više klasa koje su izvedene iz iste osnovne klase nazivaju se polimorfnim. To znači da mogu imati zajedničke karakteristike, ali i svoja svojstva.

Unutar OOP-a, svojstva ponašanja objekta su određena skupom metoda uključenih u njega. Promjenom algoritma određene metode u potomcima objekta, programer može dati ovim potomcima specifična svojstva koja roditelj nema. Da biste promijenili metodu, morate je nadjačati u djetetu, tj. deklarisati metod istog imena u potomku i implementirati potrebne akcije u njemu. Kao rezultat, dvije metode istog imena će raditi u nadređenom objektu i podređenom objektu, imajući različitu algoritamsku osnovu i, prema tome, dajući objektima različita svojstva. Ovo se zove polimorfizam objekata.

U primjeru o kojem se gore govori, sva tri tipa objekata tPredoc, tSon i tGrandSon imaju iste metode Declaration i MyName. Ali tip objekta tSon implementira metodu MyName malo drugačije od svog pretka. I sve tri metode deklaracije istog imena se izvršavaju različito za svaki objekat.

Objektne metode su statične, virtualne i dinamičke.

Statičke metode

uključeno u programski kod tokom kompilacije. To znači da se prije upotrebe programa određuje koja će procedura biti pozvana u datoj tački. Kompajler određuje koji se tip objekta koristi u datom pozivu i zamjenjuje metodom za taj objekt.

Objekti različite vrste može imati statičke metode istog imena. U ovom slučaju, potrebna metoda je određena tipom instance objekta.

Ovo je zgodno, jer se metode različitih tipova objekata koji imaju isto značenje mogu nazvati istim imenom, a to pojednostavljuje razumijevanje i zadataka i programa. Statičko preklapanje je prvi korak polimorfizma. Identična imena su stvar programske pogodnosti, a ne principa.

Virtuelne metode

za razliku od statičkih, oni su povezani sa glavnim kodom u fazi izvršavanja programa. Virtuelne metode pružaju mogućnost određivanja tipa i instanciranja instance objekta u vrijeme izvođenja, a zatim pozivaju metode na tom objektu.

Ovaj fundamentalno novi mehanizam, nazvan kasno vezivanje, obezbeđuje polimorfizam, tj. drugačiji način ponašanja za različite, ali homogene (u smislu nasljeđivanja) objekte.

Opis virtuelne metode razlikuje se od opisa obične metode dodavanjem funkcijske riječi iza zaglavlja metode virtuelno .

procedura metoda (lista parametara); virtuelno;

Upotreba virtuelnih metoda u hijerarhiji tipa objekata ima određena ograničenja:

  • ako je metoda deklarirana kao virtualna, tada se ne može nadjačati u tipu potomka statička metoda;
  • objekti koji imaju virtuelne metode inicijalizuju se posebnim procedurama, koje su, u suštini, takođe virtuelne i nazivaju se konstruktor ;
  • liste varijabli i tipova funkcija u zaglavljima virtuelnih procedura i funkcija koje se preklapaju moraju se u potpunosti podudarati;

Obično uključen konstruktor dodeljuje se posao inicijalizacije instance objekta: dodeljivanje početnih vrednosti poljima, početni prikaz na ekranu itd.

Pored akcija koje u njega unosi programer, konstruktor priprema mehanizam za kasno povezivanje virtuelnih metoda. To znači da se prije pozivanja bilo koje virtualne metode mora izvršiti neki konstruktor.

Konstruktor je posebna metoda koja inicijalizira objekt koji sadrži virtualne metode. Zaglavlje konstruktora izgleda ovako:

konstruktorski metod(lista parametara);

Rezervisana reč konstruktor zamjenjuje riječi procedure i virtual .

Glavna i posebna svrha konstruktora je da uspostavi veze sa tabelom virtuelnih metoda (VMT) – strukturom koja sadrži reference na virtuelne metode. Dakle, konstruktor inicijalizuje objekat uspostavljanjem veze između objekta i VMT-a sa adresama kodova virtuelnih metoda. Kasno povezivanje se dešava tokom inicijalizacije.

Svaki objekat ima svoju VMT tabelu virtuelnih metoda. To je ono što dozvoljava metodi istog imena da poziva različite procedure.

Pomenuvši konstruktor, treba reći i o destructor. Njegova uloga je suprotna: izvodi radnje koje dovršavaju rad s objektom, zatvaraju sve datoteke, brišu dinamičku memoriju, brišu ekran itd.

Zaglavlje destruktora izgleda ovako:

destructor Gotovo ;

Glavna svrha destruktora je da unište VMT datog objekta. Često destruktor ne radi ništa drugo i prazna je procedura.

destructor Gotovo ;
begin end ;

Zasniva se na predstavljanju programa kao skupa objekata. Svaki objekat pripada klasi, koja zauzvrat zauzima svoje mjesto u naslijeđenoj hijerarhiji. Upotreba OOP-a minimizira suvišne podatke, što poboljšava upravljivost i razumijevanje programa.

Šta je OOP

Nastao je kao rezultat razvoja proceduralnog programiranja. Osnova objektno orijentiranih jezika su sljedeći principi:

  • inkapsulacija;
  • nasljedstvo;
  • polimorfizam.

Neki principi koji su prvobitno postavljeni u prvoj OYA pretrpjeli su značajne promjene.

Primjeri objektno orijentiranih jezika:

  1. Pascal. Izlaskom Delphi 7, službeno je postao poznat kao Delphi. Glavno područje upotrebe Object Pascal-a je pisanje aplikativnog softvera.
  2. C++ se široko koristi za razvoj softver, jedan je od najpopularnijih jezika. Koristi se za kreiranje OS, aplikativnih programa, drajvera uređaja, aplikacija, servera, igara.
  3. Java - prevedeno u bajtkod, obrađeno virtuelna mašina Java. Prednost ovog načina izvršenja je njegova nezavisnost od operativnog sistema i hardvera. Postojeće porodice: Standard Edition, Enterprise Edition, Micro Edition, Card.
  4. JavaScript se koristi kao skriptni jezik za web stranice. Sintaksa je vrlo slična C i Javi. Je implementacija Ecmascript-a. Sam Ecmascript se koristi kao osnova za izgradnju drugih kao što su JScript, ActionScript.
  5. Objective-C je izgrađen na jeziku C, a sam C kod je razumljiv kompajleru Objective-C.
  6. Perl je jezik visokog nivoa, interpretiran, dinamičan, opšte namene. Ima bogate mogućnosti za rad sa tekstom, a prvobitno je dizajniran posebno za manipulaciju tekstom. Sada se koristi u sistemskoj administraciji, razvoju, mrežnom programiranju, bioinformatici, itd.
  7. PHP. Skraćenica se prevodi kao pretprocesor hiperteksta. Koristi se za razvoj web aplikacija, posebno serverskog dijela. Uz njegovu pomoć, možete kreirati gui aplikacije koristeći WinBinder pakete.
  8. Python je jezik opšte namene fokusiran na poboljšanje produktivnosti programera i čitljivosti koda. Razvijen je projekat Cython, uz pomoć kojeg se programi napisani na Pythonu prevode u kod na jeziku C.

Apstrakcija

Svaka knjiga poput „Objektno orijentirano programiranje za lutke“ ističe jedan od glavnih principa – apstrakciju. Ideja je da se detalji ili karakteristike implementacije programa razdvoje na one koji su važni i one koji nisu. Neophodan za velike projekte, omogućava vam da radite na različitim nivoima predstavljanja sistema bez specificiranja detalja.

Apstraktni tip podataka je predstavljen kao interfejs ili struktura. Omogućava vam da ne razmišljate o nivou detalja implementacije. ADT je ​​nezavisan od drugih sekcija koda.

Čuveni aforizam David Wheelera kaže: Svi problemi u kompjuterskoj nauci mogu se riješiti na drugom nivou apstrakcije.

Nasljedstvo

Objektno orijentirani jezici su nasljedni - ovo je jedan od najvažnijih principa.

Označava da se neka vrsta funkcionalnosti može ponovo koristiti. Klasa koja nasljeđuje svojstva druge naziva se izvedena, potomka ili podklasa. Onaj od kojeg dolazi do nasljeđivanja naziva se predak, baza ili nadklasa. Odnos potomak-nasljednik stvara posebnu hijerarhiju.

Postoji nekoliko vrsta nasljeđivanja:

  • jednostavan;
  • plural.

Kod višestrukog nasljeđivanja može biti više djece od jednog pretka, dok kod jednostavnog nasljeđivanja može biti samo jedno. Ovo je glavna razlika između tipova.

Nasljeđivanje izgleda ovako:

funkcija draw() (

vrati "samo životinja";

funkcija eat() (

povratak "životinja jede";

klasa krava produžava životinja (

funkcija draw() (

Vrati "nešto što liči na kravu";

Vidimo da je klasa Cow naslijedila sve metode iz klase Animal. Sada, ako izvršimo Cow.eat(), dobićemo "životinja jede", tako da se metoda draw() mijenja. Cow.draw() će vratiti “nešto što izgleda kao krava”, a Animal.draw() će vratiti “samo životinja”.

Enkapsulacija

Enkapsulacija ograničava pristup komponentama drugima, povezuje podatke sa metodama za obradu. Specifikator privatnog pristupa se koristi za enkapsulaciju.

Obično se koncepti inkapsulacije i skrivanja izjednačavaju, ali neki jezici razlikuju ove koncepte. Drugim riječima, svojstva kritična za performanse su zaštićena i ne mogu se mijenjati.

funkcija __construct($name) (

$this->name = $name;

funkcija getName() (

vrati $this->name;

Ime se prihvata kao argument konstruktora. Kada se konstruktor koristi u drugim dijelovima koda, ništa neće moći promijeniti element imena. Kao što vidite, to je interno naznačeno, nije dostupno za druge dijelove koda.

Polimorfizam

Polimorfizam vam omogućava da koristite isto ime za rješavanje sličnih, ali tehnički različitih problema.

Gornji primjer sadrži tabelu. Vidimo klasu CardDesk i klasu GraphicalObject. Oba imaju funkciju zvanu draw(). Izvodi različite radnje, iako ima isto ime.

Ad hoc polimorfizam ili specijalni polimorfizam koristi:

  • funkcije i metode preopterećenja;
  • cast.

Preopterećenje uključuje korištenje nekoliko funkcija s istim imenom, kada se odabir odgovarajućih događa u fazi kompilacije.

Prebacivanje tipa znači pretvaranje vrijednosti jednog tipa u vrijednost drugog tipa. Postoji eksplicitna konverzija - primjenjuje se funkcija koja uzima jedan tip i vraća drugi, implicitna - izvodi je kompajler ili interpreter.

“Jedan interfejs, mnogo implementacija” Bjarne Stroustrup.

Klasa

Klasa je tip podataka koji se sastoji od jednog skupa polja i metoda.

Ima interne i eksterne interfejse za upravljanje sadržajem. Kod kopiranja putem dodjele kopira se sučelje, ali ne i podaci. Različite vrste međusobno djeluju kroz:

  • nasljedstvo;
  • udruženja;
  • agregacija.

Kada nasljeđuje, podređena klasa nasljeđuje sva svojstva roditeljske asocijacije, što podrazumijeva interakciju objekata. Kada je objekat jedne klase uključen u drugu, to se zove agregacija. Ali kada i dalje zavise jedno od drugog u smislu svog životnog veka, ovo je kompozicija.

Jedna od glavnih karakteristika je obim. Različiti jezici različito definišu koncept.

U Object Pascal-u je opisan na sljedeći način:

Ime klase = klasa (super klasa)

(upotreba elemenata je ograničena samo unutar modula)

(ovdje su navedena polja)

(specifikator pristupa postao je dostupan sa Delphijem 2007, što znači isto što i privatno)

(elementi se mogu koristiti unutar ClassName ili prilikom nasljeđivanja)

(elementi su dostupni svima, prikazuju se u Inspektoru objekata)

Ovdje je SuperClass predak od kojeg dolazi do nasljeđivanja.

Za C++ kreacija izgleda ovako:

klasa MyClass: javni roditelj

Moj razred(); // konstruktor

~MyClass(); // destructor

U ovom primjeru, Roditelj je predak, ako postoji. Specifikatori private, public, protected znače istu stvar kao u prethodnom primjeru u Pascalu. Također vidimo konstruktor i destruktor koji su dostupni za bilo koji dio programa. U C++ su svi elementi po defaultu privatni, tako da se ovo može izostaviti.

Mogućnosti implementacije

U središtu objektno orijentiranih jezika je objekt, on je dio klase. Sastoji se od:

  • polja;
  • metoda.

Polje podataka opisuje parametre objekta. Oni predstavljaju određenu vrijednost koja pripada klasi i opisuju njeno stanje i svojstva. Zatvoreni su prema zadanim postavkama, a promjene podataka se dešavaju korištenjem različitih metoda.

Metoda je skup funkcija koje definiraju sve moguće radnje koje se mogu izvesti na objektu. Svi objekti stupaju u interakciju pozivajući jedni druge metode. Mogu biti eksterni ili interni, što je specificirano modifikatorima pristupa.

OOP metodologije

Postoje sljedeće metodologije:

  • Programiranje orijentirano na komponente;
  • Programiranje prototipa;
  • Klasno orijentirano programiranje.

Komponentno orijentisano programiranje se zasniva na konceptu komponente - komponente programa koja je namenjena za ponovnu upotrebu. Implementira se kao skup struktura sa zajedničkim karakteristikama, pravilima i ograničenjima. Pristup se koristi u objektno orijentisanom jeziku Java, gdje se orijentacija komponenti implementira kroz “JavaBeans” napisan prema istim pravilima.

U prototipskom programiranju ne postoji koncept klase – nasljeđivanje se postiže kloniranjem postojećeg prototipa. Ovo je osnova objektno orijentisanog javascript jezici i drugi dijalekti ekmaskripta, kao i lua ili lo. Glavne karakteristike:

  • potomci ne bi trebalo da zadrže strukturnu sličnost sa prototipom (u odnosu klasa-instanca upravo se to dešava);
  • pri kopiranju prototipa, sve metode se nasljeđuju jedan na jedan.

Klasno orijentirano programiranje se fokusira na i instance. Klasa definira zajedničku strukturu, ponašanje za instance koje je usvajaju.

Objektno orijentisani jezici

Svi OOP-ovi su u potpunosti usklađeni sa OOP principima - elementi su objekti koji imaju svojstva. U tom slučaju mogu postojati dodatna sredstva.

OOYA nužno sadrži skup sljedećih elemenata:

  • deklaracija klasa sa poljima, metodama;
  • proširenje putem nasljeđivanja funkcija;
  • polimorfno ponašanje.

Pored gornje liste, mogu se dodati dodatni alati:

  • konstruktor, destruktor, finalizatori;
  • svojstva;
  • indekseri;
  • modifikatori pristupa.

Neki OYA ispunjavaju sve osnovne elemente, drugi djelimično. Drugi su pak hibridni, odnosno kombinovani su sa podsistemima drugih paradigmi. Općenito, OOP principi se mogu primijeniti i na jezik koji nije objektno orijentisan. Međutim, upotreba OTL-a još uvijek ne čini kod objektno orijentiranim.

Jezici jezika podržavaju više od jedne paradigme. Na primjer, PHP ili JavaScript podržavaju funkcionalno, proceduralno, objektno orijentirano programiranje. Java radi sa pet paradigmi: objektno orijentisana, generička, proceduralna, aspektno orijentisana, konkurentna. C# se smatra jednim od najuspješnijih primjera multiparadigmizma. Podržava iste pristupe kao Java, uz dodatak reflektivne paradigme koja je dodata na listu. Jezik kao što je Oz je dizajniran da spoji sve koncepte koji su tradicionalno povezani sa različitim softverskim paradigmama.

Koncept objektno orijentisanog programiranja (OOP) pojavio se prije više od četrdeset godina, kao razvoj ideja proceduralnog programiranja. Ideologija proceduralnog programiranja, po mom mišljenju, nije ništa posebno: svi programi su predstavljeni skupom procedura i funkcija, dok su same procedure i funkcije nizovi naredbi, čije izvršenje mijenja vrijednosti varijabli u memoriji. . Glavni program u proceduralnom programiranju je i procedura (funkcija), čije tijelo može sadržavati pozive drugim procedurama i funkcijama - potprogramima. Suština proceduralnog programiranja je jednostavna: podaci su odvojeni, ponašanje je odvojeno. Pokušao sam prikupiti koje su strukture uključene u njega u posebnom odjeljku. Podjela koda na potprograme, prvo, dozvoljava, a drugo,.

Ideologija objektno orijentisanog programiranja, kao što samo ime kaže, izgrađena je oko koncepta objekta. Objekt kombinuje i podatke i ponašanje. Objekt je bilo koji entitet s kojim se program bavi, odnosno: objekti domene koje modelira program; resursi operativnog sistema; mrežni protokoli i još mnogo toga. U suštini, objekat je isti, ali dopunjen procedurama i funkcijama koje kontrolišu elemente ove strukture. Na primjer, u proceduralnom programskom jeziku, varijabla bi se kreirala zasebno za pohranjivanje naziva datoteke i odvojeno za pohranjivanje njenog deskriptora ( jedinstveni identifikator resurs u operativni sistem), kao i niz procedura za rad sa datotekom: otvaranje datoteke, čitanje podataka iz datoteke i zatvaranje datoteke. Sve ove procedure, pored uobičajenih parametara i varijabli za pohranjivanje rezultata, trebale bi prihvatiti isti deskriptor kako bi se razumjelo o kojoj datoteci je riječ. U objektno orijentisanom jeziku, u istu svrhu, bio bi opisan fajl objekat, koji bi takođe pohranio ime i rukohvat u sebi i pružio korisniku procedure za samo otvaranje, čitanje i zatvaranje (fajl povezan sa određenim objekt). Razlika bi bila u tome što bi ručka bila skrivena od ostatka programa, kreirana u kodu rutine za otvaranje datoteke i korištena samo implicitno od strane samog objekta. Dakle, korisnik objekta (programski kod programa izvan objekta) ne bi trebao svaki put proslijediti ručicu u parametrima procedure. Objekt je skup podataka i metoda za rad s tim podacima, od kojih neki mogu biti skriveni od svijeta oko njega, što uključuje detalje implementacije. Terminologija objektno orijentisanog programiranja biće detaljnije razmotrena u nastavku.

U objektno orijentisanom programskom jeziku, skoro sve je objekt, osim naredbi: i su objekti, a opis greške je objekat, i, konačno, glavni program je takođe objekat. Ostaje razumjeti što je objekt sa stanovišta samog programa, kako se stvara i koristi. Drugi fundamentalni koncept OOP-a je klasa. Klasa je novi tip podataka u poređenju sa proceduralnim programiranjem, čije se instance nazivaju objekti. Klasa je, kao što je već spomenuto, slična kompozitnom tipu podataka ili strukturi, ali je dopunjena procedurama i funkcijama (metodama) za rad sa svojim podacima. Sada je vrijeme da opišemo osnovne pojmove objektno orijentiranog programiranja.

Terminologija objektno orijentiranog programiranja

Prije nego što pređemo na opisivanje prednosti koje OOP daje programerima softvera u procesu i softverskim proizvodima, potrebno je upoznati se sa najčešće korištenim terminima u ovoj oblasti.

Klasa – tip podataka koji opisuje strukturu i ponašanje objekata.

Objekt – instanca klase.

Polje – element podataka klase: varijabla elementarnog tipa, strukture ili druge klase koja je dio klase.

Stanje objekta – skup trenutnih vrijednosti polja objekta.

Metoda – procedura ili funkcija koja se izvršava u kontekstu objekta na kojem je pozvana. Metode mogu promijeniti stanje trenutnog objekta ili stanje objekata koji su im proslijeđeni kao parametri.

Nekretnina – posebna vrsta metoda dizajniranih da modifikuju pojedinačna polja objekta. Imena svojstava su obično ista kao i imena odgovarajućih polja. Izvana, rad sa svojstvima izgleda potpuno isto kao rad sa poljima strukture ili klase, ali u stvari, prije vraćanja ili dodjeljivanja nove vrijednosti polju, može se izvršiti programski kod koji vrši različite vrste provjera, na primjer, provjeru da li je nova vrijednost važeća.

Član razreda – polja, metode i svojstva klase.

Modifikator pristupa dodatna karakteristikačlanova klase, određujući da li im može pristupiti eksterni program ili se koriste isključivo unutar granica klase i skriveni od vanjskog svijeta. Modifikatori pristupa razdvajaju sve članove klase na detalje implementacije i javno ili djelomično javno sučelje.

Constructor – posebna metoda koja se izvršava odmah nakon kreiranja instance klase. Konstruktor inicijalizuje polja objekta - dovodi objekat u njegovo početno stanje. Konstruktori mogu biti sa ili bez parametara. Konstruktor bez parametara naziva se zadani konstruktor, koji može imati samo jedan. Naziv metode konstruktora najčešće se poklapa sa imenom same klase.

Destructor – posebna metoda koju poziva okruženje za izvršavanje programa u trenutku kada je objekt uklonjen iz RAM-a. Destruktor se koristi u slučajevima kada klasa uključuje resurse koji zahtijevaju eksplicitno izdanje (datoteke, veze baze podataka, mrežne veze i tako dalje.)

Interfejs – skup metoda i svojstava objekta koji su javno dostupni i dizajnirani za rješavanje određenog niza problema, na primjer, sučelje za generiranje grafičkog prikaza objekta na ekranu ili sučelje za čuvanje stanja objekta u datoteci ili bazi podataka.

Statički član – bilo koji element klase koji se može koristiti bez kreiranja odgovarajućeg objekta. Na primjer, ako metoda klase ne koristi jedno polje, već radi isključivo s parametrima koji su joj proslijeđeni, onda ništa ne sprječava da se koristi u kontekstu cijele klase, bez kreiranja zasebnih instanci iste. Konstante u kontekstu klase su obično uvijek statični članovi klase.

Ovo nije sve sa terminologijom OOP-a, ali će drugi koncepti povezani sa ovom paradigmom biti razmatrani u sledećem odeljku.

Prednosti objektno orijentiranog programiranja

Hajde sada da razgovaramo o svojstvima koja program stiče kada koristi objektno orijentisani pristup svom dizajnu i kodiranju. Čini mi se da je većina ovih svojstava prednosti OOP-a, ali postoje i druga mišljenja o ovom pitanju...

    Enkapsulacija označava skrivanje detalja implementacije klase nagrađivanjem pojedinačnih članova odgovarajućim modifikatorima pristupa. Tako je sva funkcionalnost objekta usmjerena na interakciju s drugim programskim objektima grupirana u otvoreni interfejs, a detalji su pažljivo skriveni unutra, čime se glavni kod poslovne logike čuva od stvari koje mu nisu potrebne. Enkapsulacija poboljšava pouzdanost vašeg koda jer osigurava da se određeni podaci ne mogu mijenjati izvan klase koja sadrži.

    Nasljedstvo. Kamen temeljac OOP-a. U objektno orijentiranom programiranju moguće je naslijediti strukturu i ponašanje klase od druge klase. Klasa od koje nasljeđuju naziva se bazna ili superklasa, a klasa koja se dobije kao rezultat nasljeđivanja naziva se izvedena ili jednostavno potomka. Bilo koja klasa može djelovati i kao nadklasa i kao potomak. Odnosi nasljeđivanja klasa čine hijerarhiju klasa. Višestruko nasljeđivanje je definicija klase izvedene iz nekoliko superklasa odjednom. Ne podržavaju svi objektno orijentirani programski jezici višestruko nasljeđivanje. Nasljeđe je efikasan metod naglašavajući fragmente koda za višekratnu upotrebu, ali ima i nedostatke, o kojima će biti riječi u nastavku.

    Apstrakcija. Sposobnost kombinovanja klasa u zasebne grupe, naglašavajući zajedničke karakteristike koje su značajne za sve njih (zajednička polja i zajedničko ponašanje). Zapravo, apstrakcija je posljedica nasljeđivanja: bazne klase nemaju uvijek vlastitu projekciju na objekte stvarnog svijeta, već su stvorene isključivo u svrhu isticanja zajedničkih karakteristika cijele grupe objekata. Na primjer, predmet namještaja je osnovni koncept za sto, stolicu i sofu, sve ih objedinjuje činjenica da su pokretna imovina, dio unutrašnjosti prostora, a mogu se izraditi za dom ili ured. , a također se odnose na "ekonomičan" ili "premium" ” na klasu. U OOP-u postoji poseban koncept za ovo: apstraktna klasa - klasa čiji objekti su zabranjeni za kreiranje, ali se mogu koristiti kao osnovna klasa. Nasljeđivanje i apstrakcija omogućavaju opisivanje programskih struktura podataka i odnosa između njih na potpuno isti način kao što izgledaju odgovarajući objekti u sistemu koji se razmatra.

    Primjer dijagrama klasa konstruisanog apstrakcijom tokom analize tipova postojećih vozila prikazan je na sljedećoj slici. Na gornjim nivoima hijerarhiju nasljeđivanja postoje apstraktne klase koje objedinjuju vozila prema najznačajnijim karakteristikama.


    Dijagram klasa ili hijerarhija nasljeđivanja "Vozila". Bijeli kvadrati predstavljaju apstraktne klase.

    Polimorfizam. Još jedna imovina koja je posljedica nasljeđivanja. Činjenica je da objektno orijentirani programski jezici omogućuju rad sa skupom objekata iz iste hijerarhije na isti način kao da su svi objekti njihove osnovne klase. Ako se vratimo na primjer s namještajem, to možemo pretpostaviti u kontekstu stvaranja informacioni sistem Za prodavnicu namještaja, bilo bi razumno dodati zajedničku metodu „prikaži karakteristike“ osnovnoj klasi za sve vrste namještaja. Prilikom ispisivanja karakteristika svih vrsta robe, program bi ovu metodu pozivao neselektivno za sve objekte, a svaki konkretan objekat bi sam odlučio koje informacije će mu dati. Kako se ovo implementira: Prvo, osnovna klasa definira zajedničku metodu za sve sa zajedničkim ponašanjem. U slučaju našeg primjera, ovo će biti metoda koja ispisuje parametre zajedničke za sve vrste namještaja. Drugo, u svakoj izvedenoj klasi, gdje je to potrebno, redefiniraju osnovnu metodu (dodavanjem metode sa istim imenom), gdje proširuju osnovno ponašanje svojim vlastitim, na primjer, prikazuju karakteristike koje su karakteristične samo za određeni tip proizvod namještaja. Metoda u osnovnoj klasi ponekad ne mora sadržavati nikakav kod, već je potrebna samo za definiranje imena i skupa parametara - potpisa metode. Takve metode se nazivaju apstraktne metode, a klase koje ih sadrže automatski postaju apstraktne klase. Dakle, polimorfizam je sposobnost ujednačene komunikacije sa objektima različitih klasa preko specifičnog interfejsa. Ideologija polimorfizma kaže da za komunikaciju sa objektom ne morate znati njegov tip, već koji interfejs podržava.

    Interfejs. U nekim programskim jezicima (C#, Java) koncept sučelja je jasno definiran - to nisu samo javne metode i svojstva same klase. Takvi jezici, po pravilu, ne podržavaju višestruko nasljeđivanje i kompenzuju to tako što dozvoljavaju bilo kojem objektu da ima jedan osnovni objekt i implementira bilo koji broj interfejsa. U njihovoj interpretaciji, interfejs je kao apstraktna klasa koja sadrži samo opis (potpis) javnih metoda i svojstava. Implementacija interfejsa pada na pleća svake klase koja namerava da ga podrži. Isti interfejs mogu implementirati klase potpuno različitih hijerarhija, što proširuje mogućnosti polimorfizma. Na primjer, sučelje „snimanje/vraćanje informacija u bazu podataka“ mogu implementirati obje klase hijerarhije „namještaj“ i klase povezane s narudžbom za proizvodnju namještaja, a kada kliknete na dugme „sačuvaj“, program bi prošao kroz sve objekte, pitao bi ih za ovaj interfejs i pozvao odgovarajući metod.

Objektno orijentirano programiranje stalno se razvija, što dovodi do novih paradigmi kao što su aspektno orijentirano, predmetno orijentirano, pa čak i programiranje orijentirano na agente. Treba napomenuti da lovorike OOP-a proganjaju i druge teoretičare, te se žure da ponude svoje mogućnosti za njegovo poboljšanje i proširenje. Napisao sam posebnu napomenu o tome, ali sada želim reći nekoliko riječi o programiranju prototipa, koje implementira JavaScript jezik na strani klijenta. Prototipsko programiranje eliminira koncept klase, zamjenjujući ga prototipom - primjerom objekta. Dakle, u jeziku orijentisanom na prototip ne postoji koncept tipa objekta, ali postoji koncept obrasca ili prototipa. Prototip je instanca objekta iz kojeg se druge instance kreiraju kopiranjem (kloniranjem) njegovih članova. U JavaScriptu ne opisujete polja i metode klase, već prvo kreirate prazan objekat, a zatim mu dodajete potrebna polja i metode (u JavaScript-u metoda se može definirati i dodati objektu dinamički). Na isti način se kreiraju prototipovi, koje drugi objekti nazivaju svojim prototipom. Ako objekt nema neki metod ili polje koje je navedeno na lokaciji poziva, onda se traži među članovima njegovog prototipa. To sam takođe posebno opisao.

Neki elementi modernog objektno orijentisanog programiranja

Vrijeme ne miruje, a već je prošlo dosta vremena od pojave OOP-a, tako da ne treba da čudi da je danas vokabular objektno orijentisanog programiranja značajno porastao. Evo nekih novih pojmova i koncepata vezanih za OOP.

    Događaji. Posebna vrsta objekata kreirana da obavijesti neke objekte o događajima koji se dešavaju s drugim objektima. U različitim programskim jezicima mehanizam događaja se implementira na različite načine: ponekad koristeći posebne sintaktičke konstrukcije, a ponekad koristeći osnovne OOP alate.

    Univerzalni tip. Koncept generičkih tipova nije direktno povezan sa konceptom OOP-a, ali je razlog za pojavu takvih elemenata kao što su generička klasa, univerzalna metoda, univerzalni događaj itd. Generički tip je tip koji je parametrizovan drugim tipom (skupom tipova). Što je ovaj tip parametra u kontekstu dizajna generičkog tipa nije poznato, iako je moguće ograničiti vrijednosti tipova parametara prisiljavajući ih da proizlaze iz određene klase ili implementiraju određena sučelja. Primjer je univerzalna klasa za sortiranje niza elemenata, gdje je tip elementa u nizu unaprijed nepoznat. Prilikom dizajniranja takve klase, važno je navesti da tip parametra mora podržavati operaciju poređenja. Kada kreirate objekte generičkih tipova, eksplicitno specificirate parametar, kao što je tip cijeli broj ili niz, a sam objekt počinje da se ponaša kao da je instanca klase kreirane posebno za sortiranje cijelih brojeva ili nizova.

    Izuzeci. Još jedan poseban tip objekta podržan mehanizmom za rukovanje greškama i izuzecima ugrađenim u određeni programski jezik. Izuzeci, pored koda greške, sadrže i njegov opis, mogući razlozi pojavljivanja i stog poziva metoda koji su se dogodili prije nego što se dogodila iznimka u programu.

Nedostaci objektno orijentisanog programiranja

Već sam rekao da je popularnost objektno orijentisanog pristupa ogromna. Takođe sam već primetio da ima dosta onih koji žele da prošire ovu paradigmu. Ali postoji još jedan način da se istaknete među ogromnom zajednicom stručnjaka za informacione tehnologije - to je da izjavite da se OOP nije opravdao, da nije lijek za lijek, već placebo. Među tim ljudima ima zaista vrhunskih specijalista, poput Aleksandra Stepanova, Edsgera Dijkstre i drugih, čije mišljenje zaslužuje pažnju, ali ima i onih za koje kažu da „lošem plesaču uvek nešto stane na put. ” Evo ih, najočitijih nedostataka OOP-a, koje stručnjaci ističu:

    OOP generiše ogromne hijerarhije klasa, što dovodi do toga da je funkcionalnost raspoređena ili, kako kažu, zamagljena po osnovnim i izvedenim članovima klase, te postaje teško pratiti logiku rada određene metode.

    U nekim jezicima svi podaci su objekti, uključujući elementarne tipove, a to neizbježno dovodi do dodatne potrošnje memorije i CPU vremena.

    Takođe, na brzinu izvršavanja programa može negativno uticati implementacija polimorfizma, koji se zasniva na mehanizmima za kasno povezivanje poziva metode sa njegovom specifičnom implementacijom u jednoj od izvedenih klasa.

Kako se poboljšavamo kompjuterska tehnologija kompjuteri su se počeli koristiti za rješavanje sve složenijih problema. Pokazalo se da za rješavanje složenih problema nije važna samo povećana računarska snaga računara, već i efikasnost pisanja složenih programa. Objektno orijentirano programiranje(OOP) pojavio se upravo kao efikasan način za prevazilaženje poteškoća koje nastaju pri kreiranju složenih programa.

Najznačajniji dio OOP-a je poseban pristup rješavanju složenih programskih problema tzv objektno orijentisana analiza, i objektno orijentirani programski jezici su jednostavno zgodni alati za implementaciju ovog pristupa.

Priča

Osnivači OOP-a su istaknuti norveški naučnici Cristen Nygaard i Ole-Johan Dahl. Radeći na simulacijama navigacije, Nygaard je shvatio da su postojeći softverski alati neefikasni u kreiranju tako složenih programa, a zatim je Nygaard počeo da razvija koncepte za novo programiranje koji će prevazići barijere složenosti, što je kasnije nazvano objektno orijentisan(sam termin je skovao Alan Kej, autor jezika Java). Zajedno sa Ole-Johanom Dahlom, Nygaard je razvio osnovne principe OOP-a i praktične mehanizme za njihovu implementaciju, koji su potom oličeni u prvoj OOP Simuli. Zasluge ovih naučnika bile su cijenjene od strane svjetske naučne zajednice, a 2001. Nygaard i Dahl su postali laureati nagrade Alan Turing - svojevrsnog analoga Nobelove nagrade u oblasti računarskih nauka.

Simula jezik je bio poznat u akademskim krugovima, ali iz niza razloga nije stekao popularnost među komercijalnim programerima softvera. Ipak, osnovne ideje i mogućnosti OOP-a bile su veoma privlačne programerima. Nakon toga su stvoreni i drugi OY: SmallTalk (1980), C++ (1985), Eiffel (1986), Object Pascal (1986) i Delphi (1995), Oberon-2 (1991), Java (1991), Visual Basic (1991) i mnogo drugih. Neki od ovih jezika su postali industrijski standardi u programiranju.

Karakteristike OOP-a

Osnovna ideja OOP-a je da se kreiraju softverske strukture čije ponašanje i interakcija oponašaju ponašanje i interakciju objekata iz stvarnog svijeta (tj. u programu se kreiraju virtualni analozi stvarnih entiteta). Objektno orijentirani programski jezici trebali bi pružiti sredstva za brzu i laku implementaciju ovog pristupa.

U svakodnevnom životu ljudi koriste (čak i nesvjesno) različite tehnike “ekonomije mišljenja” koje im omogućavaju da shvate i izraze složene fenomene jednostavnim pojmovima. Tipične tehnike "ekonomije razmišljanja" su:

· apstrakcija (odbacivanje nevažnih detalja);

· generalizacija (identifikacija zajedničkih bitnih karakteristika različitih pojava ili objekata);

· klasifikacija (svijest o povezanosti pojava i stepenu njihove sličnosti).

Ove jednostavne tehnike pomažu osobi da se nosi sa složenošću fenomena koji se razmatra. A objektno orijentirani programski jezici bi također trebali pružiti slična sredstva za "borbu protiv složenosti" programa. Da bi se implementirao objektno orijentirani pristup, novi koncepti se uvode u programske jezike:

· objekti - posebne programske strukture koje kombinuju podatke i algoritme za njihovu obradu;

· inkapsulacija - skrivanje detalja funkcionisanja objekata;

· nasljeđivanje je “prečica” za kreiranje novih klasa;

· polimorfizam - mogućnost korištenja nekoliko implementacija jedne funkcije.

Objekti i klase

Objekti su posebne softverske jedinice koje se sastoje od podataka i algoritama da obradi upravo ove podatke. Podaci uključeni u objekt se pozivaju polja(atributi, svojstva, članovi). Algoritmi uključeni u objekt se pozivaju metode(usluge, operacije, funkcije članova). Nažalost, u OOP-u ne postoji jedinstvena terminologija, a različiti jezici koriste različite termine za označavanje istih koncepata.

Casovi- Ovo su objektni tipovi podataka. Baš kao što cijeli brojevi pripadaju cjelobrojnom tipu (kao što je cijeli broj ili bajt), objekti također pripadaju tipu objekta koji se zove klasa. Svi objekti iste klase imaju isti skup polja i isti skup metoda.

U nekim jezicima (C++, Java) objekti se pozivaju instance klase(instance).

Korisnost korištenja klasa i objekata je u tome što provjera logičke (semantičke) korespondencije između podataka i funkcija za obradu podataka postaje trivijalan zadatak i može se u velikoj mjeri delegirati kompajleru (računaru) - sada može sam utvrditi netačnu upotrebu podataka.

Enkapsulacija

Enkapsulacija (bukvalno „skrivanje“) je kontrolisano skrivanje informacija o unutrašnjoj strukturi klase. Klasa može imati polja i metode koje objekti koriste isključivo da bi osigurali njihov rad (na primjer, bafer u dinamičkoj memoriji, fajl sa radnim podacima, metode za rad sa ovom datotekom, itd.). Promjena takvih polja ili pozivanje metoda izvan objekta je opasno - to može poremetiti njegovo radno stanje. Da bi se osigurala sigurnost objekata, takva polja i metode mogu biti sakriti- zabraniti pristup njima izvana.

Sa stanovišta “borbe protiv složenosti”, enkapsulacija vam omogućava da prebacite dio kontrole nad ispravnim radom objekata na kompajler (računar).

Različiti TOE nude različite opcije za inkapsuliranje polja i metode (od potpunog odsustva do automatskog skrivanja svih polja). U industrijskim OAL-ovima, kao što su C++, Java, Delphi, Eiffel, itd., postoje tri nivoa enkapsulacije polja i metoda:

· javno - obratiti se javna polja i nema ograničenja za objektne metode;

zaštićeno - direktan pristup zaštićena polja a metode su moguće samo iz metoda ove klase i metoda podređenih klasa;

privatni - direktan pristup privatnim poljima a metode su moguće isključivo iz metoda ove klase.

Nasljedstvo

Nasljedstvo- kreiranje novih klasa dodavanjem samo razlika od postojećih klasa, izostavljanjem opisa odgovarajućih elemenata. Prilikom nasljeđivanja poziva se nova klasa dječiji razred(izvedeno, dijete, potklasa), a izvorna klasa se poziva klasa predaka(baza, roditelj, super klasa).

Nasljeđivanje smanjuje veličinu programa eliminacijom duplih deklaracija. Sva polja i metode deklarirane u klasi predaka automatski se prenose u klasu potomke i obično se nazivaju naslijeđeno(naslijeđeno).

Ako je potrebno, može biti bilo koja roditeljska metoda redefinisati- tj. dodijeliti izvršenje drugog algoritma u slučaju pozivanja metode istog imena u klasi potomaka.

Neki OY podržavaju višestruko nasljeđivanje, u kojem izvedena klasa nasljeđuje sva svojstva i metode istovremeno od nekoliko klasa. Nažalost, višestruko nasljeđivanje je ispunjeno mnogim logičkim konfliktnim situacijama, a njegova podrška komplikuje programski jezik, a posebno kompajler. Iz tog razloga, višestruko nasljeđivanje je jednostavno zabranjeno u mnogim OOY-ovima, ali se može simulirati.

Skup svih klasa predaka i potomaka se zove hijerarhija klasa.

Nasljeđivanje klasa je centralni koncept OOP-a, svi ostali koncepti i mehanizmi su direktno ili indirektno zasnovani na njemu. Ogromna većina OOP mehanizama zahtijeva izgradnju hijerarhije klasa kako bi se pokazale njihove prednosti.

Polimorfizam

Polimorfizam(doslovno - "raznolikost oblika") - mogućnost korištenja jednog imena za nekoliko metoda (ili funkcija) koje imaju sličnu svrhu. Drugo tumačenje je da jedna metoda (funkcija) može imati nekoliko opcija implementacije; takva metoda (funkcija) se zove polimorfna. Kao i drugi OOP mehanizmi, polimorfizam je sredstvo za pojednostavljenje razvoja složenih programa. U stvari, polimorfizam razdvaja koncept Šta mora se uraditi jer Kako ovo se mora uraditi.

Ako povučemo analogiju sa pravi zivot, tada polimorfizam odgovara generaliziranim akcijama. Na primjer, glagol “svirati muziku” znači “svirati muzički instrument”. Ali različiti muzički instrumenti sviraju se različito. Postoji jedan termin, ali mnogo opcija za akciju. Dakle, "puštaj muziku" - polimorfno djelovanje. U OOP-u bi odgovarala akcija „puštaj muziku“. polimorfna metoda, koji ima svoje implementacije za svaku klasu muzičkih instrumenata.

Postoje dvije vrste polimorfnih metoda u OOP-u - preopterećen I virtuelno.

Preopterećene metode dizajniran za izvođenje sa podacima različitih tipova. Imaju ista imena, ali različite liste argumente i/ili tip povratka.

Virtuelne metode dizajniran za izvođenje operacije koje su identične po značenju u objektima srodnih, ali ne i identičnih klasa. Virtuelne metode imaju ista imena i prototipove. Njihov glavna karakteristika- uvijek tačno odgovaraju stvarnoj klasi objekta.

Tipičan primjer preopterećenih funkcija je funkcija SQR u Pascalu. Izračunava kvadrat broja, a za cjelobrojne argumente rezultat će također biti cijeli broj, a za realne argumente će biti realan.

Prednosti virtuelnih metoda pojavljuju se samo kada se koristi hijerarhija klasa. Tipična upotreba virtuelnih metoda je sljedeća:

· U klasi predaka hijerarhije, deklarisana je polimorfna metoda koja opisuje neku korisnu akciju. U ovom slučaju, ili koristi virtuelnu metodu, ili je sama virtuelna.

· U klasama potomaka, odgovarajuća virtuelna metoda je nadjačana - za svaku klasu potomaka ova korisna akcija se izvodi na svoj način.

· Kada pozovete polimorfnu metodu na objektu koji pripada klasi potomaka, zapravo se koristi virtuelna metoda klase potomaka (a ne klase pretka).

Upečatljiv primjer ove upotrebe virtuelnih metoda je Delphi ili Visual Basic sistem grafičkog interfejsa prozora: svaki vidljivi element grafičkog interfejsa je dugme, klizač, prozor itd. - mora biti potomak klase TControl. Klasa TControl uvodi uobičajene polimorfne metode za crtanje GUI elemenata, a bilo koji od njenih potomaka može se nacrtati na ekranu na svoj način.

Objektno orijentirano programiranje nije eksplicitno navedeno u Standardu iz 2004. godine, iako je takva tema bila prisutna u Obaveznom minimalnom sadržaju obrazovanja iz računarstva za studente specijalizovanih institucija (nivo B): Objektno orijentirano programiranje: objekt, svojstva objekta, operacije na objektu. Tehnologija objektno-orijentisanog programiranja je takođe spomenuta.

Ipak, OOP ne samo da je postao dio prakse nastave informatike (programiranja) u mnogim školama, već je prisutan i na stranicama školskih udžbenika ( Ugrinovich N.D. Računarstvo i informacione tehnologije. Udžbenik za 10–11 razred, 2005. M.: BINOM. Laboratorija znanja). Osim toga, koncepti objekt i njega svojstva.

Tehnologija (paradigma) OOP-a ne zahtijeva toliko majstorstvo moderna tehnologija programiranje, koliko i sposobnost da se razvije objektni model problema koji se rješava. Za to je potrebno dobro poznavanje osnovnih principa OOP-a i programiranja općenito, ali poznavanje bilo kojeg OOP-a nije obavezno - o tome su osnivači i teoretičari OOP-a više puta pisali. Tako Grady Booch u svojoj knjizi “Objektno-orijentirani dizajn i analiza” izražava sljedeću maksimu: “Možete pisati programe u objektno orijentiranom stilu u bilo kojem (neobjektno orijentisanom) programskom jeziku.” Da biste izgradili algoritam koristeći OOP tehnologiju, potrebno je generirati listu objekata s kojima algoritam radi, razmisliti o svojstvima svakog objekta i implementirati algoritam kao interakciju opisanih objekata.

Kao što je već spomenuto u članku, ovaj pristup pojednostavljuje rješavanje složenih problema, ali unutar škole (s obzirom na ograničen broj sati) teško je doći do smislenih zadataka učenja koji ne bi izmišljeno zahtijevali korištenje OOP tehnologije za učenike. najpotpuniji.

Zapravo, OOP se u školi smatra samo sastavnim dijelom vizuelnog i komponentnog programiranja u savremenim profesionalnim sistemima programiranja, a kao objekti se koriste gotove biblioteke objekata različitih nivoa - to su biblioteke za izgradnju grafičkog interfejsa za Windows aplikacije, i višenamjenske biblioteke univerzalnih tipova podataka (na primjer, STL u C++). Za primitivnu upotrebu ovih biblioteka dovoljno je znati i biti u stanju primijeniti nekoliko jednostavnih pravila sintakse programskog jezika. Međutim, takvo „znanje“ ni na koji način ne približava studente profesionalnom ovladavanju programskim jezikom, pa čak ni razumijevanju OOP-a. Ali, očigledno, u tome nema ništa loše. Školska informatika, čak ni u specijalizovanoj školi, nema za cilj obuku profesionalnih programera. Nastava OOP-a je posebna tema čak i na relevantnim specijalnostima na univerzitetima, često se ne proučava dovoljno detaljno.

Ne poričući u potpunosti prijedlog nekih nastavnika informatike da se objektno orijentirani pristup stavi u prvi plan izučavanja programiranja, pa tako i u školi, napominjemo da je OOP nemoguć bez osnovnih pojmova kao što su program, izvršilac, varijabla, uvjet, petlja itd. . Koncept OOP-a također uključuje klasično proceduralno programiranje (vidi “ Potprogrami“, poput Ajnštajnove mehanike – Njutnove mehanike: dovoljno je zamisliti proceduralni program kao jedan objekat čiji je naziv izostavljen radi jednostavnosti. Stoga je, prije svega, zadatak kursa programiranja u školi naučiti osnovne stvari. I to samo ako je moguće raditi sa modernim okruženjima za vizuelno programiranje (Delphi, Visual Basic, Visual C++
itd.) uvode koncept objekata i njihovu upotrebu uglavnom kroz nastavnu metodu programiranja zasnovanu na modelu.

(OOP) organizira podatke i algoritme koje obrađuje program. U ovom slučaju, programer kreira forme podataka i algoritme koji odgovaraju glavnim karakteristikama problema koji se rješava. Zovu se modeli podataka i algoritmi koji ih obrađuju casovi, A objekata- ovo su njihovi specifični predstavnici koji se koriste u programu.

Od općih objekata stvaraju se drugi, više specijalizirani. Mehanizam za kreiranje takvih podobjekata se zove nasleđe. Kao rezultat toga, ovi programi su objektni model- stablo objekata, počevši od gornjeg najapstraktnijeg i generalnog objekta.

OOP kombinuje najbolje principe strukturiranog programiranja sa moćnim novim konceptima, od kojih se osnovni nazivaju enkapsulacija, polimorfizam i nasljeđivanje.

Primjer objektno orijentiranih jezika su: Object Pascal , C++, Java.

OOP vam omogućava da optimalno organizirate programe razbijanjem problema na njegove sastavne dijelove i radom sa svakim zasebno.

Objektno orijentirano programiranje je razvoj tehnologije strukturiranog programiranja, ali ima svoje karakteristične karakteristike. Osnovna jedinica u objektno orijentiranom programiranju je objekt, koji sadrži i enkapsulira i podatke koji ga opisuju (osobine) i sredstva za obradu ovih podataka (metode). OOP sistemi obično koriste grafičko sučelje za vizualizaciju procesa programiranja. Postaje moguće kreirati objekte, postaviti njihova svojstva i ponašanje pomoću miša.

Objekt je kombinacija podataka i koda. Drugim riječima, objekt se također zove predstavnik(neke klase) je dio podataka čija vrijednost određuje njegovo trenutno stanje i skup potprograma tzv. metode operišući sa ovim podacima i utvrđivanje ponašanje objekat, tj. njegova reakcija na vanjske utjecaje.

Objekat se sastoji od sledeća tri dela:

Naziv objekta;

Stanje (varijable stanja);

Metode (operacije).

Svaki objekt je predstavnik (instanca) određenog klasa. Tokom izvršavanja programa, objekti stupaju u interakciju jedni s drugima pozivajući metode, koje su potprogrami specifični za određenu klasu.

Klasa(klasa) je grupa podataka i metoda (funkcija) za rad sa ovim podacima. Ovo je šablon. Objekti sa istim svojstvima, odnosno sa istim skupovima varijabli stanja i metoda, formiraju klasu. Objekt je konkretna implementacija, instanca klase. U programiranju se odnos između objekta i klase može uporediti sa opisom varijable, gdje je sama varijabla (objekat) instanca nekog tipa podataka (klase).


Objektno orijentirano programiranje se svodi na kreiranje određenog broja klasa, opisivanje odnosa između ovih klasa i njihovih svojstava i daljnju implementaciju rezultirajućih klasa.

Teorijski pristup. Klasa je jedna od opcija za opisivanje entiteta, koji se u teoriji programiranja naziva apstraktnim tipom podataka. Klasa definiše skrivenu unutrašnju strukturu vrednosti, kao i skup operacija koje se mogu primeniti na tu vrednost.

Praktičan pristup. U modernim objektno orijentisanim programskim jezicima (php, Java, C++, Oberon, Python, Ruby, Smalltalk, Object Pascal), kreiranje klase se svodi na pisanje strukture koja sadrži skup polja i metoda. U praksi se klasa može shvatiti kao neka vrsta šablona prema kojem se kreiraju objekti – instance date klase. Instance iste klase kreiraju se pomoću istog predloška i stoga imaju isti skup polja i metoda.

Odnosi između klasa:

Nasljeđivanje (generalizacija) - objekti podređene klase nasljeđuju sva svojstva roditeljske klase.

Asocijacija - objekti klasa međusobno djeluju.

Agregacija - objekti jedne klase su uključeni u objekte druge.

Kompozicija - objekti jedne klase su uključeni u objekte druge i zavise jedni od drugih u smislu njihovog vijeka trajanja.

Klasa-Metaklasa je odnos u kojem su druge klase instance jedne klase.

Vrste časova:

Osnovna (roditeljska) klasa;

Izvedena klasa (nasljednik, potomak);

Apstraktna klasa;

Virtual class;

Interface.

Klasa je strukturni tip podataka koji uključuje opis polja podataka, kao i procedure i funkcije koje rade na tim poljima podataka. U odnosu na klase, takve procedure i funkcije se pozivaju metode.

Metode- procedure i funkcije inkapsulirane u klasu, odnosno načini rada sa podacima.

Klase i objektno orijentirano programiranje zasnivaju se na tri principa: - inkapsulacija, nasleđe I polimorfizam.

Enkapsulacija(skrivanje) je svojstvo programskog jezika koje vam omogućava da kombinujete podatke i kod u objekat i sakrijete implementaciju objekta od korisnika. U ovom slučaju, korisniku se dostavlja samo specifikacija (interfejs) objekta. Korisnik može komunicirati sa objektom samo preko ovog interfejsa.

Najčešće se enkapsulacija ostvaruje skrivanjem informacija, odnosno maskiranjem svih unutrašnjih detalja koji ne utiču na eksterno ponašanje. Obično su skrivene i unutrašnja struktura objekta i implementacija njegovih metoda.

Ciljevi inkapsulacije:

§ ekstremna lokalizacija promjena ako su takve promjene neophodne,

§ predvidljivost promjena (koje promjene u kodu treba napraviti za datu promjenu funkcionalnosti) i predvidljivost posljedica promjena.

Enkapsulacija- ovo je proces odvajanja jednih od drugih elemenata objekta koji određuju njegovu strukturu i ponašanje. Često se inkapsulacija može postići jednostavnim organizacijskim mjerama: saznanje da "ovo nije nešto što ne možete učiniti" ponekad je najefikasnije sredstvo za inkapsulaciju!

Enkapsulacija- kombinovanjem zapisa sa procedurama i funkcijama koje manipulišu poljima ovih zapisa formira se novi tip podataka - objekat.

Enkapsulacija- izolacija komponenti klase (polja, metoda i svojstava) od ostalih dijelova programa.

Suština inkapsulacije: Varijable stanja objekta su skrivene od vanjskog svijeta. Promjena stanja objekta (njegovih varijabli) je moguća SAMO korištenjem njegovih metoda (operacija). Zašto je ovo toliko važno? Ovaj princip vam omogućava da zaštitite varijable stanja objekta od zloupotrebe.

Upotreba ove metode dovodi do smanjenja efikasnosti pristupa elementima objekta. To je zbog potrebe da se pozovu metode za promjenu unutrašnjih elemenata (varijabli) objekta. Međutim, kada savremenom nivou razvoj kompjuterske tehnologije, ovi gubici u efikasnosti ne igraju značajnu ulogu.

Nasljedstvo- jedan od četiri najvažnija mehanizma objektno orijentisanog programiranja (uz inkapsulaciju, polimorfizam i apstrakciju), koji vam omogućava da opišete novu klasu na osnovu već postojeće (nadređene), dok su svojstva i funkcionalnost roditeljske klase pozajmila nova klasa.

Nasljedstvo- ovo je proces kojim jedan objekt može naslijediti svojstva drugog objekta i dodati im karakteristike koje su karakteristične samo za njega. Smisao i univerzalnost nasljeđivanja leži u činjenici da ne morate svaki put iznova (od nule) opisivati ​​novi objekt, već možete specificirati roditelj (osnovnu klasu) i opisati karakteristične karakteristike nova klasa. Kao rezultat, novi objekat će imati sva svojstva roditeljske klase plus svoje vlastite karakteristične karakteristike.

Nasljedstvo- predstavlja mogućnost izgradnje hijerarhije objekata koristeći nasljeđivanje njihovih karakteristika.

Nasljedstvo. Nasljeđivanje je svojstvo objekta koje mu omogućava da koristi polja i metode roditeljskog objekta, a da ih ne opisuje u svojoj strukturi.

Nasljedstvo- mogućnost kreiranja novih klasa na osnovu postojećih sa mogućnošću korišćenja njihovih komponenti. Objekt koji pripada klasi potomaka može koristiti polja, svojstva i metode roditeljske klase i nove komponente svoje klase.

Ako je nova metoda istog imena kao i metoda roditeljske klase opisana u klasi potomaka, onda kažu da je roditeljski metod "preodređen" u potomku. Drugim riječima, klasa potomak implementira specifikaciju već postojeće klase (bazna klasa). Ovo vam omogućava da tretirate objekte klase potomaka na isti način kao i objekte osnovne klase. Prilikom kreiranja hijerarhije klasa, neka svojstva objekata se, uz zadržavanje imena, suštinski mijenjaju.

Za implementaciju takvih hijerarhija, programski jezik obezbeđuje polimorfizam. Riječ polimorfizam je grčkog porijekla i prevedena je kao „ima mnogo oblika“.

Polimorfizam. Dodjeljivanje jednog imena radnji, koje se zatim dijeli prema dolje i gore u hijerarhiji objekata, pri čemu svaki objekt u hijerarhiji izvodi tu radnju na način koji mu odgovara.

Polimorfizam je svojstvo koje omogućava korištenje istog imena za rješavanje nekoliko tehnički različitih problema.

U OOP terminima, možemo reći da svi tipovi tipki interfejsa imaju mogućnost da se prikažu na ekranu. Međutim, metoda (procedura) je različita za svaki tip dugmeta. Jednostavno dugme se iscrtava na ekranu postupkom „prikazivanje slike jednostavnog dugmeta“, dugme za prebacivanje se iscrtava na ekranu postupkom „prikazivanje slike dugmeta za prebacivanje“ itd.

Dakle, postoji jedna akcija za čitavu listu dugmadi interfejsa (prikazivanje slike dugmeta na ekranu), koja je implementirana na način specifičan za svako dugme. Ovo je manifestacija polimorfizma.

Polimorfizam- sposobnost nastave da rješava slične probleme na različite načine. Kada se roditeljski metod nadjača, novi algoritam za rješavanje problema se implementira u dijete. Ispostavilo se da u nadređenom objektu i podređenom objektu postoje dvije metode istog imena, koje imaju različitu algoritamsku osnovu.

Polimorfizam- ovo je metoda djelovanja sa skupom objekata istog pretka u jednom koraku, bez detaljnih operacija sa svakim konkretnim objektom. Takođe je osnova za proširivost objektno orijentisanih programa jer omogućava starijim programima način da prihvate nove tipove podataka koji nisu definisani kada je program napisan.

U opštem smislu, koncept polimorfizma je ideja „jednog interfejsa, mnogo metoda“. To znači da možete kreirati zajednički interfejs za grupu povezanih akcija.

Prednost Polimorfizam je da pomaže u smanjenju složenosti programa dopuštajući da se jedan interfejs koristi za jednu klasu akcija. Izbor određene akcije, ovisno o situaciji, ostaje na kompajleru.

U OOP-u, cilj polimorfizma je korištenje jednog imena za definiranje akcija zajedničkih za klasu. U praksi to znači mogućnost objekata da izaberu internu proceduru (metodu) na osnovu vrste podataka primljenih u poruci.

Mehanizam OOP rada u takvim slučajevima može se opisati otprilike ovako: pri pozivanju jedne ili druge metode klase prvo se traži metoda same klase. Ako je metoda pronađena, ona se izvršava i potraga za ovom metodom se završava. Ako metoda nije pronađena, onda se okrećemo roditeljskoj klasi i tražimo pozvanu metodu na njoj. Ako se pronađe, nastavljamo kao da smo pronašli metodu u samoj klasi. A ako ne, nastavljamo dalje pretraživanje po hijerarhijskom stablu. Do korijena (najviša klasa) hijerarhije.

mob_info