Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Vijesti
  • Značajke objektno orijentiranog programiranja. Načela objektno orijentiranog programiranja

Značajke objektno orijentiranog programiranja. Načela objektno orijentiranog programiranja

Paradigme programiranja

Objektno orijentirano programiranje (OOP)- metodologija programiranja koja se temelji na predstavljanju programa kao skupa objekata, od kojih je svaki instanca određene klase, a klase tvore hijerarhiju nasljeđivanja.

Treba napomenuti sljedeće važne dijelove ove definicije: 1) objektno orijentirano programiranje koristi objekte, a ne algoritme kao glavne logičke građevne blokove; 2) svaki objekt je instanca određene klase; 3) klase tvore hijerarhije. Program se smatra objektno orijentiranim samo ako su zadovoljena sva tri zahtjeva. Posebno se programiranje koje ne koristi nasljeđivanje ne naziva objektno orijentiranim, već programiranje s apstraktnim tipovima podataka.

Enciklopedijski YouTube

    1 / 5

    ✪ Objektno orijentirano programiranje u 2019

    ✪ Objektno orijentirani dizajn, 1. dio - Kako su dizajnirane klase

    ✪ Osnovni principi objektno orijentiranog programiranja. Što je OOP i zašto je potreban?

    ✪ Osnove OOP-a u C++

    ✪ Objektno orijentirano programiranje. Klase i objekti. Lekcija 3

    titlovi

Osnovni koncepti

Apstrakcija podataka Apstrakcija znači izdvajanje značajnih informacija i isključivanje nevažnih informacija iz razmatranja. OOP razmatra samo apstrakciju podataka (često to jednostavno nazivajući "apstrakcijom"), što znači skup značajnih karakteristika objekta koji je dostupan ostatku programa. Enkapsulacija Enkapsulacija je svojstvo sustava koje vam omogućuje kombiniranje podataka i metoda koje rade s njima u klasi. Neki jezici (kao što su C++, Java ili Ruby) poistovjećuju enkapsulaciju sa skrivanjem, ali drugi (Smalltalk, Eiffel, OCaml) prave razliku između ovih pojmova. Nasljeđivanje Nasljeđivanje je svojstvo sustava koje vam omogućuje da opišete novu klasu na temelju postojeće s djelomično ili potpuno posuđenom funkcionalnošću. Klasa iz koje se nasljeđivanje izvodi naziva se baza, roditelj ili nadklasa. Nova klasa je potomak, nasljednik, dijete ili izvedena klasa. Polimorfizam podtipa Polimorfizam podtipa (u OOP-u jednostavno nazvan "polimorfizam") je svojstvo sustava koje vam omogućuje korištenje objekata s istim sučeljem bez informacija o tipu i unutarnjoj strukturi objekta. Drugi tip polimorfizma - parametarski - u OOP-u naziva se generalizirano programiranje. Klasa A je univerzalni, složeni tip podataka koji se sastoji od tematski unificiranog skupa “polja” (varijabli elementarnijih tipova) i “metoda” (funkcija za rad s tim poljima), odnosno model je informacijska cjelina s unutarnjim i vanjskim sučeljima za upravljanje njezinim sadržajem (vrijednosti polja). Konkretno, klase široko koriste posebne blokove jedne ili češće dvije uparene metode odgovorne za elementarne operacije s određenim poljem (sučelje za dodjelu i čitanje vrijednosti), koje simuliraju izravan pristup polju. Ti se blokovi nazivaju "svojstva" i imaju gotovo isto specifično ime kao i njihovo polje (na primjer, naziv polja može započeti malim slovom, dok naziv svojstva može započeti velikim slovom). Druga manifestacija prirode sučelja klase je da se kod kopiranja odgovarajuće varijable putem dodjele kopira samo sučelje, ali ne i sami podaci, odnosno klasa je referentni tip podataka. Varijabla objekta koja je tipa određenog klasom naziva se instancom te klase. Štoviše, u nekim runtime sustavima, klasa također može biti predstavljena nekim objektom tijekom izvođenja programa kroz identifikaciju dinamičkog tipa podataka. Tipično, klase se razvijaju na takav način da osiguraju cjelovitost podataka o objektu, kao i prikladno i jednostavno sučelje, u skladu s prirodom objekta i zadatkom koji se rješava. Zauzvrat, cjelovitost predmetnog područja objekata i njihovih sučelja, kao i pogodnost njihovog dizajna, osigurani su nasljeđivanjem. Objekt Entitet u adresnom prostoru računalnog sustava koji se pojavljuje kada se kreira instanca klase (na primjer, nakon pokretanja rezultata kompilacije i povezivanja izvornog koda za izvođenje).

Klasifikacija podvrsta OOP-a

Luca Cardelli i Martin Abadie izgradili su teorijsko obrazloženje za OOP i klasifikaciju temeljenu na ovom obrazloženju. Primjećuju da se pojmovi i kategorije koje su identificirali ne nalaze zajedno u svim objektno orijentiranim jezicima; većina jezika podržava samo podskupove teorije, a ponekad čak i čudna odstupanja od nje.

Najuočljivije razlike u manifestaciji pokazatelja kvalitete između jezika različitih tipova:

  • U glavnim jezicima, deklarirana načela usmjerena su na povećanje stope ponovne upotrebe koda, koja je u početku niska za imperativno programiranje. U polimorfno tipiziranim aplikacijama, korištenje OOP koncepata, naprotiv, znači njegovo očito smanjenje zbog prijelaza s parametarskog polimorfizma na ad hoc polimorfizam. Dinamički tipizirani jezici (Smalltalk, Python, Ruby) koriste ove principe za logičnu organizaciju programa, a njihov utjecaj na stope ponovne upotrebe teško je predvidjeti - uvelike ovisi o disciplini programera. Na primjer, u CLOS-u, multimetode su istovremeno prvorazredne funkcije, što im omogućuje da se istovremeno smatraju povezani kvantificirani, i kao generalizirani (pravi polimorfni).
  • Korištenje tradicionalnih OO jezika nominativno tipkanje, odnosno dopuštenost suuporabe objekata različitih klasa samo ako su izričito naznačeni srodni odnosi između klasa. Polimorfno tipizirani jezici karakteriziraju strukturna tipizacija, odnosno koordinacija klasa među sobom istim mehanizmom kao koordinacija broja 5 s tipom int. Dinamički upisani jezici ovdje također zauzimaju srednji položaj.

Generalizirano obrazloženje dinamička otprema(uključujući višestruke) izgradio je Giuseppe Castagna sredinom 1990-ih.

Priča

OOP je nastao kao rezultat razvoja ideologije proceduralnog programiranja, gdje podaci i potprogrami (procedure, funkcije) za njihovu obradu nisu formalno povezani. Za daljnji razvoj objektno orijentiranog programiranja često su od velike važnosti koncepti događaja (tzv. event-oriented programming) i komponente (component programming, COP).

Interakcija objekata događa se kroz. Rezultat daljnjeg razvoja OOP-a, po svemu sudeći, bit će agentski orijentirano programiranje, gdje agenti- nezavisni dijelovi koda na razini izvršenja. Agenti međusobno djeluju kroz promjene okoliš, u kojem se nalaze.

Jezične konstrukcije koje nisu strukturno povezane izravno s objektima, ali ih prate radi njihovog sigurnog (iznimne situacije, provjere) i učinkovitog rada, kapsuliraju se iz njih u aspekte (u aspektno orijentiranom programiranju). Subjektno orijentirano programiranje proširuje koncept objekta pružajući jedinstveniju i neovisniju interakciju između objekata. To može biti prijelazna faza između OOP-a i agentskog programiranja u smislu njihove neovisne interakcije.

Prvi programski jezik koji je uveo osnovne koncepte koji će kasnije postati paradigma bio je Simula, ali termin "orijentacija prema objektima" nije korišten u kontekstu korištenja ovog jezika. U vrijeme kada se pojavio 1967. godine, predlagao je revolucionarne ideje: objekte, klase, virtualne metode itd., ali sve to suvremenici nisu doživjeli kao nešto grandiozno. Zapravo, Simula je bila "Algol s klasama", pojednostavljujući izraz u proceduralnom programiranju mnogih složenih koncepata. Koncept klase u Simuli može se u potpunosti definirati kroz kompoziciju Algol konstrukata (tj. klasa u Simuli je nešto složeno, opisano kroz primitive).

Pogled na programiranje iz “novog kuta” (različitog od proceduralnog) predložili su Alan Kay i Dan Ingalls na jeziku Smalltalk. Ovdje je koncept klase postao temeljna ideja za sve ostale konstrukcije jezika (to jest, klasa u Smalltalku je primitiva kojom se opisuju složenije konstrukcije). Upravo je on postao prvi široko korišteni objektno orijentirani programski jezik.

