OOP - čo to je? Základné princípy objektovo orientovaného programovania. Objektovo orientované programovanie (OOP) Základné princípy objektovo orientovaného programovania sú

Pre mnohých PHP programátorov je objektovo orientované programovanie zastrašujúcim konceptom, ktorý je plný zložitej syntaxe a iných prekážok pri ovládaní. V tomto článku koncept objektovo orientované programovanie(OOP) je reprezentovaný ako štýl kódovania, ktorý vám umožňuje zoskupovať súvisiace aktivity do tried, aby ste vytvorili kompaktnejší a efektívnejší kód.

Čo je objektovo orientované programovanie

Objektovo orientované programovanie je štýl kódovania, ktorý umožňuje vývojárom zoskupovať podobné úlohy triedy. Kód je teda v súlade s princípom DRY (neopakujte sa) a ľahko sa udržiava.

Jednou z výhod DRY programovania je, že ak niektoré informácie vyžadujú, aby ste svoj program zmenili, musíte to urobiť zmeňte kód iba na jednom mieste, aby ste aktualizovali algoritmus. Jednou z najhorších nočných môr vývojárov je udržiavanie kódu, ktorý znova a znova deklaruje údaje, čím sa akékoľvek zmeny v programe stávajú nekonečnou hrou na schovávačku a zároveň lovia duplicitné údaje a časti algoritmu.

OOP straší mnohých vývojárov, pretože zavádza novú syntax a na prvý pohľad vyzerá zložitejšie ako jednoduché procedurálne kódovanie. Pri bližšom preskúmaní je však OOP v skutočnosti veľmi jasný a mimoriadne jednoduchý prístup k programovaniu.

Čo sú objekty a triedy

Predtým, ako sa ponoríme do jasných definícií OOP, je potrebné mať základné pochopenie rozdielu medzi nimi triedy A predmety. Táto časť článku vám pomôže získať predstavu o triedach, ich rôznych schopnostiach a niektorých aplikáciách.

Aký je rozdiel medzi triedami a objektmi

Vývojári, ktorí začínajú hovoriť o triedach a objektoch, začínajú nahrádzať koncepty. Bohužiaľ, toto sa stáva veľmi často.

Napríklad trieda Projekt domu. Na papieri definuje, ako bude dom vyzerať, jasne popisuje všetky vzťahy medzi jeho jednotlivými časťami, aj keď dom v skutočnosti neexistuje.

A objekt je skutočný dom, ktorá je postavená v súlade s projektom. Dáta, ktoré sú uložené v objekte, sú ako drevo, drôty a betón, ktoré tvoria dom: bez montáže podľa projektu to bude len hromada materiálov. Keď sa však spoja, tvoria vynikajúci a pohodlný domov.

Triedy tvoria štruktúru údajov a akcií a využívajú tieto informácie na vytváranie objektov. Z jednej triedy môže byť súčasne skonštruovaných viacero objektov, pričom každý z nich bude nezávislý od ostatných. Pokračujúc v analógii s výstavbou, celá štvrť by mohla byť postavená podľa jedného návrhu: 150 rôznych domov, ktoré vyzerajú rovnako, ale v každom z nich sú iné rodiny a vnútorná výzdoba budov je odlišná.

Štruktúra triedy

Syntax na vytvorenie triedy je veľmi jednoduchá: na deklarovanie triedy použite kľúčové slovo class, za ktorým nasleduje názov triedy a množina zložených zátvoriek (()):

Po vytvorení triedy je možné vytvoriť inštanciu nového objektu a uložiť ho do premennej pomocou kľúčového slova new:

$obj = nová MyClass;

Ak chcete zobraziť obsah objektu, použite var_dump() :

Var_dump($obj);

Celý proces môžete otestovať skopírovaním celého kódu do súboru test.php:

Načítajte stránku do prehliadača a na obrazovke by sa mal objaviť nasledujúci riadok:

Object(MyClass)#1 (0) ( )

Práve ste vytvorili svoj prvý OOP skript.

Definovanie vlastností triedy

Vlastnosti alebo premenné triedy sa používajú na pridávanie údajov do triedy. Vlastnosti fungujú ako bežné premenné, ale sú spojené s objektom a možno k nim pristupovať iba pomocou objektu.

Ak chcete pridať vlastnosti do triedy MyClass, použite tento kód vo svojom skripte:

Kľúčové slovo public určuje viditeľnosť vlastnosti, ktorej sa budeme venovať neskôr v tejto kapitole. Vlastnosť sa potom pomenuje pomocou normálnej syntaxe premennej a priradí sa jej hodnota (hoci vlastnosť triedy nie je potrebné inicializovať).

Echo $obj->prop1;

Keďže môže existovať viacero implementácií triedy, bez odkazu na konkrétny objekt, vlastnosť sa nedá prečítať, pretože skript nedokáže určiť, z ktorého objektu sa má čítať. Šípka (->) je konštrukcia OOP, ktorá sa používa na prístup k vlastnostiam a metódam daného objektu.

Upravte skript v test.php tak, aby čítal hodnotu vlastnosti a nezobrazoval informácie o celej triede:

prop1; // Zobraziť vlastnosť?>

Obnovte stránku v prehliadači, aby ste videli výsledok skriptu:

Vlastnosť triedy

Definovanie triednych metód

Metóda je triedna funkcia. Individuálna akcia, ktorú môže objekt vykonať, je definovaná v triede ako metóda.

Vytvorme napríklad metódy, ktoré nastavujú a čítajú hodnotu vlastnosti $prop1:

