Objektovo orientované programovanie (OOP)
V úvodných prednáškach tohto semestra si porozprávame (a ukážeme) niečo o objektovo orientovanom programovaní. Veľmi ťažko sa mi píše úvod k tejto kapitole, pretože sa vám nedá jedným slovom jasne vysvetliť, o čom to asi bude. Nie je to ani ďalší iný jazyk, ani nová technológia, ani nové funkcie a teoreticky s tým ani nič nové nespravíte, oproti tomu, čo ste sa doteraz naučili. Keby som ale musel, tak by som vám to v skratke asi zhrnul tak, že je to iný štýl-spôsob-štruktúra-systém programovania, resp. písania kódu, aký sme doteraz používali.
Nejedná sa o jazyk CSS alebo HTML a v našom prípade ani o MySQL a JavaScript, ale práve o kód PHP, skrátka o kód, ktorým je naprogramovaná logika (funkcionalita) informačného systému. V podstate tam, kde sa pracuje najmä s dátami, čiže komunikácia s databázou a transformácia a úprava dát tak, ako ich potrebujeme pre zobrazenie formou webu.
Nehovorím, že to, ako sme to robili doteraz, je zlé, aj keď niektorí z vás sa možno stretnú v budúcnosti a v praxi s takýmto názorom. Aby sme ale nerobili zbytočne paniku, to, ako sme sa doteraz učili programovať, nie je v žiadnom prípade zlé a nesprávne. Štýl, akým sme sa učili písať kód v jazyku PHP v súvislosti s dátami, sa všeobecne nazýva procedurálny a bol prevažne používaný od samotného vzniku programovania až teoreticky do týchto čias. Stále sa tento štýl programovania používa, vyučuje a prevažne na malých a nie veľmi robustných systémoch (webstránok) bohate stačí a netreba ho nahrádzať objektovo orientovaným programovaním. Procedurálny preto, pretože je náš kód akokeby riadený a z väčšej časti zložený z procedúr (funkcií), v ktorých sa vykonáva viacero operácií a tieto funkcie sú volané kdekoľvek v kóde. Ešte raz opakujem, tento štýl nie je zlý, je to štandard, takto sa programuje a určite týmto štýlom spravíme čokoľvek, čo nám bude treba.
Už dávnejšie však vzniklo objektovo orientované programovanie (OOP) ako nový (iný) štýl programovania – písania kódu a skladania algoritmu (špeciálne tvorenie premenných a funkcií a ich volanie). Najmä posledné roky sa tento štýl programovania stáva akýmsi štandardom a v podstate väčšina komerčných a voľne dostupných systémov je písaná týmto štýlom (eshopy, stránky zadarmo, systémy na vytvorenie stránky bez programovania, frameworky). Možno si poviete, sme iba začiatočníci, snažíme sa najmä pochopiť ako programovanie a tvorba systémov a práca s dátami funguje, načo sa týmto hneď (teoreticky stále na začiatku) zaťažovať.
Je ale dobré prejsť si tento spôsob a pochopiť ho, pretože v praxi (vo firmách) sa skoro všade programuje týmto štýlom, takže bude dobré, ak ho spolu pochopíme a následne či už v praxi alebo pri ďalšom vašom vedomostnom vývoji sa v ňom môžete, ak budete chcieť, viac zdokonaliť. Skrátka, ak to uvidíte, budete vedieť, o čo ide a nebudete prekvapený, že takému kódu nechápem. Cieľom tohto portálu je ukázať vám čo najviac vecí, aby ste mali čo najširší prehľad so základnými vedomosťami.
Predtým, ako sa do toho pustíme, ešte pár viet na záver. Stretnete sa s názormi že procedurálne je zastaralé, neefektívne, že s tým niečo neviete spraviť. Že OOP je štandard, že to je moderné, že to má kopu výhod. Taktiež, že procedurálne programovanie sa hodí iba na malé a stredne malé systémy a že na veľké a zložité je určené OOP. Ja nejdem vyjadrovať svoj názor, pre mňa a aj pre vás to je nateraz úplne nepodstatné. Stačí vám vedieť, že to, čo potrebujete momentálne spraviť (naprogramovať), môžete napísať aj jedným štýlom aj druhým, výsledok bude rovnaký, len štruktúra a množstvo kódu bude iné. Nezamýšľajme sa zbytočne, čo je dobré, čo je lepšie, čo má aké výhody a nevýhody, na to je ešte priskoro, zistíte neskôr v praxi. OOP sa vám teraz možno bude zdať zbytočne komplikované a pracné (písanie kódu). Jednoducho..berme to ako fakt, existuje aj taký spôsob aj taký spôsob.
Ako to teda vyzerá? Štandardný procedurálny kód vyzerá nejako takto, podobne ako sme to doteraz robili:
$data = array();
//PRIPOJENIE DO DB
function pripojenieDoDb(){
$server_name = "localhost";
$db_user_name = "root";
$password = "root";
$dbname = "zapr_db_1";
$connection = mysqli_connect($server_name, $db_user_name, $password, $dbname);
if (!$connection) {
echo '<p class="error">Spojenie s databázou sa nepodarilo nadviazať.</p>';
return false;
}else{
return true;
}
}
//zavolanie funkcie – pripojime sa na databazu
if(pripojenieDoDb()){
//pokracujeme v kode
$data = nacitajDataZdatabazy();
//nejake spracovanie dat
spracujData();
};
Ako vidíte, táto názorná ukážka kódu vyzerá podobne, ako sme doteraz kód písali my. Na začiatku máme zväčša definované premenné, ktoré sú v kóde použité. Potom máme zadefinované funkcie, ktoré sa v kóde volajú na ľubovoľnom mieste ľubovoľne veľakrát. A následne ide telo programu, kde sa zaradom od hora dole vykonávajú funkcie, priradenia, iná funkcionalita a príkazy (cykly, podmienky...). Pri takomto kóde je každá premenná samostatná, žiadna so žiadnou nemá nič spoločné, nič spolu nezdieľajú, každá predstavuje svoj vlastný priestor a hodnotu. Takisto aj funkcie, každý funkcia je samostatná, nesúvisí so žiadnou inou funkciou a ani s inou premennou, nie sú ničím prepojené. Každá funkcia a premenná má svoj význam, tak ako aj každý riadok kódu a samotný chod programu ide od hora dole.
V OOP je toto úplne inak, základným stavebným kameňom takého kódu je samotný objekt (object) a na tom je postavená celá logika. Lepšie to pochopíte v nasledujúcich prednáškach, kde si kód budeme prakticky písať v našom projekte. Môžeme si ale povedať stručne, ako to asi funguje. Pre akúkoľvek fukcionalitu sa vytvára objekt, čo je akokeby špeciálna premenná, ktorá môže obsahovať ľubovoľne veľa iných premenných, ale okrem toho môže ona sama v sebe obsahovať aj funkcie. Samozrejme tieto premenné a funkcie by mali s týmto objektom nejako súvisieť, resp. ho nejako popisovať alebo s ním vykonávať nejakú činnosť. Toto všetko sa definuje v triede, čo je akokeby popis objektu (trieda objektov rovnakých vlastností). To, že objekt tieto premenné a funkcie obsahuje, neznamená nič iné, iba že sú akokeby pod ním definované (deklarované v jeho triede). K jednotlivým premenným a funkciám potom pristupujeme cez tento objekt.
Triedu objektu si na začiatku kódu zadefinujeme, čiže určíme jeho premenné a funkcie (tak, ako sme to robili doteraz). Potom v kóde, kde je funkcionalita, si takýto objekt, tam kde ho potrebujeme, vytvoríme a normálne ho priradíme do premennej, takže tá daná premenná bude objektom. To, že bude tým objektom, bude znamenať, že bude mať všetky tie premenné a funkcie, ktoré sme pri popisovaní objektu definovali, takže k ním budeme môcť pristupovať a volať. Napríklad kód ohľadom databázy z vyššie uvedeného kódu by mohol náčrtom OOP štýlom vyzerať nejako takto:
trieda Databaza{
premenna meno = '';
premenna prihlasovacie_meno = '';
premenna prihlasovacie_heslo = '';
//PRIPOJENIE DO DB
funkcia PripojSaDoDatabazy(){
$connection = mysqli_connect($server_name, $db_user_name, $password, $dbname);
}
}
$databaza = vytvor_novy_objekt_triedy Databaza();
$databaza-> PripojSaDoDatabazy();
Ako vidíte, vytvorili sme si triedu (class) s názvom Databáza. Táto trieda nám bude slúžiť na základnú prácu s databázou. Obsahuje tri premenné, ktoré ju akokeby popisujú, resp. ktoré pri tejto triede potrebujeme. Prístup k týmto premenným bude len cez objekt tejto triedy, nijak inak sa k týmto hodnotám nedostaneme. Potom sme si zadefinovali funkciu, ktorá sa pripojí do databázy, takisto sa k tejto funkcii inak nedostaneme, len cez objekt tejto triedy. Takto by sme v prípade OOP štýlu mali na začiatku kódu nadefinované všetky triedy, ktoré potrebujeme (databáza, používateľ...) a následne by išla hlavná časť programu.
Na prvom riadku kódu by sme vytvorili objekt triedy Databaza. To znamená, že v premennej $databaza sa nachadza objekt (inak zvaný inštancia) triedy Databaza, takže obsahuje vyššie definované premenné a funkciu. Na druhom riadku pomocou pomlčky a otvoreného zobáčika (->) voláme funkciu daného objektu. Takto presne to bude vyzerať. V podstate každý riadok hlavnej časti kódu (za definovaním tried) by mal obsahovať buď vytvorenie alebo prácu s nejakými objektami. Takýto kód je možno lepšie čitateľný a uprataný, pri pohľade na každý riadok je vidno, s ktorým objektom sa pracuje. Každý objekt na niečo konkrétne slúži a premenné ho jasne popisujú, takže je ľahšie rozoznateľné, čo daný riadok vykonáva.
Toto bola len teoretická ukážka, ako to asi vyzerá, poďme si to ale aplikovať do nášho projektu, aby sme videli naozaj, ako to má vyzerať.