Trenutno je broj primijenjenih programskih jezika (popis jezika) koji implementiraju objektno orijentiranu paradigmu najveći u odnosu na druge paradigme. Najčešći jezici u industriji (C++, Delphi, C#, Java, itd.) utjelovljuju objektni model Simula. Primjeri jezika temeljenih na modelu Smalltalk su Objective-C, Python, Ruby.

Definicija OOP-a i njegovi osnovni pojmovi

U središtu OOP-a je koncept objekt. Objekt je entitet kojem se mogu slati poruke i koji na njih može odgovoriti pomoću svojih podataka. Objekt je instanca klase. Podaci o objektu skriveni su od ostatka programa. Skrivanje podataka naziva se enkapsulacija.

Prisutnost enkapsulacije dovoljna je za objektivnost programskog jezika, ali još ne znači da je objektno orijentiran - to zahtijeva prisutnost nasljeđivanja.

Ali čak ni prisutnost enkapsulacije i nasljeđivanja ne čini programski jezik potpuno objektnim s OOP točke gledišta. Glavne prednosti OOP-a pojavljuju se samo kada programski jezik implementira polimorfizam podtipova - sposobnost uniformne obrade objekata s različitim implementacijama, pod uvjetom da postoji zajedničko sučelje.

Poteškoće s definiranjem

OOP ima povijest dužu od četrdeset godina, ali unatoč tome još uvijek ne postoji jasna općeprihvaćena definicija ove tehnologije. Osnovni principi postavljeni u prvim objektnim jezicima i sustavima pretrpjeli su značajne promjene (ili iskrivljenja) i dodatke u brojnim implementacijama kasnijih vremena. Osim toga, otprilike od sredine 1980-ih izraz "objektno orijentiran" postao je moderan, kao rezultat toga, dogodilo mu se isto što i nešto ranije s pojmom "strukturno" (koji je postao moderan nakon širenja strukturnog programiranja tehnologija) - postalo je umjetno "vezano" za bilo koji novi razvoj kako bi se osigurala njihova atraktivnost. Björn Stroustrup je 1988. napisao da se opravdanje za “orijentiranost na objekt” nečega, u većini slučajeva, svodi na lažni silogizam: “X je dobar. Objektna orijentacija je dobra. Stoga"X je objektno orijentiran."

Roger King je tvrdio da je njegova mačka objektno orijentirana. Među ostalim prednostima, mačka pokazuje karakteristično ponašanje, reagira na poruke, obdarena je naslijeđenim reakcijama i sama upravlja svojim, potpuno neovisnim, unutarnjim stanjem.

Međutim, općenitost mehanizma slanja poruka ima i drugu stranu - "punopravni" prijenos poruka zahtijeva dodatne troškove, što nije uvijek prihvatljivo. Stoga mnogi moderni objektno orijentirani programski jezici koriste koncept "slanje poruke kao poziva metode"- objekti imaju eksterno dostupne metode, čiji pozivi osiguravaju interakciju objekata. Ovaj pristup implementiran je u velikom broju programskih jezika, uključujući C++, Object Pascal, Java, Oberon-2. Međutim, to dovodi do činjenice da poruke više nisu samostalni objekti, te kao rezultat toga nemaju atribute, što sužava mogućnosti programiranja. Neki jezici koriste hibridni prikaz, pokazujući prednosti oba pristupa istovremeno - na primjer, CLOS, Python.

Koncept virtualne metode, koji podržavaju ovi i drugi moderni jezici, pojavio se kao način osiguravanja da se željene metode izvršavaju kada se koriste polimorfne varijable, to jest, u biti, kao pokušaj proširenja mogućnosti pozivanja metoda za implementaciju dijela funkcionalnosti koju pruža mehanizam obrade poruka.

Značajke implementacije

Kao što je gore spomenuto, u modernim objektno orijentiranim programskim jezicima svaki objekt je vrijednost koja pripada određenoj klasi. Klasa je kompozitni tip podataka deklariran od strane programera, koji sadrži:

Podatkovna polja Parametri objekta (naravno, ne svi, već samo oni koji su potrebni u programu), određujući njegovo stanje (svojstva objekta predmetnog područja). Ponekad se podatkovna polja objekta nazivaju svojstvima objekta, što može dovesti do zabune. Fizički, polja predstavljaju vrijednosti (varijable, konstante) deklarirane kao da pripadaju klasi. Metode Postupci i funkcije povezane s klasom. Oni definiraju radnje koje se mogu izvesti na objektu tog tipa, te koje sam objekt može izvesti.

Klase mogu naslijeđivati ​​jedna od druge. Klasa potomak prima sva polja i metode roditeljske klase, ali ih može nadopuniti vlastitim ili nadjačati postojeće. Većina programskih jezika podržava samo jedno nasljeđivanje (klasa može imati samo jednu roditeljsku klasu), samo neki dopuštaju višestruko nasljeđivanje - generiranje klase iz dvije ili više roditeljskih klasa. Višestruko nasljeđivanje stvara niz problema, kako logičkih tako i čisto implementacijskih, tako da njegova puna podrška nije široko rasprostranjena. Umjesto toga, 1990-ih se pojavio koncept sučelja koji se počeo aktivno uvoditi u objektno orijentirane jezike. Sučelje je klasa bez polja i implementacije, koja sadrži samo zaglavlja metoda. Ako klasa nasljeđuje (ili, kako oni kažu, implementira) sučelje, mora implementirati sve njegove metode. Korištenje sučelja pruža relativno jeftinu alternativu višestrukom nasljeđivanju.

Interakcija objekata u velikoj većini slučajeva osigurava se međusobnim pozivanjem metoda.

Enkapsulacija se osigurava na sljedeće načine:

Kontrola pristupa Budući da metode klase mogu biti ili isključivo unutarnje, dajući logiku funkcioniranja objekta, ili vanjske, uz pomoć kojih objekti međusobno djeluju, potrebno je osigurati tajnost prvih, dok druge učiniti dostupnima izvana. Da biste to učinili, u jezike se uvode posebne sintaktičke konstrukcije koje eksplicitno definiraju opseg svakog člana klase. Tradicionalno, to su javni, zaštićeni i privatni modifikatori, koji označavaju javne članove klase, članove klase kojima se može pristupiti unutar klase i iz klasa potomaka, te skrivene članove kojima se može pristupiti samo unutar klase. Specifična nomenklatura modifikatora i njihovo točno značenje razlikuju se od jezika do jezika. Metode pristupa Polja klase općenito ne bi trebala biti dostupna izvana, jer bi takav pristup omogućio proizvoljne promjene unutarnjeg stanja objekata. Stoga se polja obično proglašavaju skrivenima (ili jezik općenito ne dopušta pristup poljima klase izvana), a za pristup podacima koji se nalaze u poljima koriste se posebne metode koje se nazivaju metode pristupa. Takve metode vraćaju vrijednost određenog polja ili upisuju novu vrijednost u to polje. Prilikom pisanja, pristupnik može provjeriti valjanost vrijednosti koja se upisuje i, ako je potrebno, izvršiti druge manipulacije nad podacima objekta tako da oni ostanu ispravni (interno konzistentni). Metode pristupa nazivaju se i pristupnici (od engleskog access - pristup), a pojedinačno getteri (engleski get - čitanje) i postavljači (engleski set - pisanje). Svojstva objekta pseudopolja koja se mogu čitati i/ili pisati. Svojstva izgledaju kao polja i koriste se na isti način kao i dostupna polja (uz neke iznimke), ali zapravo pozivaju pristupne metode kada im se pristupi. Dakle, svojstva se mogu smatrati "pametnim" podatkovnim poljima koja prate pristup internim podacima objekta s nekim dodatnim radnjama (na primjer, kada je promjena koordinata objekta popraćena njegovim ponovnim crtanjem na novoj lokaciji). Svojstva, zapravo, nisu ništa više od sintaktički šećer, budući da ne dodaju nikakve nove značajke, već samo skrivaju poziv za metode pristupa. Specifična jezična implementacija svojstava može varirati. Na primjer, deklaracija svojstva izravno sadrži pristupni kod koji se poziva samo kada se radi sa svojstvima, to jest, ne zahtijeva zasebne pristupne metode koje se mogu izravno pozvati. U Delphiju, deklaracija svojstava sadrži samo imena pristupnih metoda koje treba pozvati prilikom pristupa polju. Same metode pristupa su uobičajene metode s nekim dodatnim zahtjevima za potpis.

Polimorfizam se provodi uvođenjem pravila u jezik prema kojima se varijabli tipa “klasa” može dodijeliti objekt bilo koje klase potomka te klase.

Dizajn programa općenito

OOP je usmjeren na razvoj velikih softverskih sustava koje razvija tim programera (možda prilično velik). Projektiranje sustava u cjelini, izradu pojedinih komponenti i njihovu integraciju u finalni proizvod često provode različiti ljudi, a ne postoji niti jedan stručnjak koji zna sve o projektu.

Objektno orijentirano projektiranje usmjereno je na opisivanje strukture projektiranog sustava (prioritet u odnosu na opis njegovog ponašanja, za razliku od funkcionalnog programiranja), odnosno, zapravo, na odgovor na dva glavna pitanja:

  • Od kojih se dijelova sastoji sustav?;
  • Koja je odgovornost svakog od njegovih dijelova?.

Raspodjela dijelova provodi se na način da svaki ima minimalan obujam i točno definiran skup funkcija (odgovornosti), a da pritom što manje interagira s ostalim dijelovima.

Daljnjim pojašnjenjem dolazi se do identifikacije manjih fragmenata opisa. Kako opis i definicija odgovornosti postaju detaljniji, otkrivaju se podaci koje je potrebno pohraniti i prisutnost agenata sličnog ponašanja, koji postaju kandidati za implementaciju u obliku klasa sa zajedničkim precima. Nakon identificiranja komponenti i definiranja sučelja između njih, implementacija svake komponente može se provesti gotovo neovisno o ostalim (naravno, uz odgovarajuću tehnološku disciplinu).

Ispravna konstrukcija hijerarhije klasa je od velike važnosti. Jedan od poznatih problema velikih sustava izgrađenih pomoću OOP tehnologije je tzv problem krhkosti osnovne klase. Ono leži u činjenici da se u kasnijim fazama razvoja, kada je izgrađena hijerarhija klasa i na temelju koje je razvijena velika količina koda, pokazalo da je teško ili čak nemoguće izvršiti bilo kakve promjene u kodu osnovne klase hijerarhije (iz kojih su izvedene sve ili mnoge klase koje rade u sustavu). Čak i ako promjene koje napravite ne utječu na sučelje osnovne klase, promjena njenog ponašanja može utjecati na klase potomke na nepredvidive načine. U slučaju velikog sustava, programer osnovne klase jednostavno nije u stanju predvidjeti posljedice promjena; on čak ne zna ni kako se točno koristi osnovna klasa i na kojim značajkama njenog ponašanja ovisi ispravan rad klasa potomaka ovisi.

Razne OOP metodologije

Programiranje komponenti sljedeća je faza u razvoju OOP-a; prototip i klasno orijentirano programiranje različiti su pristupi stvaranju programa koji se mogu kombinirati, a imaju svoje prednosti i nedostatke.

Programiranje komponenti

Komponentno orijentirano programiranje je vrsta "superstrukture" nad OOP-om, skup pravila i ograničenja usmjerenih na izgradnju velikih, razvojnih softverskih sustava s dugim vijekom trajanja. Softverski sustav u ovoj metodologiji je skup komponenti s dobro definiranim sučeljima. Promjene u postojećem sustavu vrše se stvaranjem novih komponenti uz ili kao zamjena za prethodno postojeće. Prilikom stvaranja novih komponenti na temelju prethodno stvorenih, upotreba nasljeđivanja implementacije je zabranjena - nova komponenta može naslijediti samo sučelja osnovne. Na taj način programiranje komponenti izbjegava problem krhkosti osnovne klase.

Programiranje prototipa

Programiranje prototipa, zadržavajući neke značajke OOP-a, napustilo je osnovne koncepte klase i nasljeđivanja.

  • Prototip je uzorak objekta, na čiju sliku i priliku su stvoreni drugi objekti. Objekti kopiranja mogu održavati vezu s nadređenim objektom, automatski nasljeđujući promjene na prototipu; ova je značajka definirana unutar određenog jezika.
  • Umjesto mehanizma za opisivanje klasa i instanci za stvaranje, jezik pruža mehanizam za kreiranje objekta (određivanjem skupa polja i metoda koje objekt mora imati) i mehanizam za kloniranje objekata.
  • Svaki novostvoreni objekt je "instanca bez klase". Svaki predmet može postati prototip- koristiti se za stvaranje novog objekta pomoću operacije kloniranje. Nakon kloniranja, novi objekt se može modificirati, posebno se mogu dodati nova polja i metode.
  • Klonirani objekt ili postaje potpuna kopija prototipa, pohranjujući sve vrijednosti svojih polja i duplicirajući svoje metode, ili zadržava referencu na prototip bez uključivanja kloniranih polja i metoda dok se ne izmijene. U potonjem slučaju, runtime okruženje pruža mehanizam delegacija- ako prilikom pristupa objektu sam ne sadrži potrebnu metodu ili podatkovno polje, poziv se prosljeđuje prototipu, od njega po potrebi dalje u lancu.

Klasno orijentirano programiranje

Klasno orijentirano programiranje je programiranje usmjereno na podatke, gdje su podaci i ponašanje neraskidivo povezani. Podaci i ponašanje zajedno čine klasu. Sukladno tome, u jezicima koji se temelje na konceptu "klase", svi objekti su podijeljeni u dvije glavne vrste - klase i instance. Klasa definira strukturu i funkcionalnost (ponašanje) koja je ista za sve instance te klase. Instanca je nositelj podataka - to jest, ima stanje koje se mijenja u skladu s ponašanjem specificiranim u klasi. U klasno orijentiranim jezicima, nova se instanca stvara putem poziva konstruktoru klase (moguće sa skupom parametara). Rezultirajuća instanca ima strukturu i ponašanje tvrdo kodirane svojom klasom.

Izvedba programa objekta

Gradi Booch ističe sljedeće razloge koji dovode do smanjene izvedbe programa zbog upotrebe objektno orijentiranih alata:

Dinamičko povezivanje metoda Osiguravanje polimorfnog ponašanja objekata dovodi do potrebe za povezivanjem metoda koje program poziva (odnosno, određivanjem koja će se specifična metoda pozvati) ne u fazi kompilacije, već tijekom izvođenja programa, što zahtijeva dodatno vrijeme. Međutim, dinamičko vezanje zapravo je potrebno za ne više od 20% poziva, ali neki OOP jezici ga koriste cijelo vrijeme. Značajna dubina razvoja OOP-a apstrakcije često dovodi do stvaranja "višeslojnih" aplikacija, gdje je izvedba zahtijevane akcije objekta svedena na mnoge pozive objektima niže razine. U takvoj aplikaciji postoji mnogo poziva metoda i povrata metoda, što prirodno utječe na performanse. Nasljeđivanje "zamagljuje" kod. Kod koji se odnosi na "konačne" klase hijerarhije nasljeđivanja, koje obično izravno koristi program, nalazi se ne samo u samim tim klasama, već iu njihovim klasama predaka. Metode koje pripadaju istoj klasi zapravo su opisane u različitim klasama. To dovodi do dvije neugodne stvari:

  • Brzina prevođenja se smanjuje jer povezivač mora učitati opise svih klasa u hijerarhiji.
  • Performanse programa u sustavu sa straničnom memorijom se smanjuju - budući da su metode jedne klase fizički smještene na različitim mjestima u kodu, daleko jedna od druge, prilikom izvođenja fragmenata programa koji aktivno pristupaju naslijeđenim metodama, sustav je prisiljen izvoditi česte izmjene stranica.
Enkapsulacija smanjuje brzinu pristupa podacima.Zabrana izravnog pristupa poljima klase izvana dovodi do potrebe za kreiranjem i korištenjem metoda pristupa. Postoje dodatni troškovi povezani s pisanjem, kompajliranjem i izvođenjem metoda pristupa. Dinamičko stvaranje i uništavanje objekata. Dinamički stvoreni objekti, u pravilu, raspoređuju se na gomilu, što je manje učinkovito od njihovog postavljanja na stog i, štoviše, statičkog dodjeljivanja memorije za njih u fazi kompilacije.

Unatoč ovim nedostacima, Booch tvrdi da su prednosti korištenja OOP-a veće. Osim toga, povećana produktivnost zbog bolje organizacije OOP koda, prema njegovim riječima, u nekim slučajevima kompenzira dodatne režijske troškove organizacije funkcioniranja programa. Također možete primijetiti da se mnogi učinci degradacije performansi mogu izgladiti ili čak potpuno eliminirati zahvaljujući visokokvalitetnoj optimizaciji koda od strane kompilatora. Na primjer, gore spomenuto smanjenje brzine pristupa poljima klase zbog korištenja pristupnih metoda eliminira se ako prevodilac koristi inline zamjenu umjesto poziva pristupne metode (moderni prevoditelji to rade prilično pouzdano).

Kritika OOP-a

Unatoč nekim kritikama OOP-a, ovo je paradigma koja se trenutno koristi u velikoj većini industrijskih projekata. Međutim, ne može se pretpostaviti da je OOP najbolja tehnika programiranja u svim slučajevima.

Kritike PLO-a:

  • Pokazalo se da nema značajne razlike u produktivnosti razvoja softvera između OOP-a i proceduralnog pristupa.
  • Christopher Date ističe nemogućnost usporedbe OOP-a i drugih tehnologija uglavnom zbog nepostojanja striktne i općeprihvaćene definicije OOP-a.
  • Alexander Stepanov je u jednom od svojih intervjua istaknuo da je OOP “metodološki neispravan” i da je “... OOP praktički ista prijevara kao i umjetna inteligencija...”.
  • Frederick Brooks ističe da je najteži dio stvaranja softvera “... specifikacija, dizajn i testiranje konceptualnih konstrukata, a ne rad na izražavanju tih konceptualnih konstrukata...”. OOP (zajedno s tehnologijama poput umjetne inteligencije, verifikacije programa, automatskog programiranja, grafičkog programiranja, ekspertnih sustava itd.) po njegovom mišljenju nije „srebrni metak“ koji bi mogao smanjiti kompleksnost razvoja softverskih sustava za redak veličina. Prema Brooksu, “...OOP samo smanjuje uvedenu složenost u dizajnerskom izrazu. Dizajn ostaje složen po prirodi...”
  • Edsger Dijkstra je istaknuo: “… ono što društvo u većini slučajeva traži je eliksir za sve bolesti. Naravno, "eliksir" ima vrlo impresivna imena, inače će biti vrlo teško nešto prodati: "Strukturalna analiza i dizajn", "Softversko inženjerstvo", "Modeli zrelosti", "Informacijski sustavi upravljanja", podrška projektima "Integrirana okruženja" ", "Objektna orijentacija", "Reinženjering poslovnih procesa...".
  • Niklaus Wirth smatra da OOP nije ništa više od trivijalne nadgradnje nad strukturiranim programiranjem, a preuveličavanje njegove važnosti, izraženo, između ostalog, u uključivanju sve modernijih “objektno orijentiranih” alata u programske jezike, šteti kvaliteti softvera. razvija se.
  • Patrick Killelia je u svojoj knjizi “Podešavanje web poslužitelja” napisao: “...OOP vam daje mnogo načina da usporite svoje programe...”.
  • Dobro poznati pregledni članak o problemima u modernom OOP programiranju navodi neke tipične OOP probleme [ ] .
  • U folkloru programiranja, kritika objektno orijentiranog pristupa u usporedbi s funkcionalnim pristupom korištenjem metafore “ Imenica Kraljevstva" iz eseja Stevea Yeaggieja.

Pokušamo li klasificirati kritike OOP-a, možemo istaknuti nekoliko aspekata kritike ovakvog pristupa programiranju.

Kritika oglašavanja OOP-a Ideja objektnog programiranja kao svemoćnog pristupa koji magično eliminira složenost programiranja kritizirana je, bilo eksplicitno navedena ili implicirana u djelima nekih propagatora OOP-a, kao i u reklamnim materijalima za “objektno orijentirane” razvojni alati. Kao što su mnogi primijetili, uključujući gore spomenute Brooksa i Dijkstru, "nema srebrnog metka" - bez obzira koje se programske paradigme razvijač pridržava, stvaranje netrivijalnog složenog softverskog sustava uvijek uključuje značajno ulaganje intelektualnih resursa i vremena. Od najkvalificiranijih stručnjaka u području OOP-a nitko, u pravilu, ne poriče valjanost kritike ove vrste. Osporavanje učinkovitosti OOP razvoja Kritičari osporavaju ideju da razvoj objektno orijentiranih programa zahtijeva manje resursa ili rezultira kvalitetnijim softverom. Provedena je usporedba troškova razvoja različitim metodama, na temelju čega se zaključuje da OOP nema prednosti u tom smjeru. S obzirom na iznimnu poteškoću objektivne usporedbe različitih razvoja, takve su usporedbe, u najmanju ruku, kontroverzne. S druge strane, ispada da su izjave o učinkovitosti OOP-a jednako kontroverzne. Performanse objektno orijentiranih programa Ističe se da niz "urođenih značajki" OOP tehnologije čini programe izgrađene na njezinoj osnovi tehnički manje učinkovitima u usporedbi sa sličnim neobjektnim programima. Ne poričući da doista postoje dodatni režijski troškovi za organiziranje rada OOP programa (pogledajte gornji odjeljak "Performanse"), međutim, treba napomenuti da kritičari često preuveličavaju značaj kazne performansi. U suvremenim uvjetima, kada su tehničke mogućnosti računala izuzetno velike i stalno rastu, za većinu aplikacijskih programa tehnička učinkovitost pokazuje se manje značajnom od funkcionalnosti, brzine razvoja i lakoće održavanja. Samo za određenu, vrlo ograničenu klasu programa (ugrađeni sistemski softver, upravljački programi uređaja, dio sistemskog softvera niske razine, znanstveni softver) izvedba ostaje kritičan faktor. Kritike pojedinih tehnoloških rješenja u OOP jezicima i bibliotekama Ova kritika je brojna, ali se ne tiče OOP-a kao takvog, već prihvatljivosti i primjenjivosti u konkretnim slučajevima pojedinih implementacija njegovih mehanizama. Jedan od omiljenih predmeta kritike je jezik C++, koji je jedan od najčešćih industrijskih OOP jezika.

Objektno orijentirani jezici

Mnogi moderni jezici posebno su dizajnirani da olakšaju objektno orijentirano programiranje. Međutim, treba imati na umu da OOP tehnike možete primijeniti na neobjektno orijentirani jezik i obrnuto; korištenje objektno orijentiranog jezika ne znači da kôd automatski postaje objektno orijentiran.

Tipično, objektno orijentirani jezik (OOL) sadrži sljedeći skup elemenata:

  • Deklaracija klasa s poljima (podaci - članovi klase) i metodama (funkcije - članovi klase).
  • Mehanizam proširenja klase (nasljeđivanja) je generiranje nove klase iz postojeće uz automatsko uključivanje svih značajki implementacije klase pretka u sastav klase potomka. Većina OOO podržava samo jedno nasljeđivanje.
  • Polimorfne varijable i parametri funkcija (metode), omogućujući vam da dodijelite instance različitih klasa istoj varijabli.
  • Polimorfno ponašanje instanci klase korištenjem virtualnih metoda. U nekim OY, sve metode klase su virtualne.

Neki jezici dodaju određene dodatne značajke navedenom minimalnom skupu. Među njima:

  • Konstruktori, destruktori, finalizatori;
  • Svojstva (pribor);
  • Indeksatori;
  • Alati za kontrolu vidljivosti komponenti klase (sučelja ili modifikatori pristupa, kao što su javni, privatni, zaštićeni, značajke itd.).

Neki jezici u potpunosti su u skladu s načelima OOP-a - u njima su svi glavni elementi objekti koji imaju stanje i pridružene metode. Primjeri takvih jezika su Smalltalk, Eiffel. Postoje hibridni jezici koji kombiniraju objektni podsustav u cijelosti s podsustavima drugih paradigmi kao "dva ili više jezika u jednom", omogućujući vam kombiniranje objektnih modela s drugima u jednom programu i brišući granicu između objekata -orijentirane i druge paradigme zbog nestandardnih mogućnosti koje balansiraju između OOP-a i drugih paradigmi (kao što je višestruko otpremanje, parametarske klase, sposobnost manipuliranja metodama klasa kao neovisnim objektima, itd.). Primjeri takvih jezika:

klasa (klase) je korisnički definirana vrsta podataka. Klasa specificira svojstva i ponašanje objekta ili procesa u obliku podatkovnih polja i funkcija za rad s njima.

Bitno svojstvo klase je da su njezini detalji implementacije skriveni od korisnika klase iza sučelja. Dakle, klasa kao model objekta stvarnog svijeta je crna kutija, zatvorena u odnosu na vanjski svijet.

Ideja klasa je srž objektno orijentiranog programiranja (OOP). Osnovni principi OOP-a razvijeni su još u jezicima Simula-67 i SmallTalk, ali u to vrijeme nisu bili široko korišteni zbog poteškoća u učenju i niske učinkovitosti implementacije.

Pozivaju se specifične vrijednosti tipa podataka "klasa". instance klase ili objekti (objekti) .

Pozivaju se potprogrami koji definiraju operacije na objektima klase metode (metode). Pozivaju se pozivi metoda poruke (poruke). Cijeli skup metoda objekta naziva se protokol poruka, ili sučelje za poruke (porukasučelje) objekt. Poruka mora imati najmanje dva dijela: određeni objekt kojemu se šalje i naziv metode koja specificira potrebnu radnju na objektu. Dakle, računanje u objektno orijentiranom programu određeno je porukama koje se prenose s jednog objekta na drugi.

Objekti međusobno komuniciraju slanjem i primanjem poruka. Poruka je zahtjev za izvođenje radnje, koji sadrži skup potrebnih parametara. Mehanizam poruke implementira se pozivanjem odgovarajućih funkcija. Korištenjem OOP-a, takozvani event-driven model se jednostavno implementira, kada su podaci aktivni i kontroliraju poziv određenog dijela programskog koda.

OOP je metoda programiranja koja razvija principe strukturiranog programiranja i temelji se na sljedećim apstrakcijama podataka:

ja Enkapsulacija : kombiniranje podataka s procedurama i funkcijama u jedan blok programskog koda (podaci i metode za rad s njima smatraju se objektnim poljima).

II. Nasljedstvo – prijenos metoda i svojstava s pretka na potomka, bez potrebe za pisanjem dodatnog programskog koda (prisutnost instanci klasa; potomci, preci, hijerarhija).

III. Polimorfizam – sposobnost mijenjanja svojstava i ponašanja objekata koji su identični po značenju ovisno o njihovoj vrsti (jedno ime za određenu radnju, koja se provodi drugačije za objekte hijerarhije).

Enkapsulacija

Koncept enkapsulacije prvi put je korišten u jezicima koji podržavaju takozvani apstraktni pristup programiranju (na primjer, Modula-2). Glavna ideja apstraktnog pristupa je sakriti strukturu informacija o objektu od korisnika, dajući mu priliku da dobije podatke potrebne za rad s objektom samo kroz postupke koji se odnose na ovaj objekt. Ova tehnika može značajno povećati pouzdanost i prenosivost razvijenog softvera. Pouzdanost se povećava zbog činjenice da su svi postupci za rad s objektnim podacima relativno jednostavni i transparentni, što znači da se mogu kvalitetnije razvijati. Kod promjene strukture podataka dovoljno je preraditi samo programe koji su izravno povezani s objektom, a složenije programe koji koriste ovaj objekt nije potrebno mijenjati. Ova okolnost povećava i pouzdanost i mobilnost stvorenih programa.

Nasljedstvo

U drugoj polovici 1980-ih postalo je očito mnogim programerima softvera da je ponovna uporaba programa jedna od najboljih prilika za povećanje njihove produktivnosti. Jasno je da bi se apstraktni tipovi podataka, sa svojom enkapsulacijom i kontrolom pristupa, trebali moći ponovno koristiti. Problem s ponovnim korištenjem apstraktnih tipova podataka, u gotovo svim slučajevima, jest da svojstva i mogućnosti postojećih tipova nisu dobro prilagođeni za novu upotrebu. Starije tipove potrebno je barem minimalno modificirati. Takve izmjene mogu biti teške za implementaciju i zahtijevaju da osoba razumije dio, ako ne i cijeli, postojećeg koda. Osim toga, u mnogim slučajevima izmjene podrazumijevaju promjene u svim klijentskim programima.

Drugi problem s programiranjem orijentiranim na podatke je da su sve definicije apstraktnih tipova podataka neovisne i na istoj razini hijerarhije. To često sprječava da program bude strukturiran tako da odgovara domeni problema. U mnogim slučajevima izvorni problem sadrži kategorije međusobno povezanih objekata koji su i nasljednici istih predaka (tj. koji se nalaze na istoj razini hijerarhije) i preci i nasljednici (tj. zajedno u odnosu na neku podređenost).

Nasljeđivanje rješava i probleme modifikacije koji proizlaze iz ponovne upotrebe apstraktnog tipa podataka i probleme organizacije programa. Ako novi apstraktni tip podataka može naslijediti podatke i funkcionalna svojstva nekog postojećeg tipa, kao i modificirati neke od tih entiteta i dodati nove entitete, tada je ponovna uporaba uvelike olakšana bez potrebe za izmjenama ponovno korištenog apstraktnog tipa podataka. Programeri mogu uzeti postojeći apstraktni tip podataka i modelirati ga na novom tipu koji zadovoljava nove zahtjeve problema. Pretpostavimo da vaš program ima apstraktni tip podataka za nizove cijelih brojeva koji uključuje operaciju sortiranja. Nakon određenog razdoblja korištenja, program se modificira i zahtijeva ne samo apstraktni tip podataka za nizove cijelih brojeva s operacijom sortiranja, već i operaciju za izračunavanje aritmetičkog prosjeka za elemente objekata koji su nizovi. Budući da je struktura niza skrivena u apstraktnom tipu podataka, bez nasljeđivanja tip se mora modificirati dodavanjem nove operacije toj strukturi. Kod nasljeđivanja nema potrebe mijenjati postojeći tip; Moguće je opisati podklasu postojećeg tipa koja podržava ne samo operaciju sortiranja, već i operaciju za izračunavanje aritmetičke sredine.

Poziva se klasa koja je definirana nasljeđivanjem od druge klase izvedena klasa (izvedenrazreda) , ili podrazred (podrazred) . Poziva se klasa iz koje je nova klasa izvedena roditeljski razred (roditeljrazreda) , ili nadrazred (nadrazred) .

U najjednostavnijem slučaju, klasa nasljeđuje sve entitete (varijable i metode) roditeljske klase. Ovo se nasljeđivanje može učiniti složenijim uvođenjem kontrole pristupa entitetima nadređene klase.

Ova kontrola pristupa omogućuje programeru da sakrije dijelove apstraktnog tipa podataka od klijenata. Ova vrsta kontrole pristupa uobičajena je u razredima objektno orijentiranih jezika. Izvedene klase su druga vrsta klijenata kojima se može odobriti ili zabraniti pristup. Kako bi se to prilagodilo, neki objektno orijentirani jezici uključuju treću kategoriju kontrole pristupa, često nazvanu zaštićenom, koja se koristi za odobravanje pristupa izvedenim klasama i zabranjivanje pristupa drugim klasama.

Osim naslijeđenih entiteta, izvedena klasa može dodati nove entitete i modificirati metode. Modificirana metoda ima isto ime i često isti protokol kao metoda čija je modifikacija. Rečeno je da nova metoda nadjačava naslijeđenu verziju metode, koja se stoga naziva nadjačana metoda. Najopćenitija svrha metode zamjene je izvođenje operacije koja je specifična za objekte izvedene klase, a ne specifična za objekte roditeljske klase.

Razvoj programa za objektno orijentirani sustav počinje definiranjem hijerarhije klasa koja opisuje odnose između objekata koji će biti uključeni u program koji rješava problem. Što bolje ova hijerarhija klasa odgovara problemskom dijelu, prirodnije će biti potpuno rješenje.

Nedostatak nasljeđivanja kao sredstva za olakšavanje ponovne upotrebe koda je taj što stvara ovisnosti između klasa u hijerarhiji nasljeđivanja. To potkopava jednu od prednosti apstraktnih tipova podataka, a to je njihova međusobna neovisnost. Naravno, ne moraju svi apstraktni tipovi podataka biti potpuno neovisni, ali općenito je neovisnost apstraktnih tipova podataka jedno od njihovih najjačih pozitivnih svojstava. Međutim, povećanje mogućnosti ponovne upotrebe apstraktnih tipova podataka bez stvaranja ovisnosti između nekih od njih može biti teško, ako ne i potpuno beznadno.

Polimorfizam

Treće svojstvo objektno orijentiranih programskih jezika je vrsta polimorfizma koju osigurava dinamičko vezivanje poruka za definicije metoda. Ovo svojstvo je podržano dopuštanjem definicije polimorfnih varijabli tipa nadređene klase koje se također mogu odnositi na objekte bilo koje podklase te klase. Roditeljska klasa može definirati metodu koja je nadjačana u svojim potklasama. Operacije definirane ovim metodama su slične, ali se moraju specificirati za svaku klasu u hijerarhiji. Kada se takva metoda pozove putem polimorfne varijable, taj se poziv dinamički povezuje s metodom u odgovarajućoj klasi. Jedan od ciljeva dinamičkog povezivanja je omogućiti lakše proširenje softverskih sustava kako se razvijaju i održavaju. Takvi se programi mogu napisati za izvođenje operacija na objektima prilagođenih klasa. Ove su operacije prilagodljive u smislu da se mogu primijeniti na objekte bilo koje klase koja proizlazi iz iste osnovne klase.

Računalstvo u objektno orijentiranim jezicima

Sva izračunavanja u potpuno objektno orijentiranom jeziku izvode se prosljeđivanjem poruke objektu da pozove jednu od svojih metoda. Odgovor na poruku je objekt koji vraća rezultat izračuna izvedenih ovom metodom. Izvršenje programa u objektno orijentiranom jeziku može se opisati kao simulacija skupa računala (objekata) koji međusobno komuniciraju pomoću poruka. Svaki objekt je apstrakcija računala u smislu da pohranjuje podatke i pruža procese za manipuliranje tim podacima. Osim toga, objekti mogu slati i primati poruke. U suštini, to su osnovna svojstva računala – pohranjivanje i obrada podataka, kao i slanje i primanje poruka.

Bit objektno orijentiranog programiranja je rješavanje problema identificiranjem relevantnih objekata stvarnog svijeta i obrade potrebne za te objekte; te naknadno modeliranje tih objekata, njihovih procesa i potrebnih veza među njima.

Biblioteka vizualnih komponenti (VCL)

Delphi sadrži velik broj klasa namijenjenih brzom razvoju aplikacija. Knjižnica je napisana u Object Pascalu i ima izravnu vezu s Delphi integriranim okruženjem za razvoj aplikacija.

Sve VCL klase nalaze se na određenoj razini hijerarhije i oblika stablo (hijerarhija) klasa.

Poznavanje podrijetla objekta od velike je pomoći u njegovom proučavanju, jer dijete nasljeđuje sve elemente roditeljskog objekta. Dakle, ako svojstvo Caption pripada klasi TControl, tada će i njegovi potomci imati ovo svojstvo, na primjer, klase TButton i TCheckBox te komponente Button i neovisni prekidač CheckBox. Fragment hijerarhije klasa s najvažnijim klasama prikazan je na sl.

Osim hijerarhije klasa, velika pomoć u učenju programskog sustava su izvorni kodovi modula koji se nalaze u SOURCE direktoriju glavnog Delphi direktorija.

Voljom sudbine, moram čitati poseban tečaj o uzorcima dizajna na sveučilištu. Specijalni predmet je obavezan, stoga su studenti koji mi dolaze vrlo različiti. Naravno, među njima ima i programera praktičara. Ali, nažalost, većina ljudi ima poteškoća čak i s razumijevanjem osnovnih pojmova OOP-a.

Kako bih to učinio, pokušao sam objasniti osnovne koncepte OOP-a (klasa, objekt, sučelje, apstrakcija, enkapsulacija, nasljeđivanje i polimorfizam) koristeći više ili manje živih primjera.

Prvi dio ispod govori o klasama, objektima i sučeljima.
Drugi dio ilustrira enkapsulaciju, polimorfizam i nasljeđivanje

Osnovni pojmovi OOP-a

Klasa
Zamislite da dizajnirate automobil. Znate da auto mora imati motor, ovjes, dva fara, 4 kotača itd. Također znate da vaš automobil mora moći ubrzavati i usporavati, skretati i ići unatrag. I što je najvažnije, točno znate kako motor i kotači međusobno djeluju, po kojim se zakonima pomiču bregasta i radilica, kao i kako su dizajnirani diferencijali. Sigurni ste u svoje znanje i krećete s projektiranjem.

Opisujete sve dijelove koji čine vaš automobil, kao i kako ti dijelovi međusobno djeluju. Osim toga, opisujete što korisnik mora učiniti kako bi automobil zakočio ili uključio duga svjetla. Rezultat vašeg rada bit će skica. Upravo ste razvili ono što se zove OOP Klasa.

Klasa je način opisivanja entiteta koji definira stanje i ponašanje koje ovisi o tom stanju, kao i pravila za interakciju s tim entitetom (ugovor).

S programskog gledišta, klasa se može smatrati skupom podataka (polja, atributa, članova klase) i funkcija za rad s njima (metoda).

S gledišta strukture programa, klasa je složen tip podataka.

U našem slučaju klasa će prikazati entitet - automobil. Atributi klase bit će motor, ovjes, karoserija, četiri kotača itd. Metode nastave bit će "otvori vrata", "pritisni papučicu gasa" i također "ispumpaj dio benzina iz spremnika u motor". Prve dvije metode dostupne su za izvođenje drugim klasama (osobito klasi "Driver"). Potonji opisuje interakcije unutar klase i nije dostupan korisniku.

Od sada, iako je riječ "korisnik" povezana sa Solitaireom i Microsoft Wordom, programere koji koriste vašu klasu nazivat ćemo korisnicima, uključujući i vas. Osobu koja je autor klase nazvat ćemo programer.

Objekt
Obavili ste sjajan posao i strojevi razvijeni prema vašim crtežima silaze s proizvodne trake. Evo ih, stoje u urednim redovima u tvorničkom dvorištu. Svaki od njih točno ponavlja vaše crteže. Svi sustavi međusobno djeluju točno onako kako ste dizajnirali. Ali svaki je automobil jedinstven. Svi imaju brojeve karoserije i motora, ali svi su ti brojevi različiti, automobili se razlikuju po boji, a neki čak imaju i odljevke umjesto utisnutih kotača. Ovi automobili su u biti objekti vaše klase.

Objekt (instanca) je pojedinačni predstavnik klase koji ima specifično stanje i ponašanje koje je u potpunosti određeno klasom.

Jednostavno rečeno, objekt ima specifične vrijednosti atributa i metode koje rade na tim vrijednostima na temelju pravila definiranih u klasi. U ovom primjeru, ako je klasa neki apstraktni automobil iz "svijeta ideja", onda je objekt betonski automobil koji stoji ispod vaših prozora.

Sučelje
Kada priđemo aparatu za kavu ili sjednemo za volan, započinjemo interakciju s njima. Obično se interakcija odvija korištenjem određenog skupa elemenata: utora za prihvaćanje kovanica, gumba za odabir pića i odjeljka za točenje čaše u aparatu za kavu; volan, pedale, rucica mjenjaca u autu. Uvijek postoji neki ograničeni skup kontrola s kojima možemo komunicirati.

Sučelje je skup metoda klase koje su dostupne drugim klasama.

Očito je da će sučelje klase biti skup svih javnih metoda zajedno sa skupom javnih atributa. U suštini, sučelje specificira klasu, jasno definirajući sve moguće akcije na njoj.
Dobar primjer sučelja je nadzorna ploča automobila koja vam omogućuje pozivanje metoda kao što su ubrzavanje, kočenje, skretanje, mijenjanje brzina, paljenje prednjih svjetala itd. To jest, sve radnje koje druga klasa (u našem slučaju, vozač) može izvesti u interakciji s automobilom.

Kada se opisuje sučelje klase, vrlo je važno pronaći ravnotežu između fleksibilnosti i jednostavnosti. Klasa s jednostavnim sučeljem bit će laka za korištenje, ali bit će problema koje neće moći riješiti. U isto vrijeme, ako je sučelje fleksibilno, tada će se najvjerojatnije sastojati od prilično složenih metoda s velikim brojem parametara koji će vam omogućiti da učinite puno, ali korištenje će biti prepuno velikih poteškoća i rizika od greška, nešto pomiješano

Primjer jednostavnog sučelja bio bi automobil s automatskim mjenjačem. Svaka plavuša koja je završila dvotjedni tečaj vožnje vrlo brzo će svladati njegovo rukovanje. S druge strane, za svladavanje upravljanja modernim putničkim zrakoplovom potrebno je nekoliko mjeseci, pa čak i godina napornog treninga. Ne bih želio biti u Boeingu kojim upravlja netko tko ima dva tjedna iskustva u letenju. S druge strane, nikada nećete dobiti auto da poletite i odletite iz Moskve u Washington.

Java je objektno orijentirani jezik. To znači da morate pisati Java programe koristeći objektno orijentirani stil. I ovaj se stil temelji na korištenju objekata i klasa u programu. Pokušajmo uz pomoć primjera shvatiti što su klase i objekti, kao i kako u praksi primijeniti osnovne principe OOP-a: apstrakciju, nasljeđivanje, polimorfizam i enkapsulaciju.

Što je objekt?

Svijet u kojem živimo sastoji se od predmeta. Pogledamo li oko sebe, vidjet ćemo da smo okruženi kućama, drvećem, automobilima, namještajem, posuđem, računalima. Svi ovi predmeti su objekti, a svaki od njih ima skup specifičnih karakteristika, ponašanja i namjene. Navikli smo na predmete i uvijek ih koristimo u vrlo specifične svrhe. Na primjer, ako trebamo na posao, koristimo se automobilom, ako želimo jesti, koristimo posuđe, a ako se trebamo opustiti, treba nam udoban kauč. Osoba je naviknuta na objektivno razmišljanje za rješavanje problema u svakodnevnom životu. To je bio jedan od razloga korištenja objekata u programiranju, pa je takav pristup izradi programa nazvan objektno orijentiranim. Navedimo primjer. Zamislite da ste razvili novi model telefona i želite pokrenuti njegovu masovnu proizvodnju. Kao dizajner telefona, znate čemu služi, kako će funkcionirati i od kojih dijelova će se sastojati (kućište, mikrofon, zvučnik, žice, tipke itd.). Međutim, samo vi znate kako spojiti ove dijelove. Međutim, ne planirate osobno proizvoditi telefone; za to imate cijelo osoblje zaposlenika. Kako ne biste morali svaki put objašnjavati kako spojiti dijelove telefona i kako bi svi telefoni u proizvodnji ispali isti, prije nego što krenete u proizvodnju morat ćete napraviti crtež u obliku opis strukture telefona. U OOP-u se takav opis, crtež, dijagram ili predložak naziva klasa, iz koje se stvara objekt kada se program izvršava. Klasa je opis objekta koji još nije kreiran, poput općeg predloška koji se sastoji od polja, metoda i konstruktora, a objekt je instanca klase stvorena na temelju ovog opisa.

Apstrakcija

Razmislimo sada o tome kako se možemo pomaknuti s objekta u stvarnom svijetu na objekt u programu, koristeći telefon kao primjer. Povijest ovog sredstva komunikacije duža je od 100 godina, a moderni telefon je, za razliku od svog prethodnika iz 19. stoljeća, mnogo složeniji uređaj. Kada koristimo telefon, ne razmišljamo o njegovoj strukturi i procesima koji se unutar njega odvijaju. Jednostavno koristimo funkcije koje nam pružaju programeri telefona - tipke ili zaslon osjetljiv na dodir za odabir broja i upućivanje poziva. Jedno od prvih telefonskih sučelja bilo je dugme koje ste okretali da biste obavili poziv. Naravno, to nije bilo baš zgodno. Ipak, ručka je svoju funkciju obavljala kako treba. Ako pogledate najmoderniji i prvi telefon, odmah možete prepoznati najvažnije detalje koji su važni kako za uređaj s kraja 19. stoljeća, tako i za ultramoderni pametni telefon. Ovo je upućivanje poziva (biranje broja) i primanje poziva. U biti, to je ono što telefon čini telefonom, a ne nešto drugo. Sada smo primijenili princip u OOP-u - isticanje najvažnijih karakteristika i informacija o objektu. Ovaj princip se naziva apstrakcija. Apstrakcija u OOP-u također se može definirati kao način predstavljanja elemenata problema stvarnog svijeta kao objekata u programu. Apstrakcija je uvijek povezana s generalizacijom nekih informacija o svojstvima objekata ili objekata, pa je glavna stvar odvojiti značajne informacije od beznačajnih informacija u kontekstu problema koji se rješava. U ovom slučaju može postojati nekoliko razina apstrakcije. Pokušajmo primijeniti princip apstrakcije na naše telefone. Prvo, istaknimo najčešće tipove telefona od prvih do danas. Na primjer, mogu se prikazati u obliku dijagrama prikazanog na slici 1. Sada, koristeći apstrakciju, možemo istaknuti opće informacije u ovoj hijerarhiji objekata: uobičajeni apstraktni tip objekata - telefon, opća karakteristika telefona - godina nastanka, te zajedničko sučelje - svi telefoni mogu primati i slati pozive. Evo kako to izgleda u Javi: javna apstraktna klasa AbstractPhone ( private int year; public AbstractPhone (int year) ( this . year = year; ) public abstract void call (int outputNumber) ; public abstract void ring (int inputNumber) ; ) Na temelju ove apstraktne klase, moći ćemo kreirati nove tipove telefona u programu koristeći druge osnovne Java OOP principe, koje ćemo razmotriti u nastavku.

Enkapsulacija

Pomoću apstrakcije ističemo Općenito za sve objekte. Međutim, svaki model telefona je individualan i donekle drugačiji od ostalih. Kako možemo povući granice u programu i označiti tu individualnost? Kako možemo biti sigurni da nitko od korisnika ne može slučajno ili namjerno razbiti naš telefon, ili pokušati pretvoriti jedan model u drugi? Za svijet stvarnih objekata, odgovor je očigledan: morate staviti sve dijelove u kućište telefona. Uostalom, ako to ne učinimo i ostavimo sve unutrašnjosti telefona i žice koje ih povezuju vani, sigurno će se naći radoznali eksperimentator koji će htjeti "poboljšati" rad našeg telefona. Kako bi se izbjeglo takvo uplitanje u dizajn i rad objekta, OOP koristi načelo enkapsulacije - još jedno osnovno načelo OOP-a, u kojem se atributi i ponašanje objekta kombiniraju u jednoj klasi, unutarnja implementacija objekta skrivena je od korisnik, a za rad s objektom omogućeno je otvoreno sučelje. Posao programera je odrediti koji će atributi i metode biti javno dostupni, a koji su interne implementacije objekta i ne smiju se mijenjati.

Enkapsulacija i kontrola pristupa

Recimo da su tijekom proizvodnje na poleđini telefona ugravirani podaci o njemu: godina proizvodnje ili logo tvrtke proizvođača. Ovaj podatak sasvim specifično karakterizira ovaj model – njegovo stanje. Možemo reći da se programer telefona pobrinuo za nepromjenjivost ovih informacija - malo je vjerojatno da bi itko pomislio ukloniti gravuru. U svijetu Jave stanje budućih objekata opisuje se u klasi pomoću polja, a njihovo ponašanje opisuje se pomoću metoda. Mogućnost promjene stanja i ponašanja provodi se pomoću modifikatora pristupa poljima i metodama - privatno, zaštićeno, javno , i zadano (zadani pristup). Na primjer, odlučili smo da godina izrade, naziv proizvođača telefona i jedna od metoda pripadaju internoj implementaciji klase i ne mogu se mijenjati drugim objektima u programu. Korištenjem koda, klasa se može opisati na sljedeći način: javna klasa SomePhone (privatna int godina; privatna String tvrtka; javna SomePhone (int godina, String tvrtka) ( this . year = godina; this . company = tvrtka; ) private void openConnection ( ) ( / /findComutator //openNewConnection... ) public void call () ( openConnection () ; System. out. println ("Pozivanje broja") ; ) public void ring () ( System. out. println ("Ding -ding") ; ) ) Modifikator privatna čini polja i metode klase dostupnima samo unutar te klase. To znači da možete pristupiti privatna polja izvana je nemoguće, kao što nema načina nazvati privatna metode. Skrivanje pristupa metodi openConnection također nam ostavlja slobodu mijenjanja interne implementacije ove metode, budući da ovu metodu zajamčeno neće koristiti drugi objekti i neće ometati njihov rad. Za rad s našim objektom ostavljamo otvorene metode poziva i zvona pomoću modifikatora javnost . Pružanje javnih metoda za rad s objektom također je dio mehanizma enkapsulacije, jer ako je pristup objektu potpuno odbijen, on će postati beskoristan.

Nasljedstvo

Pogledajmo ponovo telefonsku kartu. Možete vidjeti da predstavlja hijerarhiju u kojoj model koji se nalazi ispod ima sve karakteristike modela koji se nalaze više na grani, plus svoje vlastite. Na primjer, pametni telefon za komunikaciju koristi mobilnu mrežu (ima svojstva mobilnog telefona), bežični je i prenosiv (ima svojstva bežičnog telefona), te može primati i upućivati ​​pozive (ima svojstva telefona). U ovom slučaju možemo govoriti o nasljeđivanju svojstava objekta. U programiranju, nasljeđivanje je korištenje postojećih klasa za definiranje novih. Pogledajmo primjer stvaranja klase pametnog telefona korištenjem nasljeđivanja. Svi bežični telefoni napajaju se punjivim baterijama koje imaju određeni vijek trajanja u satima. Dakle, dodajmo ovo svojstvo klasi bežičnog telefona: javna apstraktna klasa WirelessPhone proširuje AbstractPhone ( privatni int sat; javni WirelessPhone (int godina, int sat) ( super (godina) ; ovo . sat = sat; ) ) Mobiteli nasljeđuju svojstva bežičnog telefona, također smo ovoj klasi dodali implementaciju metoda poziva i zvonjenja: javna klasa Mobitel proširuje WirelessPhone ( javni mobitel (int godina, int sat) ( super (godina, sat); ) @Override javni nevažeći poziv ( int outputNumber) ( System. out. println ("Calling number " + outputNumber) ; ) @Override public void ring (int inputNumber) ( System. out. println ( "Zove vas pretplatnik"+ ulazniBroj); ) ) I na kraju klasa pametnih telefona koja za razliku od klasičnih mobitela ima kompletan operativni sustav. Svojem pametnom telefonu možete dodavati nove programe koje ovaj operativni sustav podržava i time proširiti njegovu funkcionalnost. Korištenjem koda, klasa se može opisati na sljedeći način: javna klasa Smartphone proširuje CellPhone ( privatni String operationSystem; javni Smartphone (int godina, int sat, String operationSystem) ( super (godina, sat); this . operationSystem = operationSystem; ) public void install (String program) ( System. out. println ("I install " + program + "for" + operationSystem) ; ) ) Kao što vidite, stvorili smo vrlo malo novog koda za opisivanje klase Smartphone, ali dobili smo novi razreda s novom funkcionalnošću. Korištenje ovog principa OOP java može značajno smanjiti količinu koda, a time i olakšati rad programera.

Polimorfizam

Ako pogledamo sve modele telefona, tada, unatoč razlikama u izgledu i dizajnu modela, možemo prepoznati neka zajednička ponašanja kod njih - svi mogu primati i upućivati ​​pozive te imaju prilično jasan i jednostavan skup kontrolnih tipki. Primjenom jednog od nama već poznatih osnovnih principa OOP-a, apstrakcije u programskom smislu, možemo reći da telefonski objekt ima jedno zajedničko sučelje. Stoga korisnici telefona mogu sasvim udobno koristiti različite modele koristeći iste upravljačke tipke (mehaničke ili dodirne), ne ulazeći u tehničke detalje uređaja. Dakle, stalno koristite mobitel, a možete jednostavno telefonirati s njegovog fiksnog telefona. Poziva se princip u OOP-u kada program može koristiti objekte s istim sučeljem bez informacija o unutarnjoj strukturi objekta polimorfizam . Zamislimo da u našem programu trebamo opisati korisnika koji može koristiti bilo koji model telefona da nazove drugog korisnika. Evo kako to možete učiniti: public class User ( private String name; public User (String name) ( this . name = name; ) public void callAnotherUser (int number, AbstractPhone phone) ( // ovo je polimorfizam - korištenje apstraktnog tipa AbstractPhone telefon u kodu! telefon. nazovi broj) ; ) ) ) Sada ćemo opisati različite modele telefona. Jedan od prvih modela telefona: public class ThomasEdisonPhone extends AbstractPhone ( public ThomasEdisonPhone (int year) ( super (year) ;) @Override public void call (int outputNumber) ( System. out. println ("Rotate the knob" ) ; System . out .println( "Molim vas dajte svoj broj telefona, gospodine") ; ) @Override public void ring (int inputNumber) ( System. out. println ( "Telefon zvoni" ) ; ) ) Obični fiksni telefon: javna klasa Phone extends AbstractPhone ( public Phone (int year) ( super (year) ; ) @Override public void call (int outputNumber) ( System. out. println ("Pozivanje broja" + outputNumber) ; ) @Override public void ring (int inputNumber) ( System. out. println ("Telefon zvoni") ; ) ) I na kraju, cool video telefon: javna klasa VideoPhone proširuje AbstractPhone ( public VideoPhone (int year) ( super (year) ; ) @Override public void call (int outputNumber) ( System. out. println ( "Spajam video kanal za pretplatnika"+ izlazniBroj); ) @Override public void ring (int inputNumber) ( System. out. println ( "Imate dolazni video poziv..."+ ulazniBroj); ) ) Kreirajmo objekte u metodi main() i testirajmo metodu callAnotherUser: AbstractPhone firstPhone = new ThomasEdisonPhone (1879) ; AbstractPhone phone = novi telefon (1984.); AbstractPhone videoPhone= novi VideoPhone (2018) ; Korisnik korisnik = novi korisnik ("Andrey" ) ; korisnik. nazovi drugog korisnika (224466, prvi telefon); // Okrenite gumb //Navedite pretplatnički broj, gospodine korisnik. nazovi drugog korisnika (224466, telefon); //Poziv na broj 224466 korisnik. nazovi drugog korisnika (224466, videotelefon); //Povezivanje video kanala za pretplatnika 224466 Pozivanjem iste metode na korisničkom objektu dobili smo različite rezultate. Specifična implementacija metode poziva unutar metode callAnotherUser odabrana je dinamički na temelju specifične vrste pozivajućeg objekta tijekom izvođenja programa. To je glavna prednost polimorfizma – izbor implementacije tijekom izvođenja programa. U gornjim primjerima klase telefona koristili smo nadjačavanje metode, tehniku ​​koja mijenja implementaciju metode definiranu u osnovnoj klasi bez promjene potpisa metode. Ovo je u biti zamjena metode, a to je nova metoda definirana u podklasi koja se poziva kada se program pokrene. Obično se kod nadjačavanja metode koristi oznaka @Override, koja prevoditelju govori da provjeri potpise nadjačanih i nadjačanih metoda. Eventualno Kako biste bili sigurni da stil vašeg programa odgovara konceptu OOP-a i načelima OOP-a java, slijedite ove savjete:
  • istaknuti glavne karakteristike objekta;
  • istaknuti zajednička svojstva i ponašanje te koristiti nasljeđivanje pri stvaranju objekata;
  • koristiti apstraktne tipove za opisivanje objekata;
  • Pokušajte uvijek sakriti metode i polja koja se odnose na internu implementaciju klase.

(kako OOP označava) je, prije svega, paradigma programiranja.
Paradigma programiranja definira kako programer vidi izvođenje programa.
Dakle, OOP paradigma je karakterizirana činjenicom da programer promatra program kao skup međusobno povezanih objekata, dok je, na primjer, u funkcionalnom programiranju program predstavljen kao slijed proračuna funkcija. Proceduralno programiranje, ili, kako se također ispravno naziva, klasično operativno programiranje, uključuje pisanje algoritma za rješavanje problema; u ovom slučaju očekivana svojstva konačnog rezultata nisu opisana niti naznačena. Strukturirano programiranje u osnovi slijedi iste principe kao proceduralno programiranje, uz nekoliko korisnih tehnika koje su mu dodane.
Neproceduralne paradigme programiranja, koje uključuju objektno orijentiranu paradigmu, imaju potpuno različite ideje.
Definicija Gradi Bucha glasi: “ Objektno orijentirano programiranje je metodologija programiranja koja se temelji na predstavljanju programa kao skupa objekata, od kojih je svaki implementacija određene klase (posebne vrste tipa), a klase tvore hijerarhiju temeljenu na principima nasljednosti.”
Strukturirano i objektno orijentirano programiranje temelji se na znanstvenoj metodi poznatoj kao raspad- metoda koja koristi strukturu problema i omogućuje razbijanje rješenja zajedničkog velikog problema na rješavanje niza manjih problema. Dekompozicija OOP-a ne događa se prema algoritmima, već prema objektima koji se koriste u rješavanju problema. Ova dekompozicija smanjuje veličinu softverskih sustava ponovnom upotrebom uobičajenih mehanizama. Poznato je da su vizualni programski sustavi ili sustavi izgrađeni na principima objektno orijentiranog programiranja fleksibilniji i lakše se razvijaju tijekom vremena.

Povijest razvoja OOP-a nastaje krajem 60-ih. Prvi objektno orijentirani jezik bio je programski jezik Simula, stvoren u računskom centru u Norveškoj. Jezik je bio namijenjen modeliranju situacija u stvarnom svijetu. Posebna značajka Simule bila je da je program napisan u jeziku organiziran u programske objekte. Objekti su imali upute zvane metode, a podaci zvane varijable; metode i podaci odredili su ponašanje objekta. Tijekom simulacije, objekt se ponašao u skladu sa svojim zadanim ponašanjem i, ako je potrebno, promijenio je podatke kako bi odražavao utjecaj radnje koja mu je dodijeljena.

Danas postoji dovoljan broj objektno orijentirani programski jezici, od kojih su trenutno najpopularniji C++, Delphi, Java, Visual Basic, Flash. Ali, osim toga, mnogi jezici koji se obično klasificiraju kao proceduralna paradigma također imaju OOP svojstva, mogu raditi s objektima. Dakle, objektno orijentirano programiranje u C-u veliki je dio programiranja u ovom jeziku, isto vrijedi i za OOP u pythonu i mnogim drugim strukturiranim jezicima.

Kada govorimo o OOP-u, često se pojavljuje druga definicija - vizualno programiranje. Dodatno pruža opsežnu upotrebu prototipova objekata, koji su definirani kao klase objekata.
Događaji. Mnoga okruženja za vizualno programiranje implementiraju karakteristiku (pored enkapsulacije, polimorfizma i nasljeđivanja) objekta - događaj. Događaji u objektno orijentiranom programiranju su mogućnost obrade takozvanih poruka (ili događaja) primljenih od operacijskog sustava Windows ili samog programa. Ovaj princip je tipičan za sve komponente okoline koje obrađuju različite događaje koji nastaju tijekom izvođenja programa. U biti, događaj je neka radnja koja aktivira standardnu ​​reakciju objekta. Događajem se može smatrati, na primjer, klik na tipku miša, lebdenje pokazivača miša iznad stavke izbornika, otvaranje kartice itd. Redoslijed izvođenja određenih radnji određen je upravo događajima koji se događaju u sustavu i reakcijom objekata na njih.
Klase i objekti u OOP-u- razni pojmovi. Koncept klase u OOP-u je tip podataka (isti kao, na primjer, Real ili String), a objekt je specifična instanca klase (njezina kopija), pohranjena u memoriji računala kao varijabla odgovarajućeg tipa. .
Klasa je strukturni tip podataka. Klasa uključuje opis podatkovnih polja, kao i postupaka i funkcija koje djeluju na tim podatkovnim poljima. OOP metoda- to su takvi postupci i funkcije u odnosu na razrede.
Klase imaju polja (kao tip podatka record), svojstva koja su slična poljima, ali imaju dodatne deskriptore koji definiraju mehanizme za pisanje i čitanje podataka, te metode - potprograme koji su usmjereni na promjenu polja i svojstava klase.

Osnovni principi OOP-a

Načela objektno orijentiranog programiranja, osim rukovanja događajima, su enkapsulacija, nasljeđivanje, podklase i polimorfizam. Osobito su korisni i potrebni pri razvoju aplikacija koje se mogu replicirati i koje je lako održavati.
Objekt kombinira metode i svojstva koja ne mogu postojati odvojeno od njega. Stoga, ako se objekt izbriše, brišu se njegova svojstva i pridružene metode. Kod kopiranja događa se ista stvar: objekt se kopira kao cjelina. OOP enkapsulacija- ovo je opisana karakteristika.

OOP princip nasljeđivanja i podklase

Apsolutno svi objekti nastaju na temelju klasa i nasljeđuju svojstva i metode tih klasa. S druge strane, klase se mogu stvoriti na temelju drugih klasa (roditelji), a tada se takve klase nazivaju podklase (potomci). Podklase nasljeđuju sva svojstva i metode roditeljske klase. Osim toga, za podklasu ili klasu potomak možete definirati nova, vlastita svojstva i metode, kao i promijeniti metode roditeljske klase. Promjene svojstava i metoda nadređene klase prate se u potklasama kreiranim na temelju te klase, kao iu objektima kreiranim na temelju podklasa. To je ono o čemu se radi u OOP nasljeđivanju.

OOP polimorfizam

U objektno orijentiranom programiranju polimorfizam se karakterizira kao zamjenjivost objekata s istim sučeljem. To se može objasniti na sljedeći način: klasa dijete nasljeđuje instance metoda roditeljske klase, ali se izvršavanje tih metoda može dogoditi na drugačiji način, koji odgovara specifičnostima klase djeteta, odnosno modificirano.
To jest, ako u proceduralnom programiranju naziv procedure ili funkcije jedinstveno identificira izvršeni kod koji se odnosi na ovu proceduru ili funkciju, tada u objektno orijentiranom programiranju možete koristiti iste nazive metoda za izvođenje različitih radnji. To jest, rezultat izvršavanja iste metode ovisi o vrsti objekta na koji se metoda primjenjuje.

Stranica predstavlja djelomičnu teoriju objektno orijentiranog programiranja za početnike i OOP primjere rješavanja problema. OOP lekcije na stranici detaljni su algoritmi za izvršavanje zadanog zadatka. Na temelju obavljenih laboratorijskih radova student će u budućnosti moći samostalno rješavati druge slične zadatke.
Želimo vam lako i zanimljivo učenje objektno orijentiranog programiranja!

Najbolji članci na temu