Všeobecné programovacie princípy

Ešte predtým ako sa vrhneme na príklady konkrétneho zdrojového kódu, chcel by som popísať aspoň pár základných princípov programovania bez ohľadu na použitý programovací jazyk. Budem sa snažiť jednoducho popísať tieto princípy tak, aby sme ich v ďalšej časti mohli úspešne aplikovať.

Lineárny kód
Úplne prvý kód vznikal na diernych štítkoch, kde čítač diernych štítkov čítal riadky dier linerárne po sebe. Takže ak sa niektoré časti kódu opakovali, museli byť napísané / vydierkované viackrát. Podobne fungoval aj prvý jazyk Assembler, ktorý už ale priniesol niektoré vylepšenia.

Funkcie
Funkcie riešia problém opakujúceho sa kódu, ktorý zároveň umožňuje vyššiu prehľadnosť pri čítaní zdrojového kódu. Kód je v takom prípade členený do funkcií, ktoré sú volané z iných funkcií. Dohodnutý úzus je špeciálna funkcia main, ktorá je automaticky zavolaná po štarte aplikácie (tzv. entry point) a tá je zodpovedná za volanie iných funkcií.

Premenné
Premenné asi poznáme z matematiky ako zástupný symbol (x, y) pre množinu čísel, typicky v rovniciach (2x + 5 = 0). Presne tento princíp prevzali programovacie jazyky, len ho rozšírili. Premenná je miesto v pamäti, a má atribút tzv. dátový typ premennej a podľa toho zaberá príslušný počet bajtov v pamäti.

Dátové typy
Dátový typ nám určuje povolené operácie nad množinou premenných, napr ak je premenná číselného typu, tak vieme sčítať 2 takéto premenné, napr 2+2 = 4. Ak je premenná znakového typu, tak ich sčítanie bude prebiehať inak napr. takto “Ahoj “+ “ľudia” = “Ahoj ľudia”. Takisto tieto znakové typy budú poskytovať operácie na pridanie znaku či jeho odseknutie, hľadanie prvého výskytu znaku či znakov v reťazci alebo jeho rozdelenie, napr rozdelenie vety na slová na základe znaku medzera, ktorý chápeme v tomto prípade ako oddeľovač. Existujú aj komplexnejšie dátové typy, ktoré využívajú princípy objektového programovania alebo šablón a slúžia napr na internú informáciu pri spracovaní dát, napr. ak si potrebujeme udržiavať stav stlačenia tlačítok, na ktoré užívateľ klikol a máme ich veľa, tak nejaké zgrupenie nám umožňujú komplexné dátové typy ako pole, vektor, set, mapa, zásobník, fronta alebo aj binárny strom.

Cykly
Cykly riešia problém opakujúceho sa kódu, ak vopred nevieme koľkokrát sa bude časť kódu alebo volanie funkcie opakovať, napr ak čakáme na stlačenie klávesy od užívateľa až pokiaľ nestlačí špeciálnu kombináciu (Ctrl+C, Alt+F4 apod). Vtedy je súčasťou cyklu tzv. podmienka, ktorá vyhodnotí či má cyklus pokračovať do ďalšej iterácie alebo má byť ukončený.

Moduly
Moduly prinášajú možnosť rozdelenia zdrojového kódu do viacerých súborov a prináša tak možnosť ešte väčšieho sprehľadnenia, ak zdrojový kód obsahuje niekoľko tisíc riadkov. Programátor typicky rozdeľuje kód do rôznych textových súborov podľa toho ako spolu logicky súvisia, napr. v jednom súbore môžu byť združené funkcie pristupujúce k databáze, iný súbor zas môže združovať funkcie pre vykresľovanie čiar na obrazovke.