prop1 = $newval; ) verejná funkcia getProperty() ( return $this->prop1 . "
"; ) ) $obj = new MyClass; echo $obj->prop1; ?>

Poznámka- OOP umožňuje objektu odkazovať na seba pomocou $this . Keď pracujete v rámci metódy, pomocou $this môžete použiť názov objektu mimo triedy.

Ak chcete použiť metódu, zavolajte ju ako bežnú funkciu, ale najprv zadajte objekt, ku ktorému patrí. Načítame vlastnosť z MyClass , zmeníme hodnotu a znova prečítame:

prop1 = $newval; ) verejná funkcia getProperty() ( return $this->prop1 . "
"; ) ) $obj = new MyClass; echo $obj->getProperty(); // získanie hodnoty vlastnosti $obj->setProperty("New property."); // Nastavenie novej hodnoty echo $obj->getProperty () ; // Znovu si prečítajte hodnotu, aby ste videli zmeny?>

Obnovíme stránku v prehliadači a uvidíme nasledovné:

Vlastnosť triedy Nová vlastnosť

Výhody OOP sa prejavia pri použití viacerých objektov rovnakej triedy.

prop1 = $newval; ) verejná funkcia getProperty() ( return $this->prop1 . "
"; ) ) // Vytvorenie dvoch objektov $obj = new MyClass; $obj2 = new MyClass; // Získanie hodnôt $prop1 z oboch objektov echo $obj->getProperty(); echo $obj2->getProperty( ); // Nastavenie nových hodnôt vlastností pre oba objekty $obj->setProperty("Nová hodnota vlastnosti"); $obj2->setProperty("Vlastnosť patrí druhému objektu"); // Tlač hodnôt $prop1 ​​pre obe echo $obj->getProperty() ; echo $obj2->getProperty(); ?>

Keď načítate stránku do prehliadača, uvidíte nasledovné:

Vlastnosť triedy Vlastnosť triedy Nová hodnota vlastnosti Vlastnosť patrí do druhého objektu

Poznámka, OOP ukladá objekty ako rôzne entity, čo uľahčuje rozdelenie kódu na rôzne malé a vzájomne prepojené časti.

Magické metódy v OOP

Na uľahčenie používania objektov má PHP niekoľko magické metódy. Ide o špeciálne metódy, ktoré sa volajú pri vykonávaní určitých akcií na objekte. Týmto spôsobom môže vývojár relatívne ľahko dokončiť niekoľko bežných úloh.

Používanie konštruktérov a deštruktorov

Pri vytváraní objektu je často potrebné okamžite nastaviť určité vlastnosti. Na vykonávanie takýchto úloh má PHP magickú metódu __construct(), ktorá sa volá automaticky pri vytvorení nového objektu.

Na ilustráciu konceptu pridajme do triedy MyClass konštruktor. Po vytvorení nového objektu triedy vytlačí správu:

"; ) verejná funkcia setProperty($newval) ( $this->prop1 = $newval; ) verejná funkcia getProperty() ( return $this->prop1 . "
"; ) ) // Vytvorenie nového objektu $obj = new MyClass; // Získanie hodnoty vlastnosti $prop1 echo $obj->
"; ?>

Poznámka— konštanta __CLASS__ vracia názov triedy, v ktorej je volaná; toto je jedna z magických konštánt PHP.

Objekt triedy "MyClass" bol vytvorený! Koniec vlastnosti triedy súboru.

Ak chcete volať funkciu počas procesu odstraňovania objektu, použite magickú metódu __destruct(). Toto je veľmi užitočná metóda na správne vymazanie vlastností triedy (napríklad na správne zatvorenie pripojenia k databáze).

Keď sa objekt triedy odstráni magickou metódou, zobrazí sa správa:
__destruct() v MyClass:

"; ) verejná funkcia __destruct() ( echo "Objekt triedy "", __CLASS__, "" odstránené.
"; ) verejná funkcia setProperty($newval) ( $this->prop1 = $newval; ) verejná funkcia getProperty() ( return $this->prop1 . "
"; ) ) // Vytvorenie nového objektu $obj = new MyClass; // Získanie hodnoty vlastnosti $prop1 echo $obj->getProperty(); // Zobrazenie správy o dosiahnutí konca súboru echo "End súboru.
"; ?>

Obnovíme stránku v prehliadači a získame výsledok:

Objekt triedy "MyClass" bol vytvorený! Koniec vlastnosti triedy súboru. Objekt triedy "MyClass" bol odstránený.

Keď sa dosiahne koniec súboru, PHP automaticky uvoľní všetky zdroje.

Ak chcete explicitne zavolať deštruktor a odstrániť objekt, môžete použiť funkciu unset():


"; ) verejná funkcia setProperty($newval) ( $this->prop1 = $newval; ) verejná funkcia getProperty() ( return $this->prop1 . "
"; ) ) // Vytvorenie nového objektu $obj = new MyClass; // Získanie hodnoty vlastnosti $prop1 echo $obj->getProperty(); // Odstránenie objektu unset($obj); // Zobrazenie správa o dosiahnutí konca súboru echo "Koniec súboru.
"; ?>

Teraz bude výsledok kódu po načítaní do prehliadača vyzerať takto:

Objekt triedy "MyClass" bol vytvorený! Vlastnosť triedy Objekt triedy "MyClass" bol vymazaný. Koniec súboru.

Previesť na reťazec

Aby sa predišlo chybe, ak sa skript pokúsi vypísať MyClass ako reťazec, použije sa iná magická metóda, __toString() .

Bez použitia __toString() pokus o výstup objektu ako reťazec bude mať za následok fatálnu chybu. Skúste použiť funkciu echo na výstup objektu bez použitia magickej metódy:

"; ) verejná funkcia __destruct() ( echo "Objekt triedy "", __CLASS__, "" odstránené.
"; ) verejná funkcia setProperty($newval) ( $this->prop1 = $newval; ) verejná funkcia getProperty() ( return $this->prop1 . "

"; ?>

Výsledok bude vyzerať takto:

Objekt triedy "MyClass" bol vytvorený! Zachytiteľná fatálna chyba: Objekt triedy MyClass nebolo možné previesť na reťazec v /Applications/XAMPP/xamppfiles/htdocs/testing/test.php na riadku 40

Ak sa chcete vyhnúť chybe, použite metódu __toString():

"; ) verejná funkcia __destruct() ( echo "Objekt triedy "", __CLASS__, "" odstránené.
"; ) verejná funkcia __toString() ( echo "Použite metódu toString: "; return $this->getProperty(); ) verejná funkcia setProperty($newval) ( $this->prop1 = $newval; ) verejná funkcia getProperty( ) ( return $this->prop1 . "
"; ) ) // Vytvorenie nového objektu $obj = new MyClass; // Výstup objektu ako reťazec echo $obj; // Odstránenie objektu unset($obj); // Výstup správy o dosiahnutí konca súbor echo "Koniec súboru.
"; ?>

V tomto prípade bude mať pokus o konverziu objektu na reťazec za následok volanie metódy getProperty(). Načítajte skript do prehliadača a pozrite sa na výsledok:

Objekt triedy "MyClass" bol vytvorený! Používame metódu toString: Vlastnosť triedy Objekt triedy "MyClass" bol vymazaný. Koniec súboru.

Použitie triedneho dedičstva

Triedy môžu dediť metódy a vlastnosti z iných tried pomocou kľúčového slova extends. Napríklad vytvorte druhú triedu, ktorá rozšíri MyClass a pridá metódu:

"; ) verejná funkcia __destruct() ( echo "Objekt triedy "", __CLASS__, "" odstránené.
"; ) verejná funkcia __toString() ( echo "Použite metódu toString: "; return $this->getProperty(); ) verejná funkcia setProperty($newval) ( $this->prop1 = $newval; ) verejná funkcia getProperty( ) ( return $this->prop1 . "
"; ) ) trieda MyOtherClass rozširuje MyClass ( verejná funkcia newMethod() ( echo "Z novej metódy triedy " . __CLASS__ .".
"; ) ) // Vytvorenie nového objektu $newobj = new MyOtherClass; // Použite novú metódu echo $newobj->newMethod(); // Použite metódu z nadradenej triedy echo $newobj->getProperty(); ? >

Po načítaní skriptu do prehliadača dostaneme výsledok:

Objekt triedy "MyClass" bol vytvorený! Z novej metódy triedy "MyOtherClass". Vlastnosť triedy Objekt triedy "MyClass" bol vymazaný.

Preťažovanie zdedených vlastností a metód

Ak chcete zmeniť správanie existujúcich vlastností alebo metód v novej triede, môžete ich jednoducho preťažiť ich opätovným deklarovaním v novej triede:

"; ) verejná funkcia __destruct() ( echo "Objekt triedy "", __CLASS__, "" odstránené.
"; ) verejná funkcia __toString() ( echo "Použite metódu toString: "; return $this->getProperty(); ) verejná funkcia setProperty($newval) ( $this->prop1 = $newval; ) verejná funkcia getProperty( ) ( return $this->prop1 . "
"; ) ) trieda MyOtherClass rozširuje MyClass ( verejná funkcia __construct() ( echo "Nový konštruktor v triede " . __CLASS__ .".

"; ) ) // Vytvorenie nového objektu $newobj = new MyOtherClass; // Výstup objektu ako reťazec echo $newobj->newMethod(); // Použite metódu z nadradenej triedy echo $newobj->getProperty() ;?>

Zmeny pri spustení kódu vytvoria nasledujúci výstup:

Nový konštruktor v triede "MyOtherClass". Z novej metódy triedy "MyOtherClass". Vlastnosť triedy Objekt triedy "MyClass" bol vymazaný.

Zachovanie pôvodnej funkčnosti pri preťažovaní metód

Ak chcete k zdedenej metóde pridať novú funkčnosť pri zachovaní funkčnosti pôvodnej metódy, použite nadradené kľúčové slovo with operátor rozlíšenia viditeľnosti ( :: ) :

"; ) verejná funkcia __destruct() ( echo "Objekt triedy "", __CLASS__, "" odstránené.
"; ) verejná funkcia __toString() ( echo "Použite metódu toString: "; return $this->getProperty(); ) verejná funkcia setProperty($newval) ( $this->prop1 = $newval; ) verejná funkcia getProperty( ) ( return $this->prop1 . "
"; ) ) trieda MyOtherClass rozširuje MyClass ( verejná funkcia __construct() ( parent::__construct(); // Volanie konštruktora nadradenej triedy echo "Nový konštruktor v triede " . __CLASS__ .".
";) verejná funkcia newMethod() ( echo "Z novej metódy triedy " . __CLASS__ . ".
"; ) ) // Vytvorenie nového objektu $newobj = new MyOtherClass; // Výstup objektu ako reťazec echo $newobj->newMethod(); // Použite metódu z nadradenej triedy echo $newobj->getProperty() ;?>

Vyššie uvedený kód po spustení zobrazí správy od konštruktorov novej aj nadradenej triedy:

Objekt triedy "MyClass" bol vytvorený! Nový konštruktor v triede "MyOtherClass". Z novej metódy triedy "MyOtherClass". Vlastnosť triedy Objekt triedy "MyClass" bol vymazaný.

Definovanie rozsahu vlastností a metód

Pre ďalšiu kontrolu nad objektmi, metódami a vlastnosťami je nastavený rozsah. Toto riadi, ako a odkiaľ možno pristupovať k vlastnostiam a metódam. Existujú tri kľúčové slová na nastavenie rozsahu: public , protected a private . Okrem nastavenia rozsahu môžu byť metódy a vlastnosti deklarované ako statické, čo umožňuje prístup k nim bez implementácie triedy.

Poznámka- Rozsah je nová vlastnosť, ktorá bola predstavená v PHP 5. Informácie o kompatibilite OOP s PHP 4 nájdete v príručke PHP.

Vlastnosti a metódy verejné (Všeobecné)

Všetky vlastnosti a metódy, ktoré ste použili skôr v tomto článku, boli verejné. To znamená, že môžu byť prístupné kdekoľvek, v triede aj mimo nej.

Metódy a vlastnosti chránené

Keď je vlastnosť alebo metóda deklarovaná pomocou chránenej smernice, je prístupný len v rámci samotnej triedy alebo v rámci odvodených tried(triedy, ktoré rozširujú základnú triedu obsahujúcu metódu s direktívou chránené).

Deklarujme metódu getProperty() ako chránené v MyClass a skúste k nemu získať prístup mimo triedy:

"; ) verejná funkcia __destruct() ( echo "Objekt triedy "", __CLASS__, "" odstránené.
"; ) verejná funkcia __toString() ( echo "Použite metódu toString: "; return $this->getProperty(); ) verejná funkcia setProperty($newval) ( $this->prop1 = $newval; ) chránená funkcia getProperty( ) ( return $this->prop1 . "

";) verejná funkcia newMethod() ( echo "Z novej metódy triedy " . __CLASS__ . ".
"; ) ) // Vytvorenie nového objektu $newobj = new MyOtherClass; // Skúste zavolať chránenú metódu echo $newobj->getProperty(); ?>

Keď sa pokúsite spustiť skript, vygeneruje sa nasledujúca chyba:

Objekt triedy "MyClass" bol vytvorený! Nový konštruktor v triede "MyOtherClass". Závažná chyba: Volanie chránenej metódy MyClass::getProperty() z kontextu "" v /Applications/XAMPP/xamppfiles/htdocs/testing/test.php na riadku 55

Teraz vytvorte novú metódu v MyOtherClass na volanie metódy getProperty():

"; ) verejná funkcia __destruct() ( echo "Objekt triedy "", __CLASS__, "" odstránené.
"; ) verejná funkcia __toString() ( echo "Použite metódu toString: "; return $this->getProperty(); ) verejná funkcia setProperty($newval) ( $this->prop1 = $newval; ) chránená funkcia getProperty( ) ( return $this->prop1 . "
"; ) ) trieda MyOtherClass rozširuje MyClass ( verejná funkcia __construct() ( parent::__construct(); echo "Nový konštruktor v triede " . __CLASS__ .".
";) verejná funkcia newMethod() ( echo "Z novej metódy triedy " . __CLASS__ . ".
"; ) verejná funkcia callProtected() ( return $this->getProperty(); ) ) // Vytvorenie nového objektu $newobj = new MyOtherClass; // Volanie chránenej metódy z verejnej metódy echo $newobj->callProtected() ;?>

Pri spustení skriptu bude výsledok takýto:

Objekt triedy "MyClass" bol vytvorený! Nový konštruktor v triede "MyOtherClass". Vlastnosť triedy Objekt triedy "MyClass" bol vymazaný.

Súkromné ​​metódy a vlastnosti

Vlastnosti a metódy deklarované ako súkromné ​​sú prístupné iba v rámci triedy, v ktorej sú definované. Znamená to, že aj keď je nová trieda odvodená od triedy, ktorá definuje súkromné ​​vlastnosti a metódy, nebudú dostupné v odvodenej triede.

Pre demonštráciu deklarujme metódu getProperty() ako súkromné V Moja trieda a skúsme zavolať metódu callProtected() z
MyOtherClass :

"; ) verejná funkcia __destruct() ( echo "Objekt triedy "", __CLASS__, "" odstránené.
"; ) verejná funkcia __toString() ( echo "Použite metódu toString: "; return $this->getProperty(); ) verejná funkcia setProperty($newval) ( $this->prop1 = $newval; ) súkromná funkcia getProperty( ) ( return $this->prop1 . "
"; ) ) trieda MyOtherClass rozširuje MyClass ( verejná funkcia __construct() ( parent::__construct(); echo "Nový konštruktor v triede " . __CLASS__ .".
";) verejná funkcia newMethod() ( echo "Z novej metódy triedy " . __CLASS__ . ".
"; ) verejná funkcia callProtected() ( return $this->getProperty(); ) ) // Vytvorenie nového objektu $newobj = new MyOtherClass; // Použite metódu z nadradenej triedy echo $newobj->callProtected(); ?>

Uložíme skript, obnovíme stránku v prehliadači a získame nasledovné:

Objekt triedy "MyClass" bol vytvorený! Nový konštruktor v triede "MyOtherClass". Závažná chyba: Volanie súkromnej metódy MyClass::getProperty() z kontextu "MyOtherClass" v /Applications/XAMPP/xamppfiles/htdocs/testing/test.php na riadku 49

Statické metódy a vlastnosti (statické)

K metódam a vlastnostiam deklarovaným statickou direktívou je možné pristupovať bez iniciácie triedy. Jednoducho použijete názov triedy, operátor povolenia viditeľnosti a názov vlastnosti alebo metódy.

Jednou z hlavných výhod statických vlastností je, že si zachovávajú svoje hodnoty počas celého skriptu.

Na ukážku pridáme do triedy statickú vlastnosť $count a statickú metódu plusOne(). Moja trieda. Potom nastavíme cyklus do...while, aby sme vytlačili zvyšujúcu sa hodnotu $count, kým nebude väčšia ako 10:

"; ) verejná funkcia __destruct() ( echo "Objekt triedy "", __CLASS__, "" odstránené.
"; ) verejná funkcia __toString() ( echo "Použite metódu toString: "; return $this->getProperty(); ) verejná funkcia setProperty($newval) ( $this->prop1 = $newval; ) súkromná funkcia getProperty( ) ( return $this->prop1 . "
"; ) verejná statická funkcia plusOne() ( return "count = " . ++self::$count . ".
"; ) ) trieda MyOtherClass rozširuje MyClass ( verejná funkcia __construct() ( parent::__construct(); echo "Nový konštruktor v triede " . __CLASS__ .".
";) verejná funkcia newMethod() ( echo "Z novej metódy triedy " . __CLASS__ . ".
"; ) verejná funkcia callProtected() ( return $this->getProperty(); ) ) do ( // Volanie plusOne bez spustenia triedy MyClass echo MyClass::plusOne(); ) while (MyClass::$count< 10); ?>

Poznámka- Pre prístup k statickým vlastnostiam musí byť znak dolára ($). prísť po operátorovi povolenia viditeľnosti.

Spustenie skriptu v prehliadači prinesie nasledujúci výsledok:

Počet = 1. počet = 2. počet = 3. počet = 4. počet = 5. počet = 6. počet = 7. počet = 8. počet = 9. počet = 10.

Abstraktné dátové typy

Koncept abstraktných dátových typov je v programovaní kľúčový. Abstrakcia znamená oddelenie a nezávislé zváženie rozhrania a implementácie.

Pozrime sa na príklad. Všetci sledujeme televízne programy. Televízor nazvime modul alebo objekt. Tento objekt má rozhranie s používateľom, t. j. ovládacie prvky (súbor tlačidiel), reprodukciu obrazu a zvuku. Čím pokročilejšie je rozhranie, tým pohodlnejšie je používanie televízora. Programy prepíname stláčaním určitých tlačidiel a zároveň nemyslíme na fyzikálne procesy prebiehajúce v televízore. Odborníci o tom vedia svoje. Keď si vyberáme televízor, zaujíma nás jeho cena a výkonové parametre, teda kvalita obrazu, zvuku atď. Nás však nezaujíma, čo je vo vnútri. Inými slovami, vrátime sa k vlastnostiam objektu (modulu), ktorými sú rozhranie a implementácia. Hlavným účelom abstrakcie v programovaní je práve oddelenie rozhrania od implementácie.

Vráťme sa k nášmu príkladu. Predpokladajme, že nejaký subjekt je presvedčený, že dobre pozná štruktúru televízora. Odstráni veko a začne ho „vylepšovať“. Hoci to niekedy vedie k určitým stredným (miestnym) úspechom, konečný výsledok je takmer vždy negatívny. Preto musia byť takéto akcie zakázané. V programovaní je to podporované mechanizmami na odmietnutie prístupu alebo skrytie vnútorných komponentov. Každý objekt (modul) má právo spravovať „svoj vlastný majetok“, t. j. tieto funkcie a operácie. Ignorovanie tejto zásady narúša stabilitu systému a často vedie k jeho úplnému zničeniu. Princíp abstrakcie vyžaduje použitie skrytých mechanizmov, ktoré bránia úmyselnej alebo náhodnej modifikácii vnútorných komponentov.

Abstrakcia údajov zahŕňa definovanie a zváženie abstraktné dátové typy(ATD) alebo, čo je to isté, nové typy údajov zadávaných používateľom.

Abstraktný typ údajov je zbierka údajov spolu s mnohými operáciami, ktoré možno s týmito údajmi vykonávať.

Koncepcia objektovo orientovaného programovania

Podľa definície autority v oblasti objektovo orientovaných metód vývoja programov, Gradiho Buchu, „objektovo orientované programovanie (OOP) je metodológia programovania, ktorá je založená na reprezentácii programu ako súboru objektov, z ktorých každý je implementáciou určitej triedy (špeciálny druh typu) a triedy tvoria hierarchiu na princípoch dedičnosti.“

Objektovo orientovaná metodológia, podobne ako štrukturálna, bola vytvorená s cieľom disciplinovať proces vývoja veľkých softvérových systémov a tým znížiť ich zložitosť a náklady.

Objektovo orientovaná metodológia má rovnaké ciele ako štrukturálna metodológia, ale rieši ich z iného východiskového bodu a vo väčšine prípadov umožňuje riadiť zložitejšie projekty ako štrukturálna metodológia.

Ako viete, jedným z princípov riadenia zložitosti projektu je rozklad. Gradi Booch rozlišuje dva typy rozkladu: algoritmický (ako nazýva rozklad podporovaný štrukturálnymi metódami) a objektovo orientovaný, pričom rozdiel medzi nimi je podľa neho nasledovný: „Rozdelenie podľa algoritmov sústreďuje pozornosť na poradie udalostí, ktoré sa vyskytujú. a rozdelenie podľa objektov dáva osobitný význam faktorom, ktoré buď spôsobujú akcie, alebo sú predmetom aplikácie týchto akcií.

Inými slovami, algoritmická dekompozícia viac zohľadňuje štruktúru vzťahov medzi časťami komplexného problému, zatiaľ čo objektovo orientovaná dekompozícia venuje väčšiu pozornosť povahe vzťahov.

V praxi sa odporúča používať oba typy rozkladu: pri vytváraní veľkých projektov je vhodné najskôr použiť objektovo orientovaný prístup na vytvorenie všeobecnej hierarchie objektov, ktoré odrážajú podstatu programovateľnej úlohy, a potom použiť algoritmický rozklad. do modulov na zjednodušenie vývoja a údržby softvérového balíka.

OO programovanie je nepochybne jednou z najzaujímavejších oblastí pre profesionálny vývoj softvéru.

Objekty a triedy

Základnými blokmi objektovo orientovaného programu sú objekty a triedy. Z hľadiska obsahu môže byť objekt reprezentovaný ako niečo pociťované alebo predstavované a má dobre definované správanie. Objekt teda možno buď vidieť, dotknúť sa ho alebo aspoň vedieť, že sa tam nachádza, napríklad reprezentovaný ako informácia uložená v pamäti počítača. Definujme objekt podľa názoru Gradi Buchu: „Objekt je hmatateľná entita, ktorá jasne prejavuje svoje správanie.

Objekt - je súčasťou reality okolo nás, teda existuje v čase a priestore (pojem objekt v programovaní bol prvýkrát predstavený v jazyku Simula). Formálne je objekt dosť ťažko definovateľný. Dá sa to dosiahnuť pomocou niektorých vlastností, konkrétne: objekt má stav, správanie a dá sa jednoznačne identifikovať (inými slovami, má jedinečné meno).

Trieda - je to súbor objektov, ktoré majú spoločnú štruktúru a spoločné správanie. Trieda je popis (abstrakcia), ktorý ukazuje, ako zostrojiť premennú tejto triedy, ktorá existuje v čase a priestore, tzv. objekt. Význam viet „popis premenných triedy“ a „popis objektov triedy“ je rovnaký.

Objekt má stav, správanie a pas (prostriedok na jeho jednoznačnú identifikáciu); je popísaná štruktúra a správanie objektov v triedach, ktorých sú premennými.

Poďme si teraz definovať pojmy stav, správanie a identifikácia objekt.

Stav objektu kombinuje všetky svoje dátové polia (statický komponent, t. j. nemenný) a aktuálne hodnoty každého z týchto polí (dynamický komponent, t. j. zvyčajne sa meniaci).

Správanie vyjadruje dynamiku zmien stavov objektu a jeho reakcie na prichádzajúce správy, t.j. ako objekt mení svoje stavy a interaguje s inými objektmi.

Identifikácia(rozpoznanie) objektu je vlastnosť, ktorá umožňuje rozlíšiť objekt od iných objektov rovnakej alebo inej triedy. Identifikácia sa vykonáva prostredníctvom jedinečného názvu (pasu), ktorý je priradený objektu v programe, rovnako ako každej inej premennej.

Už bolo povedané vyššie, že procedurálny (ako aj modulárny) prístup umožňuje vytvárať programy pozostávajúce zo súboru procedúr (podprogramov), ktoré implementujú dané algoritmy. Na druhej strane objektovo orientovaný prístup predstavuje programy ako súbor objektov, ktoré sa navzájom ovplyvňujú. Objekty interagujú prostredníctvom správ. Predpokladajme, že naším objektom je kruh. Potom správa odoslaná tomuto objektu môže byť: "nakreslite sa." Keď hovoríme, že správa je odoslaná objektu, v skutočnosti nejaký voláme funkciu tento objekt (komponent funkcie). Takže vo vyššie uvedenom príklade zavoláme funkciu, ktorá nakreslí kruh na obrazovke.

Základné princípy OOP

Medzi základné princípy objektovo orientovaného programovacieho štýlu patria:

  • balenie alebo zapuzdrenie;
  • dedičstvo;
  • polymorfizmus;
  • prenos správ.

Balenie (zapuzdrenie)

zahŕňa kombináciu údajov a funkcií, ktoré s týmito údajmi manipulujú, do jedného objektu. Prístup k niektorým údajom v rámci balíka môže byť odmietnutý alebo obmedzený.

Objekt je charakterizovaný ako súbor všetkých jeho vlastností (napríklad pre zvieratá - prítomnosť hlavy, uší, očí atď.) a ich aktuálnych hodnôt (hlava - veľká, uši - dlhé, oči - žlté, atď.), tak a súbor činností prijateľných pre tento objekt (schopnosť jesť, sedieť, stáť, behať atď.). Táto kombinácia „materiálových“ častí (hlava, uši, chvost, labky) a činností, ktoré s týmito časťami manipulujú (akcia „beh“ rýchlo pohybuje labkami) sa nazýva zapuzdrenie.

V OOP sa údaje nazývajú objektové polia a algoritmy sa nazývajú objektové metódy.

Zapuzdrenie umožňuje izolovať objekt od jeho vonkajšieho prostredia v maximálnej možnej miere. Výrazne zvyšuje spoľahlivosť vyvíjaných programov, pretože Algoritmy lokalizované v objekte si s programom vymieňajú relatívne malé množstvá údajov a množstvo a typ týchto údajov je zvyčajne starostlivo kontrolovaný. Výsledkom je, že nahradenie alebo úprava algoritmov a údajov zapuzdrených v objekte spravidla nemá za následok zle sledovateľné dôsledky pre program ako celok. Ďalším dôležitým dôsledkom zapuzdrenia je jednoduchosť výmeny objektov a ich prenos z jedného programu do druhého.

Dedičnosť

Štrukturálne aj objektovo orientované metodológie majú za cieľ zostrojiť hierarchický strom vzťahov medzi objektmi (podúlohami). Ak je však štrukturálna hierarchia postavená na jednoduchom princípe rozdelenia celku na jednotlivé časti,

potom pri vytváraní objektovo orientovanej hierarchie sa preberá iný pohľad na ten istý pôvodný objekt. Objektovo orientovaná hierarchia nevyhnutne odráža dedenie vlastností nadradených (nadradených) typov objektov na podriadené (podložené) typy objektov.

Podľa Gradiho Boocha je „dedičnosť vzťah medzi objektmi, v ktorom jeden objekt opakuje štruktúru a správanie druhého“.

Princíp dedenia funguje v živote všade a každý deň. Cicavce a vtáky dedia vlastnosti živých organizmov, na rozdiel od rastlín, orol a havran zdedia pre vtáky spoločnú vlastnosť - schopnosť lietať. Na druhej strane levy, tigre, leopardy zdedia „štruktúru“ a správanie charakteristické pre predstaviteľov radu Felidae atď.

Typy na najvyšších úrovniach objektovo orientovanej hierarchie vo všeobecnosti nemajú konkrétne inštancie objektov. Neexistuje napríklad žiadny špecifický živý organizmus, ktorý by sa sám nazýval „cicavec“ alebo „vták“. Takéto typy sa nazývajú abstraktné. Špecifické príklady objektov majú spravidla typy najnižších úrovní OO hierarchie: „Krokodíl Gena“ je špecifický prípad objektu typu „krokodíl“, „Mačka Matroskin“ je špecifický prípad objektu. objekt typu „mačka“.

Dedičnosť vám umožňuje používať knižnice tried a rozvíjať ich (vylepšovať a upravovať triedy knižníc) v špecifickom programe. Dedičnosť vám umožňuje vytvárať nové objekty zmenou alebo pridaním vlastností k existujúcim. Objekt dediča prijíma všetky polia a metódy predchodcu, ale môže pridávať svoje vlastné polia, pridávať vlastné metódy alebo prepisovať zdedené metódy s rovnakým názvom svojimi vlastnými metódami.

Princíp dedenia rieši problém úpravy vlastností objektu a dáva OOP ako celku výnimočnú flexibilitu. Pri práci s objektmi si programátor zvyčajne vyberie objekt, ktorý je svojimi vlastnosťami najbližšie k riešeniu konkrétneho problému a vytvorí z neho jedného alebo viacerých potomkov, ktorí „dokážu“ robiť veci, ktoré nie sú implementované v rodičovi.

Dôsledná implementácia princípu „dediť a meniť“ sa dobre hodí a výrazne podporuje postupný prístup k vývoju veľkých softvérových projektov.

Keď vytvoríte novú triedu dedením z existujúcej triedy, môžete:

  • pridať nové dátové komponenty do novej triedy;
  • pridať nové funkčné komponenty do novej triedy;
  • nahradiť v novej triede funkčné komponenty zdedené zo starej triedy.

Polymorfizmus

umožňuje používať rovnaké funkcie na riešenie rôznych problémov. Polymorfizmus je vyjadrený v tom, že pod jedným názvom sa skrývajú rôzne akcie, ktorých obsah závisí od typu objektu.

Polymorfizmus je vlastnosťou príbuzných objektov (t. j. objektov, ktoré majú jedného spoločného rodiča) riešiť problémy podobného významu rôznymi spôsobmi. Napríklad „beh“ je bežný pre väčšinu zvierat. Každý z nich (lev, slon, krokodíl, korytnačka) však túto činnosť vykonáva iným spôsobom.

Pri tradičnom (neobjektovo orientovanom) prístupe k programovaniu bude programátor presúvať zvieratá vyvolaním samostatného podprogramu pre konkrétne zviera a konkrétnu akciu.

V rámci OOP sú behaviorálne vlastnosti objektu určené súborom metód, ktoré sú v ňom zahrnuté, programátor iba udáva, ktorý objekt potrebuje vykonať ktorú zo svojich inherentných činností a (napríklad v uvažovanom príklade) raz opísaný zvieracie objekty. sa budú pohybovať spôsobom, ktorý je pre nich charakteristický, pomocou metód, ktoré sú súčasťou jeho kompozície. Zmenou algoritmu konkrétnej metódy v potomkoch objektu môže programátor dať týmto potomkom špecifické vlastnosti, ktoré rodič nemá. Ak chcete zmeniť metódu, musíte ju prepísať v dieťati, t.j. deklarovať v potomkovi metódu s rovnakým názvom a implementovať v nej potrebné akcie. Výsledkom je, že v rodičovskom objekte a v podradenom objekte budú fungovať dve metódy s rovnakým názvom, ktoré majú odlišný algoritmický základ, a preto dávajú objektom odlišné vlastnosti. Toto sa nazýva objektový polymorfizmus.

V našom príklade so zvieracími predmetmi sa teda akcia „beh“ bude nazývať polymorfná akcia a rôzne formy prejavu tejto akcie sa budú nazývať polymorfizmus.

Popis typu objektu

Trieda alebo objekt je dátová štruktúra, ktorá obsahuje polia a metódy. Ako každá dátová štruktúra začína rezervovaným slovom a končí operátorom koniec. Formálna syntax nie je komplikovaná: popis typu objektu sa získa nahradením slova v popise záznamu záznam na slovo objekt alebo trieda a pridajte deklaráciu funkcií a procedúr nad polia.

Typ<имя типа объекта>= predmet
<поле>;
<поле>;
….
<метод>;
<метод>;
koniec ;

V ObjectPascal je špeciálne vyhradené slovo trieda na popis objektov, požičaných z C++.

Typ<имя типа объекта>= trieda
<поле>;
….
<метод>;
<метод>;
koniec ;

ObjectPascal podporuje oba modely popisu objektov.

Komponent objektu je buď pole alebo metóda. Pole obsahuje názov a typ údajov. Metóda je procedúra alebo funkcia deklarovaná vo vnútri deklarácie typu objektu, vrátane špeciálnych procedúr, ktoré vytvárajú a ničia objekty (konštruktory a deštruktory). Deklarácia metódy vo vnútri deklarácie typu objektu pozostáva iba z hlavičky. Toto je typ predbežného popisu podprogramu. Telo metódy nasleduje za deklaráciou typu objektu.

Príklad. Zavádza sa typ objektu „predok“, ktorý má dátové pole Názov a môže vykonávať dve akcie:

  • vyhlásiť: „Ja som predok!“;
  • daj svoje meno.

Typ tPredoc = názov objektu: string ; (údajové pole objektu)
Vyhlásenie o postupe ; (deklarácia objektových metód)
Postup MyName ;
Koniec ;

Texty podprogramov, ktoré implementujú objektové metódy, musia byť uvedené v časti popisujúcej procedúry a funkcie. Hlavičky pri popise implementácie metódy opakujú hlavičky uvedené v popise typu, sú však doplnené o názov objektu, ktorý je od názvu procedúry oddelený bodkou. V našom príklade:

Postup tPredoc.Vyhlásenie ; (implementácia objektovej metódy)
začať
writeln("Som predok!");
koniec ;
Postup tPredoc.MyName ; (implementácia objektovej metódy)
začať
writeln("Ja som", Meno);
koniec;

V popisoch metód sa polia a metódy daného typu označujú jednoducho názvom. Metóda MyName teda používa pole Name bez explicitného označenia vlastníctva objektu, ako keby bol vykonaný implicitný príkaz s<переменная_типа_объект>robiť.

Objektmi sa rozumejú aj premenné objektového typu – nazývajú sa kópie. Ako každá premenná, aj inštancia má názov a typ: musia byť deklarované.

…….(deklarácia typu objektu a popis jeho metód)
var v 1: tPredoc ; (deklarácia inštancie objektu)
začať
v1. Meno:= "Petrov Nikolaj Ivanovič";
v1.Vyhlásenie;
v1.MyName
koniec.

Použitie dátového poľa objektu v1 je rovnaká syntax ako použitie polí záznamov. Volanie metód inštancie objektu znamená, že zadaná metóda sa volá s údajmi objektu v 1. V dôsledku toho sa na obrazovke zobrazia riadky

Som predok!
Som Nikolaj Ivanovič Petrov

Podobne ako k záznamom, k poliam premenných typu objektu je možné pristupovať buď pomocou kvalifikovaných identifikátorov alebo príkazu with.

Napríklad v texte programu namiesto operátorov

je možné použiť operátor s týmto typom

s v1 do
začať
Meno:= "Petrov Nikolaj Ivanovič";
vyhlásenie ;
Moje meno
Koniec ;

Navyše použitie príkazu with s typmi objektov, ako aj pre záznamy, je nielen možné, ale aj odporúčané.

Hierarchia typov (dedičnosť)

Typy môžu byť usporiadané v hierarchii. Objekt môže zdediť komponenty z iného typu objektu. Predmetom dediča je dieťa. Predmet, ktorý sa zdedí, je predok. Zdôrazňujeme, že dedenie sa vzťahuje len na typy, nie na inštancie objektov.

Ak sa zavedie typ objektu (predchodca, rodič) a je potrebné ho doplniť poľami alebo metódami, potom sa zavedie nový typ, ktorý sa vyhlási za následníka (potomok, potomok) prvého a iba nové polia a metódy sú popísané. Potomok obsahuje všetky polia typu predok. Všimnite si, že polia a metódy predka sú dieťaťu k dispozícii bez špeciálnych pokynov. Ak popis potomka opakuje názvy polí alebo metód predka, potom nové popisy prepíšu polia a metódy predka.

OOP vždy začína základnou triedou. Toto je šablóna pre základný objekt. Ďalším krokom je definovanie novej triedy, ktorá sa nazýva odvodená trieda a je rozšírením základnej triedy.

Odvodená trieda môže obsahovať ďalšie metódy, ktoré neexistujú v základnej triede. Môže predefinovať metódy (alebo ich dokonca úplne odstrániť).

Odvodená trieda by nemala prepísať všetky metódy základnej triedy. Každý nový objekt zdedí vlastnosti základnej triedy, stačí definovať tie metódy, ktoré sú nové alebo boli zmenené. Všetky ostatné metódy základnej triedy sa považujú za súčasť odvodenej triedy. Je to pohodlné, pretože... keď sa metóda zmení v základnej triede, automaticky sa zmení aj vo všetkých odvodených triedach.

Proces dedenia môže pokračovať. Trieda, ktorá je odvodená od základnej triedy, sa môže sama stať základnou triedou pre iné odvodené triedy. Týmto spôsobom OO programy vytvárajú hierarchiu tried.

Štruktúra hierarchie tried sa najčastejšie popisuje ako strom. Vrcholy stromu zodpovedajú triedam a koreň zodpovedá triede, ktorá popisuje niečo spoločné (najbežnejšie) pre všetky ostatné triedy.

Dedenie podľa podradených typov informačných polí a metód ich rodičovských typov sa vykonáva podľa nasledujúcich pravidiel.

Pravidlo 1. Informačné polia a metódy nadradeného typu dedia všetky jeho podradené typy bez ohľadu na počet stredných úrovní hierarchie.

Pravidlo 2. Prístup k poliam a metódam rodičovských typov v rámci definície akýchkoľvek podradených typov sa vykonáva tak, ako keby boli opísané v samotnom podradenom type.

Pravidlo 3. Žiadny podradený typ nemôže používať identifikátory polí svojich rodičovských typov.

Pravidlo 4. Podradený typ môže definovať ľubovoľný počet vlastných metód a informačných polí.

Pravidlo 5. Akákoľvek zmena textu v rodičovskej metóde automaticky ovplyvní všetky metódy podradených typov, ktoré ju volajú.

Pravidlo 6. Na rozdiel od informačných polí môžu byť identifikátory metód v podradených typoch rovnaké ako názvy metód v nadradených typoch. V tomto prípade sa hovorí, že podriadená metóda prepíše (potlačí) rodičovskú metódu s rovnakým názvom. V rámci podradeného typu sa pri zadávaní názvu takejto metódy zavolá podriadená metóda a nie nadradená metóda.

Pokračujme v našom príklade. Okrem typu predka tPredoc, ktorý sme zaviedli, môžeme zaviesť aj typy potomkov:

ture tSon= object(tPredoc) (Typ, ktorý zdedí tPredoc)
postup Vyhlásenie; (prekrývajúce sa metódy predkov)
procedure Moje meno(Predoc: tPredoc);
koniec ;

Typ tGrandSon=object(tSon) (Typ dediaci od tSon)
postup Deskriptor EUROVOC-u vyhlásenie ; (prekrývajúce sa metódy predkov)
koniec ;

Názov typu predka sa uvádza v zátvorke za slovom objekt. Vytvorili sme dedičnú hierarchiu troch typov: tSon („syn“) je dedičom typu tPredoc a typ tGrandSon („vnuk“) je dedičom typu tSon. Typ tSon prepíše metódy Declaration a My N a m e, ale zdedí pole Name. Typ tGrandSon prepíše iba metódu Declaration a dedí pole Name od svojho spoločného predka a prepísanú metódu Declaration od svojho bezprostredného predka (typ tSon).

Poďme zistiť, čo presne chceme zmeniť v rodičovských metódach. Faktom je, že „syn“ musí hlásať trochu inak ako jeho predok, a to povedať „Ja som otec!“

postup tSon.Declaration ; (implementácia metód potomkov)
začať
writeln("Ja som otec!");
koniec;

A keď uvádza svoje meno, „syn“ musí poskytnúť tieto informácie:

  • ja<фамилия имя отчество >
  • ja som syn<фамилия имя отчество своего предка>

postup tSon .Moje meno (predoc: tPredoc);
začať
zdedené Mu meno; (zavolajte metódu okamžitého predka)
writeln("Ja som syn", preddoc.Meno, "a");
koniec;

V našom príklade potomok tSon z metódy My Name volá metódu s rovnakým názvom na svojom bezprostrednom predkovi typu tPredoc. Táto výzva je stanovená smernicou zdedené, nasledovaný volaním metódy bezprostredného predka. Ak je potrebné volať metódu vzdialeného predka v nejakom detskom type na ktorejkoľvek úrovni hierarchie, potom sa to dá urobiť pomocou kvalifikovaného identifikátora, t.j. uveďte explicitne názov typu nadradeného objektu a, oddelené bodkou, názov jeho metódy:

Teraz sa poďme zaoberať "vnukom". Metóda, pri ktorej „vnuk“ hovorí svoje meno, je úplne rovnaká ako jej bezprostredný predok (typ tSon), takže nie je potrebné túto metódu prepisovať, je lepšie túto metódu automaticky zdediť a použiť ako vlastnú. Ale v metóde Deklarácie musíte deklarovať „Som vnuk!“, takže metódu bude potrebné predefinovať.

postup tGrandSon.Declaration;
začať
writeln("Som vnuk!");
koniec;

Uvažujme príklad programu, v ktorom definujeme inštanciu typu tPredoc, nazývame ju „starý otec“, inštanciu typu tSon „otec“ a inštanciu typu tGrandSon „vnuk“. Požiadajme ich, aby sa predstavili.

Príklad programu využívajúci OOP

(názov programu)
……………….
(časť popisov typov vrátane typov objektov tPredoc, tSon, tGrandSon)
(Poznámka! Inštancie typov objektov možno opísať ako typované konštanty, čo sme urobili pre príklad nižšie)
konšt ded: tPredoc = (Meno: "Nikolaj Ivanovič Petrov");
otec: tSon = (Meno: "Petrov Sergey Nikolaevich");
vnuk: tVnuk = (Meno: "Petrov Oleg Sergejevič");
(časť popisov procedúr a funkcií, kde musia byť napísané všetky metódy deklarované v objektových typoch)
začať
ded.Vyhlásenie; (volanie metód spoločného predka)
ded.Moje meno;
writeln;
otec.Vyhlásenie;
otec.MojeMeno(ded); (volanie metód objektu otec typu tSon)
writeln;
vnuk.Vyhlásenie; (volanie metód objektu vnuk typu tGrandSon)
vnuk.MyName(otec);
koniec.

Náš program zobrazí:

Príklad zobrazenia výsledku

Som predok!
Som Nikolaj Ivanovič Petrov

Ja som otec!
Som Petrov Sergej Nikolajevič
Som synom Petrova Nikolaja Ivanoviča

Som vnuk!
Som Petrov Oleg Sergejevič
Som syn Sergeja Nikolajeviča Petrova

Upozorňujeme, že v hlavičke procedúry tSon. MyName dostane ako parameter dátový typ tPredoc a pri použití tohto postupu sa mu odovzdajú premenné typu tPredoc aj tSon. Je to možné, pretože predok je typovo kompatibilný s jeho potomkami. Opak to neplatí. Ak v hlavičke procedúry nahradíme tSon. MyName pri popise parametrov typu tPredoc na tSon , kompilátor pri použití premennej ded v riadku otec označí typovú nekompatibilitu. Moje meno(ded).

Polymorfizmus a virtuálne metódy

Polymorfizmus– ide o vlastnosť príbuzných objektov (t. j. objektov, ktoré majú rovnakého rodiča) riešiť problémy podobného významu rôznymi spôsobmi.

Dve alebo viac tried, ktoré sú odvodené od rovnakej základnej triedy, sa nazývajú polymorfné. To znamená, že môžu mať spoločné vlastnosti, ale majú aj svoje vlastné vlastnosti.

V rámci OOP sú behaviorálne vlastnosti objektu určené súborom metód, ktoré sú v ňom zahrnuté. Zmenou algoritmu konkrétnej metódy v potomkoch objektu môže programátor dať týmto potomkom špecifické vlastnosti, ktoré rodič nemá. Ak chcete zmeniť metódu, musíte ju prepísať v dieťati, t.j. deklarovať v potomkovi metódu s rovnakým názvom a implementovať v nej potrebné akcie. Výsledkom je, že v rodičovskom objekte a v podradenom objekte budú fungovať dve metódy s rovnakým názvom, ktoré majú odlišný algoritmický základ, a preto dávajú objektom odlišné vlastnosti. Toto sa nazýva objektový polymorfizmus.

Vo vyššie uvedenom príklade majú všetky tri typy objektov tPredoc, tSon a tGrandSon rovnaké metódy Declaration a MyName. Ale typ objektu tSon implementuje metódu MyName trochu inak ako jeho predchodca. A všetky tri metódy deklarácie s rovnakým názvom sa pre každý objekt vykonávajú inak.

Objektové metódy sú statické, virtuálne a dynamické.

Statické metódy

zahrnuté v programovom kóde počas kompilácie. To znamená, že pred použitím programu je určené, ktorá procedúra bude v danom bode vyvolaná. Kompilátor určuje, aký typ objektu sa používa v danom volaní a nahrádza tento objekt metódou.

Objekty rôznych typov môžu mať statické metódy s rovnakým názvom. V tomto prípade je požadovaná metóda určená typom inštancie objektu.

Je to výhodné, pretože metódy rôznych typov objektov, ktoré majú rovnaký význam, môžu byť pomenované rovnako, čo zjednodušuje pochopenie úloh aj programov. Statické prekrytie je prvým krokom polymorfizmu. Identické názvy sú vecou pohodlnosti programovania, nie princípom.

Virtuálne metódy

na rozdiel od statických sú pripojené k hlavnému kódu vo fáze vykonávania programu. Virtuálne metódy poskytujú možnosť určiť typ a vytvoriť inštanciu objektu za behu a potom volať metódy na tomto objekte.

Tento zásadne nový mechanizmus, nazývaný neskorá väzba, poskytuje polymorfizmus, t.j. odlišný spôsob správania pre rôzne, no homogénne (v zmysle dedenia) predmety.

Popis virtuálnej metódy sa líši od popisu bežnej metódy pridaním funkčného slova za hlavičku metódy virtuálne .

postup Metóda (zoznam parametrov); virtuálne;

Použitie virtuálnych metód v hierarchii typov objektov má určité obmedzenia:

  • ak je metóda deklarovaná ako virtuálna, potom v type potomka nemôže byť prepísaná statickou metódou;
  • objekty, ktoré majú virtuálne metódy, sa inicializujú špeciálnymi procedúrami, ktoré sú v podstate tiež virtuálne a sú tzv konštruktér ;
  • zoznamy premenných a typov funkcií v hlavičkách prekrývajúcich sa virtuálnych procedúr a funkcií sa musia úplne zhodovať;

Zvyčajne zapnuté konštruktér je priradená práca inicializácie inštancie objektu: priradenie počiatočných hodnôt poliam, počiatočné zobrazenie na obrazovke atď.

Okrem akcií, ktoré do neho vloží programátor, konštruktor pripraví mechanizmus na neskoré viazanie virtuálnych metód. To znamená, že pred volaním akejkoľvek virtuálnej metódy musí byť vykonaný nejaký konštruktor.

Konštruktor je špeciálna metóda, ktorá inicializuje objekt obsahujúci virtuálne metódy. Hlavička konštruktora vyzerá takto:

Metóda konštruktora (zoznam parametrov);

Vyhradené slovo konštruktér nahrádza slová postupový a virtuálny .

Hlavným a špeciálnym účelom konštruktora je nadviazať spojenie s virtuálnou tabuľkou metód (VMT) - štruktúrou obsahujúcou odkazy na virtuálne metódy. Konštruktor teda inicializuje objekt vytvorením spojenia medzi objektom a VMT s adresami kódov virtuálnej metódy. Počas inicializácie dochádza k neskorej väzbe.

Každý objekt má svoju vlastnú tabuľku virtuálnych metód VMT. Práve to umožňuje metóde s rovnakým názvom volať rôzne procedúry.

Keď už sme spomenuli konštruktora, mali by sme povedať aj o deštruktor. Jeho úloha je opačná: vykonajte akcie, ktoré dokončia prácu s objektom, zatvoria všetky súbory, vyčistia dynamickú pamäť, vyčistia obrazovku atď.

Hlavička deštruktora vyzerá takto:

deštruktor Hotovo ;

Hlavným účelom deštruktorov je zničiť VMT daného objektu. Deštruktor často nerobí nič iné a je to prázdna procedúra.

deštruktor Hotovo ;
začiatok koniec;

Objektovo orientované programovanie(OOP) vám umožňuje rozložiť problém na jeho časti, z ktorých každá sa stáva samostatným objektom. Každý z objektov obsahuje svoj vlastný kód a údaje, ktoré sa týkajú daného objektu.

Každý program napísaný v jazyku OOP odráža vo svojich údajoch stav fyzických objektov alebo abstraktných pojmov - programovacích objektov, s ktorými má pracovať.

Všetky údaje o programovacom objekte a jeho vzťahoch s inými objektmi možno spojiť do jednej štruktúrovanej premennej. Na prvé priblíženie sa dá nazvať objektom.

Objekt je spojený so súborom akcií, inak nazývaných metódy. Z hľadiska programovacieho jazyka sú množinou akcií alebo metód funkcie, ktoré prijímajú ukazovateľ na objekt ako požadovaný parameter a vykonávajú určité akcie s údajmi programovacieho objektu. Technológia OOP zakazuje pracovať s objektom inak ako prostredníctvom metód, teda vnútorná štruktúra objektu je pred externým používateľom skrytá.

Opis množiny objektov rovnakého typu sa nazýva trieda.
Objekt je štruktúrovaná premenná, ktorá obsahuje všetky informácie o nejakom fyzickom objekte alebo koncepte implementovanom v programe.

Trieda je popis množiny programovacích objektov (objektov) a akcií, ktoré sa na nich vykonávajú.

Triedu možno prirovnať k plánu, podľa ktorého sa vytvárajú objekty. Typicky sú triedy vyvinuté takým spôsobom, že ich objekty zodpovedajú objektom domény riešeného problému.

Základné pojmy objektovo orientovaného programovania

Akákoľvek funkcia v programe je metóda pre objekt nejakej triedy.

Trieda by mala byť vytvorená v programe prirodzene hneď, ako bude potrebné popísať nové programovacie objekty. Každý nový krok vo vývoji algoritmu musí predstavovať vývoj novej triedy založenej na existujúcich.

Celý program v tejto forme je objekt nejakej triedy s jednou metódou spustenia.

Programovanie medzi triedami zahŕňa množstvo nových konceptov. Hlavnými konceptmi OOP sú

  • zapuzdrenie;
  • dedičstvo;
  • polymorfizmus.

Zapuzdrenie údajov(z "kapsuly") je mechanizmus, ktorý kombinuje údaje a kód, ktorý s týmito údajmi manipuluje, a zároveň ich chráni pred vonkajšími zásahmi alebo zneužitím. V OOP je možné pri vytváraní objektu kombinovať kód a údaje (v takzvanej „čiernej skrinke“).

V rámci objektu môžu byť kódy a údaje súkromné ​​alebo verejné.

Proprietárny kód alebo údaje sú dostupné iba pre iné časti toho istého objektu, a preto nie sú dostupné pre tie časti programu, ktoré existujú mimo objektu.

Na druhej strane, otvorený zdrojový kód a dáta sú dostupné pre všetky časti programu, vrátane iných častí toho istého objektu.

Dedičstvo . Novú alebo odvodenú triedu možno definovať na základe existujúcej alebo základnej triedy.

V tomto prípade si nová trieda zachová všetky vlastnosti starej triedy: údaje objektu základnej triedy sú zahrnuté v údajoch odvodeného objektu a metódy základnej triedy možno volať na objekt odvodenej triedy. sa vykoná na údajoch objektu základnej triedy, ktorý je v ňom zahrnutý.

Inými slovami, nová trieda zdedí údaje starej triedy aj metódy na ich spracovanie.

Ak objekt zdedí svoje vlastnosti od jedného rodiča, hovorí sa, že ním je jediné dedičstvo. Ak objekt zdedí údaje a metódy z niekoľkých základných tried, hovorí sa, že je viacnásobné dedičstvo.

Príkladom dedenia je definícia štruktúry, ktorej jednotlivým členom je predtým definovaná štruktúra.

Polymorfizmus je vlastnosť, ktorá umožňuje použiť rovnaký identifikátor (rovnaký názov) na riešenie dvoch alebo viacerých podobných, ale technicky odlišných problémov.

Cieľom polymorfizmu, ako je aplikovaný na OOP, je použiť jeden názov na špecifikáciu akcií spoločných pre množstvo tried objektov. Takýto polymorfizmus je založený na možnosti zahrnúť do dát objektu informácie o metódach ich spracovania (vo forme ukazovateľov na funkcie).

Keďže je objekt v určitom bode programu prístupný, môže aj pri absencii úplných informácií o svojom type vždy správne volať svoje vlastné metódy.
Polymorfná funkcia je rodina funkcií s rovnakým názvom, ktoré však vykonávajú rôzne akcie v závislosti od podmienok volania.

Napríklad nájdenie absolútnej hodnoty v C vyžaduje tri rôzne funkcie s rôznymi názvami.

v podstate použila paradigmu preskriptívneho programovania – cieľom bolo vytvoriť kód, ktorý primerane pôsobí na dáta. Tento prístup je dobrý na riešenie malých problémov, ale pri pokuse o vytvorenie vytvára veľa neriešiteľných problémov veľké softvérové ​​systémy.

Jedna z alternatív direktívne programovanie je objektovo orientované programovanie, ktorý naozaj pomáha vyrovnať sa s nelineárne rastúcou zložitosťou programov so zvyšujúcim sa objemom. Nemali by sme však dospieť k záveru, že použitie objektovo orientovaného programovania zaručuje úspešné riešenie všetkých problémov.

Na to, aby ste sa stali profesionálom v programovaní, potrebujete talent, kreativitu, inteligenciu, vedomosti, logiku, schopnosť budovať a používať abstrakcie a hlavne skúsenosti.

V tejto časti budeme pokračovať v úvode do základných pojmov objektovo orientovaného programovania, ktorý sme začali v prvej kapitole knihy. Najprv sa budú diskutovať koncepty OOP spoločné pre rôzne programovacie jazyky a potom ich implementácia v jazyku Java.

Mali by ste si byť vedomí toho, že kurz objektovo orientovaného programovania sa učia vysokoškolskí študenti počas celého semestra, a preto nižšie uvedený materiál predstavuje len veľmi základný úvod do sveta OOP. Oveľa úplnejšie spracovanie mnohých problémov súvisiacich s objektovo orientovaným dizajnom, inžinierstvom a programovaním je obsiahnuté v knihe a v tretej kapitole knihy môžete nájsť veľmi jasný popis všetkých objektovo orientovaných aspektov jazyk Java.

Základné koncepty OOP

objektovo orientované programovanie alebo OOP (objektovo orientované programovanie) - metodológie programovania založené na reprezentácii programu ako súboru objektov, z ktorých každý je implementáciou určitého typu, pomocou mechanizmu preposielanie správ a triedy organizované v dedičná hierarchia.

Ústredným prvkom OOP je abstrakcia. Dáta sa prevedú na objekty pomocou abstrakcie a postupnosť spracovania týchto údajov sa zmení na súbor správ odovzdávaných medzi týmito objektmi. Každý z predmetov má svoje vlastné jedinečné správanie. Objekty možno považovať za konkrétne entity, ktoré reagujú na správy, ktoré im prikazujú vykonať nejakú akciu.

OOP sa vyznačuje nasledujúcimi princípmi (podľa Alana Kay):

  • všetko je objekt;
  • výpočty sa uskutočňujú prostredníctvom interakcie (výmena údajov) medzi objektmi, v ktorej jeden objekt vyžaduje, aby iný objekt vykonal nejakú činnosť; objekty interagujú odosielaním a prijímaním správ; správa je požiadavka na vykonanie akcie, doplnená o súbor argumentov, ktoré môžu byť potrebné pri vykonávaní akcie;
  • každý objekt má nezávislé Pamäť, ktorý pozostáva z iných objektov;
  • každý objekt je zástupcom triedy, ktorá vyjadruje všeobecné vlastnosti objektov daného typu;
  • nastavené v triede funkčnosť(správanie objektu); teda všetky objekty, ktoré sú inštanciami rovnakej triedy, môžu vykonávať rovnaké akcie;
  • triedy sú organizované do jedinej stromovej štruktúry so spoločným koreňom, tzv dedičná hierarchia; pamäť a správanie spojené s inštanciami konkrétnej triedy sú automaticky dostupné pre každú triedu nižšie v hierarchickom strome.

Definícia 10.1. Abstrakcia- spôsob riešenia problému, pri ktorom sa predmety rôzneho druhu spájajú spoločným pojmom (pojmom), a potom sa zoskupené entity považujú za prvky jedinej kategórie.

Abstrakcia umožňuje oddeliť logický význam fragmentu programu od problému jeho implementácie, delenia vonkajší popis(rozhranie) objektu a jeho vnútorná organizácia(realizácia).

Definícia 10.2. Zapuzdrenie- technika, pri ktorej sa v ňom skrývajú informácie, ktoré sú z hľadiska rozhrania objektu bezvýznamné.

Definícia 10.3. Dedičnosť- vlastnosť objektov, prostredníctvom ktorej inštancie triedy získavajú prístup k údajom a metódam tried predkov bez ich predefinovania.

Dedičnosť umožňuje rôznym typom údajov zdieľať rovnaký kód, čo vedie k menšiemu kódu a väčšej funkčnosti.

Definícia 10.4.

Koncept objektovo orientovaného programovania (OOP) sa objavil pred viac ako štyridsiatimi rokmi ako vývoj myšlienok procedurálneho programovania. Ideológia procedurálneho programovania nie je ničím zvláštna: všetky programy sú reprezentované súborom procedúr a funkcií, pričom samotné procedúry a funkcie sú sekvencie príkazov, ktorých vykonaním počítač upravuje hodnoty premenných v pamäti. Hlavným programom v procedurálnom programovaní je aj procedúra (funkcia), ktorej telo môže obsahovať volania iných procedúr a funkcií – podprogramov. Podstata procedurálneho programovania je jednoduchá: dáta sú oddelené, správanie je oddelené. V samostatnej časti som sa pokúsil zhromaždiť, z čoho pozostáva procedurálny programovací jazyk (aké konštrukcie obsahuje). Rozdelenie kódu na podprogramy vám po prvé umožňuje zvýrazniť opakovane použiteľné fragmenty kódu a po druhé robí programový kód štruktúrovaným.

Ideológia objektovo orientovaného programovania, ako už názov napovedá, je postavená na koncepte objektu. Objekt kombinuje údaje aj správanie. Objekt je akákoľvek entita, s ktorou sa program zaoberá, menovite: doménové objekty modelované programom; prostriedky operačného systému; sieťové protokoly a oveľa viac. Objekt je v podstate rovnaká štruktúra (zložený typ), ale doplnená o procedúry a funkcie, ktoré riadia prvky tejto štruktúry. Napríklad na prácu so súborom v procedurálnom programovacom jazyku by sa premenná vytvorila oddelene na uloženie názvu súboru a oddelene na uloženie jeho deskriptora (jedinečný identifikátor zdroja v operačnom systéme), ako aj množstvo procedúr pre práca so súborom: otvorte súbor, načítajte údaje zo súboru a zatvorte súbor. Všetky tieto procedúry by okrem bežných parametrov a premenných na uloženie výsledku museli akceptovať rovnaký deskriptor, aby sme pochopili, o ktorom súbore hovoríme. V objektovo orientovanom jazyku by bol na ten istý účel opísaný objekt súboru, ktorý by v sebe ukladal aj názov a handle a poskytoval používateľovi procedúry na otváranie, čítanie a zatváranie samého seba (súbor spojený s konkrétnym objekt). Rozdiel by bol v tom, že by bol handle skrytý pred zvyškom programu, vytvorený v kóde rutiny na otvorenie súboru a samotný objekt by ho používal len implicitne. Používateľ objektu (programový kód programu mimo objektu) by teda nemusel zakaždým odovzdávať handle v parametroch procedúry. Objekt je súbor údajov a metód na prácu s týmito údajmi, z ktorých niektoré môžu byť skryté pred okolitým svetom, vrátane detailov implementácie. Terminológia objektovo orientovaného programovania bude podrobnejšie diskutovaná nižšie.

V objektovo orientovanom programovacom jazyku je takmer všetko objekt, s výnimkou operátorov: elementárne typy sú objekty, popis chyby je objekt a napokon aj hlavný program je objekt. Zostáva pochopiť, čo je objekt z pohľadu samotného programu, ako sa vytvára a používa. Druhým základným konceptom OOP je trieda. Trieda je nový dátový typ v porovnaní s procedurálnym programovaním, ktorého inštancie sa nazývajú objekty. Trieda, ako už bolo spomenuté, je podobná zloženému dátovému typu alebo štruktúre, avšak doplnená o procedúry a funkcie (metódy) na prácu s jej dátami. Teraz je čas popísať základné pojmy objektovo orientovaného programovania.

Terminológia objektovo orientovaného programovania

Skôr než prejdeme k popisu výhod, ktoré OOP dáva vývojárom softvéru v procese navrhovania, kódovania a testovania softvérových produktov, je potrebné sa oboznámiť s najčastejšie používanými pojmami v tejto oblasti.

  • Trieda– dátový typ, ktorý popisuje štruktúru a správanie objektov.
  • Objekt– inštancia triedy.
  • Lúka– dátový prvok triedy: premenná elementárneho typu, štruktúry alebo inej triedy, ktorá je súčasťou triedy.
  • Stav objektu– súbor aktuálnych hodnôt poľa objektu.
  • Metóda– procedúra alebo funkcia, ktorá sa vykonáva v kontexte objektu, na ktorom je volaná. Metódy môžu zmeniť stav aktuálneho objektu alebo stav objektov, ktoré im boli odovzdané ako parametre.
  • Nehnuteľnosť– špeciálny typ metód určených na úpravu jednotlivých polí objektu. Názvy vlastností sú zvyčajne rovnaké ako názvy zodpovedajúcich polí. Navonok práca s vlastnosťami vyzerá úplne rovnako ako práca s poľami štruktúry alebo triedy, ale v skutočnosti pred vrátením alebo priradením novej hodnoty do poľa je možné spustiť programový kód, ktorý vykoná rôzne typy kontrol, napríklad kontrolu či je nová hodnota platná.
  • Člen triedy– polia, metódy a vlastnosti triedy.
  • Modifikátor prístupu– dodatočná charakteristika členov triedy, ktorá určuje, či sú prístupní z externého programu, alebo či sa používajú výlučne v rámci hraníc triedy a sú skryté pred vonkajším svetom. Modifikátory prístupu oddeľujú všetkých členov triedy na podrobnosti implementácie a verejné alebo čiastočne verejné rozhranie.
  • Konštruktér– špeciálna metóda spustená ihneď po vytvorení inštancie triedy. Konštruktor inicializuje polia objektu - uvedie objekt do počiatočného stavu. Konštruktory môžu byť s parametrami alebo bez nich. Konštruktor bez parametrov sa nazýva predvolený konštruktor, ktorý môže mať iba jeden. Názov metódy konštruktora sa najčastejšie zhoduje s názvom samotnej triedy.
  • Deštruktor– špeciálna metóda, ktorú volá prostredie vykonávania programu v momente, keď je objekt odstránený z RAM. Deštruktor sa používa v prípadoch, keď trieda obsahuje prostriedky, ktoré vyžadujú explicitné uvoľnenie (súbory, databázové pripojenia, sieťové pripojenia atď.)
  • Rozhranie– súbor metód a vlastností objektu, ktoré sú verejne dostupné a určené na riešenie určitého okruhu problémov, napríklad rozhranie na generovanie grafického znázornenia objektu na obrazovke alebo rozhranie na ukladanie stavu objektu v súbore alebo databáze.
  • Statický člen– akýkoľvek prvok triedy, ktorý možno použiť bez vytvorenia zodpovedajúceho objektu. Napríklad, ak metóda triedy nepoužíva jedno pole, ale pracuje výlučne s parametrami, ktoré sú jej odovzdané, potom nič nebráni jej použitiu v kontexte celej triedy bez toho, aby sa vytvorili jej samostatné inštancie. Konštanty v kontexte triedy sú zvyčajne vždy statickými členmi triedy.

Výhody objektovo orientovaného programovania

Teraz si povedzme o vlastnostiach, ktoré program získava pri použití objektovo orientovaného prístupu k jeho návrhu a kódovaniu. Zdá sa mi, že väčšina z týchto vlastností sú výhody OOP, ale existujú aj iné názory na túto vec...

  • Zapuzdrenie označuje skrytie detailov implementácie triedy odmeňovaním jednotlivých členov vhodnými modifikátormi prístupu. Všetky funkcie objektu zamerané na interakciu s inými objektmi programu sú teda zoskupené do otvoreného rozhrania a detaily sú starostlivo skryté vo vnútri, čo šetrí hlavný kód obchodnej logiky informačného systému od nepotrebných vecí. Zapuzdrenie zlepšuje spoľahlivosť vášho kódu, pretože zaisťuje, že určité údaje nemožno zmeniť mimo triedy obsahujúcej.
  • Dedičnosť. Základný kameň OOP. V objektovo orientovanom programovaní je možné zdediť štruktúru a správanie triedy od inej triedy. Trieda, z ktorej dedia, sa nazýva základ alebo nadtrieda a trieda, ktorá sa získa ako výsledok dedenia, sa nazýva odvodená alebo jednoducho potomok. Každá trieda môže pôsobiť ako nadtrieda aj ako potomok. Vzťahy dedenia tried tvoria hierarchiu tried. Viacnásobná dedičnosť je definícia triedy odvodenej od niekoľkých supertried naraz. Nie všetky objektovo orientované programovacie jazyky podporujú viacnásobnú dedičnosť. Dedičnosť je efektívny spôsob, ako izolovať opakovane použiteľné časti kódu, má však aj nevýhody, o ktorých sa bude diskutovať neskôr.
  • Abstrakcia. Schopnosť spájať triedy do samostatných skupín, zvýrazniť spoločné charakteristiky, ktoré sú pre nich dôležité (spoločné polia a spoločné správanie). Abstrakcia je vlastne dôsledkom dedenia: základné triedy nemajú vždy svoju vlastnú projekciu na objekty reálneho sveta, ale sú vytvorené výhradne za účelom zvýraznenia spoločných čŕt celej skupiny objektov. Napríklad nábytkový predmet je základným pojmom pre stôl, stoličku a pohovku, všetky spája to, že sú hnuteľným majetkom, súčasťou interiéru priestorov a dajú sa vyrobiť do domácnosti či kancelárie. , a tiež odkazujú na „ekonomické“ alebo „prémiové“ ” triedy. V OOP je na to samostatný koncept: abstraktná trieda - trieda, ktorej objekty je zakázané vytvárať, ale môže byť použitá ako základná trieda. Dedičnosť a abstrakcia umožňujú opísať dátové štruktúry programu a vzťahy medzi nimi presne tak, ako vyzerajú zodpovedajúce objekty v uvažovanom doménovom modeli.

Príklad diagramu tried zostaveného abstrakciou počas analýzy typov existujúcich vozidiel je znázornený na nasledujúcom obrázku. Na vyšších úrovniach hierarchie dedičnosti existujú abstraktné triedy, ktoré spájajú vozidlá podľa najvýznamnejších charakteristík.

Diagram tried alebo hierarchia dedičstva „Vozidlá“. Biele štvorce predstavujú abstraktné triedy.

  • Polymorfizmus. Ďalšia vlastnosť, ktorá je dôsledkom dedenia. Faktom je, že objektovo orientované programovacie jazyky vám umožňujú pracovať so súborom objektov z rovnakej hierarchie rovnakým spôsobom, ako keby to boli všetky objekty ich základnej triedy. Ak sa vrátime k príkladu o nábytku, môžeme predpokladať, že v rámci tvorby informačného systému pre predajňu nábytku je rozumné pridať do základnej triedy pre všetky typy nábytku spoločnú metódu „ukázať charakteristiky“. Pri tlači charakteristík všetkých druhov tovaru by program túto metódu volal bez rozdielu pre všetky objekty a každý konkrétny objekt by sa sám rozhodol, aké informácie mu poskytne. Ako sa to implementuje: Po prvé, základná trieda definuje spoločnú metódu pre všetkých so spoločným správaním. V prípade nášho príkladu pôjde o metódu, ktorá vytlačí parametre spoločné pre všetky typy nábytku. Po druhé, v každej odvodenej triede tam, kde je to potrebné, predefinujú základnú metódu (pridajú metódu s rovnakým názvom), kde základné správanie rozšíria o svoje vlastné, napríklad zobrazia charakteristiky, ktoré sú charakteristické len pre konkrétny typ nábytkársky výrobok. Metóda v základnej triede niekedy nemusí obsahovať vôbec žiadny kód, ale je potrebná len na definovanie názvu a množiny parametrov – podpisu metódy. Takéto metódy sa nazývajú abstraktné metódy a triedy, ktoré ich obsahujú, sa automaticky stávajú abstraktnými triedami. Polymorfizmus je teda schopnosť jednotne komunikovať s objektmi rôznych tried prostredníctvom špecifického rozhrania. Ideológia polymorfizmu hovorí, že na komunikáciu s objektom nepotrebujete poznať jeho typ, ale skôr aké rozhranie podporuje.
  • Rozhranie. V niektorých programovacích jazykoch (C#, Java) je pojem rozhrania jasne definovaný – nejde len o verejné metódy a vlastnosti samotnej triedy. Takéto jazyky spravidla nepodporujú viacnásobnú dedičnosť a kompenzujú to tým, že umožňujú ľubovoľnému objektu mať jeden základný objekt a implementovať ľubovoľný počet rozhraní. V ich interpretácii je rozhranie ako abstraktná trieda obsahujúca iba popis (podpis) verejných metód a vlastností. Implementácia rozhrania padá na plecia každej triedy, ktorá ho má v úmysle podporovať. Rovnaké rozhranie môže byť implementované triedami úplne odlišných hierarchií, čo rozširuje možnosti polymorfizmu. Napríklad rozhranie „ukladanie/obnovenie informácií v databáze“ by mohli implementovať obe triedy hierarchie „nábytok“ a triedy spojené so zadávaním objednávok na výrobu nábytku, a keď kliknete na tlačidlo „uložiť“, program by prešiel všetky objekty, požiadal by ich o toto rozhranie a zavolal by zodpovedajúcu metódu.

Objektovo orientované programovanie sa neustále vyvíja, čím vznikajú nové paradigmy, akými sú aspektovo orientované, subjektovo orientované a dokonca aj agentovo orientované programovanie. Treba si uvedomiť, že vavrín OOP straší aj ostatných teoretikov a tí sa ponáhľajú ponúkať vlastné možnosti na jeho zlepšenie a rozšírenie. Prototypové programovanie eliminuje koncept triedy a nahrádza ho prototypom – príkladom objektu. V prototypovo orientovanom jazyku teda neexistuje koncept typu objektu, ale existuje koncept vzoru alebo prototypu. Prototyp je inštancia objektu, z ktorého sa kopírovaním (klonovaním) jeho členov vytvárajú ďalšie inštancie. V JavaScripte nepopisujete polia a metódy triedy, ale najprv vytvoríte prázdny objekt a potom k nemu pridáte potrebné polia a metódy (v JavaScripte je možné metódu definovať a pridať k objektu dynamicky). Rovnakým spôsobom vznikajú prototypy, ktoré potom ostatné objekty označujú ako svoj prototyp. Ak objekt nemá nejakú metódu alebo pole, ktoré je špecifikované v mieste volania, potom sa hľadá medzi členmi svojho prototypu.

Niektoré prvky moderného objektovo orientovaného programovania

Čas sa nezastaví a od príchodu OOP už uplynulo pomerne veľa času, takže by nemalo byť prekvapujúce, že sa dnes slovná zásoba objektovo orientovaného programovania výrazne rozrástla. Takže tu sú niektoré nové termíny a koncepty súvisiace s OOP.

  • Diania. Špeciálny typ objektov vytvorený na upozorňovanie niektorých objektov na udalosti vyskytujúce sa s inými objektmi. V rôznych programovacích jazykoch je mechanizmus udalostí implementovaný rôznymi spôsobmi: niekedy pomocou špeciálnych syntaktických konštrukcií a niekedy pomocou základných nástrojov OOP.
  • Univerzálny typ. Koncept generických typov priamo nesúvisí s pojmom OOP, ale je dôvodom výskytu prvkov, ako sú generická trieda, generická metóda, generická udalosť atď. Generický typ je typ, ktorý je parametrizovaný iným typom (množinou typov). Čo je tento typ parametra v kontexte návrhu všeobecného typu, nie je známe, aj keď je možné obmedziť hodnoty typov parametrov tým, že ich prinútite odvodiť sa od špecifickej triedy alebo implementovať určité rozhrania. Príkladom je univerzálna trieda na triedenie postupnosti prvkov, kde je typ prvku v postupnosti vopred neznámy. Pri navrhovaní takejto triedy je dôležité špecifikovať, že typ parametra musí podporovať operáciu porovnávania. Pri vytváraní objektov generických typov explicitne zadáte parameter, ako napríklad typ typu celé číslo alebo reťazec, a samotný objekt sa začne správať, ako keby bol inštanciou triedy vytvorenej špeciálne na triedenie celých čísel alebo reťazcov.
  • Výnimky. Ďalší špeciálny typ objektu podporovaný mechanizmom na spracovanie chýb a výnimiek zabudovaným do špecifického programovacieho jazyka. Výnimky okrem kódu chyby obsahujú jeho popis, možné príčiny a zásobník volaní metód, ktoré sa vyskytli predtým, ako sa v programe vyskytla výnimka.

Nevýhody objektovo orientovaného programovania

Už som povedal, že obľuba objektovo orientovaného prístupu k tvorbe softvérových produktov je obrovská. Už som tiež poznamenal, že existuje pomerne veľa tých, ktorí sa snažia túto paradigmu rozšíriť. Existuje však aj iný spôsob, ako vyniknúť medzi obrovskou komunitou špecialistov na informačné technológie – tým je vyhlásiť, že OOP sa neospravedlnila, že nie je všeliekom, ale skôr placebom. Medzi týmito ľuďmi sú naozaj špičkoví špecialisti ako Christopher Date, Alexander Stepanov, Edsger Dijkstra a ďalší a ich názor si zaslúži pozornosť, no sú aj takí, o ktorých hovoria, že „vždy niečo stojí v ceste zlý tanečník." Tu sú najzreteľnejšie nevýhody OOP, na ktoré odborníci poukazujú:

1. OOP generuje obrovské hierarchie tried, čo vedie k tomu, že funkcionalita je rozprestretá alebo, ako sa hovorí, rozmazaná naprieč základnými a odvodenými členmi triedy a je ťažké sledovať logiku fungovania konkrétnej triedy. metóda.

2. V niektorých jazykoch sú všetky dáta objektmi, vrátane elementárnych typov, a to môže viesť k ďalšej spotrebe pamäte a času CPU.

3. Taktiež rýchlosť vykonávania programu môže byť nepriaznivo ovplyvnená implementáciou polymorfizmu, ktorý je založený na mechanizmoch pre neskoré viazanie volania metódy s jej špecifickou implementáciou v jednej z odvodených tried.

4. Psychologický aspekt. Mnoho ľudí si myslí, že OOP je cool a začínajú používať jeho prístupy vždy a všade a bez rozdielu. To všetko vedie najmä k poklesu výkonnosti programu a všeobecne k diskreditácii OOP.