Objektový model (OOP)
Objektové programovanie prináša ešte vyššiu možnosť delenia zdrojového kódu na tzv. objekty alebo triedy. Podľa použitia vytvoríme triedu a nazveme ju napr. Databáza. Trieda bude poskytovať metódy (funkcie) read a write, ktoré budú čítať požadované dáta z databázy a zapisovať dáta do databázy. Táto trieda sa fyzicky môže nachádzať v tom istom súbore ako je metóda main, môže byť oddelená v inom súbore alebo dokonca môže byť súcasťou inej triedy (tzv nested class), to je rozhodnutie programátora alebo architekta projektu. Trieda je abstraktný objekt, ktorý v čase spustenia programu neexistuje a čaká na svoje použitie. Funkcia main môže vytvoriť v pamäti inštanciu triedy a tá už existuje fyzicky v pamäti a pamätá si svoje stavy, resp. viacero inštancií jednej triedy a každá z inštancií je nezávislá a môže nadobúdať iné stavy vo svojich premenných, pretože každá inštancia sa nachádza na inom pamäťovom mieste. V niektorých jazykoch je tento abstraktný objekt nazývaný trieda a jeho konkrétny prejav inštancia, v iných jazykoch je zas inštancia volaná ako objekt. Niektoré jazyky vôbec nepoznajú objekty. Špeciálnym prípadom triedy je tzv. statická trieda, ktorá ma len jednu inštanciu a tá automaticky existuje hneď po spustení programu.
Objekty zároveň vnášajú do programovania mnohé nové princípy, napr dedičnosť, kedy jedna trieda môže zdediť od druhej triedy jej metódy. Toto vnáša do zdrojového kódu novú komplexitu, ktorá robí pre nových programátorov obrovský problém čítať tento kód a porozumieť mu. V praxi musia preskakovať cez niekoľko rôznych súborov, aby pochopili, čo sa deje v jednej metóde.

Asynchrónne volania (Timer Lambda Vlákna Korutiny)
Všetky príklady doteraz len zlepšovali čitateľnosť zdrojového kódu, ale z pohľadu behu programu umožňovali stále len lineárny priebeh, tj spracúval sa riadok za riadkom a nebolo umožnené aby sa 2 operácie vykonávali paralelne a vzájomne sa neblokovali, napr. čakanie na odozvu servera niekde z Ameriky by nemala blokovať možný užívateľský vstup alebo vykresľovanie na obrazovke. Toto riešia mnohé prístupy tzv. asynchrónnych volaní, ktoré sú v rôznych jazykoch rôzne implementované. Napr Jazyk C++ poskytuje hneď niekoľko možností. Jednou z nich je rozdelenie zdrojového kódu do funkcií, ktoré sú spúšťané v rôznych vláknach. Štandardne má program len jedno hlavné vlákno, ale v prípade potreby môže programátor vytvoriť viac-vláknovú aplikáciu. Operačný systém následne prepína procesorový čas medzi jednotlivými vláknami akokeby to boli nezávislé aplikácie. Len pripomeniem, že občas sa stane, že vlákna nie sú dobre navrhnuté a program príde do stavu, kedy sa vzájomne blokujú a nastáva tzv. deadlock, ktorý sa veľmi ťažko vyšetruje, kde presne nastala chyba. Medzi ďalšie príklady patrí timer, kedy si nastavíme čas, o ktorý má byť daný kód prebudený a môžeme napr periodicky kontrolovať či už je nejaká operácia ukončená. V neskorších verziách sa C++ pokúša o iný prístup, ktorý nazval korutiny. Mne osobne sôr vyhovuje prístup iných jazykov (C#, Javascript), ktoré vo veľkom využívajú tzv lambda operátor ( => ). Kód za týmto operátorom je spustený až v prípade ak nastane situácia, ktorá je požadovaná.

Toto sú podľa mňa základné princípy, ktoré je nutné poznať predtým ako sa vrhneme na samotný kód a dá sa na týchto znalostiach stavať. Samozrejme, mnohé detaily som ešte nespomenul. Napr. dátový typ boolean ktorý nadobúda hodnoty pravda / nepravda ( true/false ), konkrétne typy podmienok či cyklov, logické operácie, ale cez to všetko sa musíme nejako spoločne prehrýzť:) Dúfam, že vám vydrží motivácia, tak ako aj mne.


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *