Týmto článkom by som vám chcel predstaviť zaujímavé tipy a triky v jazyku C++, ktoré by ste mohli použiť vo vašom kóde. Sú veľmi jednoduché, pretože sú určené pre začiatočníkov. Navyše by som vás chcel upozorniť na niektoré často sa opakujúce chyby, ktoré sa vo vašom kóde môžu na začiatku vyskytovať. Nejedná sa o chybu v pravom zmysle slova, teda nie takú, po ktorej by bol váš kód nepreložiteľný, skôr sa jedná o obrúsenie vášho programátorského štýlu, či vytvorenie takého kódu, ktorý bude rýchlo vykonávaný.
Poslednú spomínanú vlastnosť dosiahnete s C++ ľahko, pretože kódy, ktoré navrhnete v C++ sa vykonajú oveľa rýchlejšie ako tie, ktoré navrhnete v iných jazykoch. Viem programovať vo viacerých jazykoch a preto to mám skutočne odskúšané. Pamätajte, že C++ to však nevykoná za vás, pretože aj tam sa dá vytvoriť veľmi špatný kód. Zámerne so použil termín špatný, hoci nie je odborný. Myslím tým kód, v ktorom zlým štýlom a technikou nedosiahnete požiadavky, ktoré sa na kód kladú. Príkladom môže byť práve rýchlosť vykonávania spustiteľného kódu, jeho prehľadnosť, či ľahká udržiavateľnosť. V nasledujúcich riadkoch vám to na pár príkladoch ozrejmím.
Príklady tipov, trikov a chýb
Určite ste sa už v programovaní pokúšali naprogramovať jednoduché matematické operácie. Majme teda nasledovný kód:
#include <iostream>
int main()
{
int a;
int b = -1;
int c;
int d = 4;
int e = 2;
int f = 3;
int g;
a = b + c;
d = e - f;
g = a * d;
std::cout << "g = " << std::endl;
std::cin.get();
std::cin.get();
return 0;
}
Najprv by som sa vás chcel spýtať, či sa vám takto napísaný kód na prvý pohľad páči. Myslím tým po koncepčnej stránke. Prvou chybou je, že začínajúci programátori neodsadzujú bloky kódu. Tak napríklad tento kód by sa dal pekne odsadiť pomocou nasledujúcich pravidiel.
Oddeľte direktívy preprocesora od hlavičky funkcii main(). Oddeľte deklarácie a definície premenných od zvyšku kódu. Niekedy, keď budete používať veľa premenných, môžete aj jednotlivé deklarácie premenných usporiadať do logických celkov. Môžete vytvoriť bloky kódu podľa typu premennej. Navyše, jazyk C++ vám umožňuje deklarovať a inicializovať premennú namieste, kde to skutočne potrebujete, čiže predtým, ako ju použijete.
Ďalej, v tomto kóde oddeľte nosnú časť kódu a to vytvorte blok kódu, kde sa vykonávajú jednotlivé matematické operácie.
Nakoniec, oddeľte zápis na obrazovku a tiež načítanie zo vstupu klávesnice. Potom už len oddelíte kľúčové slovo return s jeho návratovou hodnotou. Po spomenutých úpravách vám vznikne čitateľný kód, ktorý vyzerá nasledovne:
#include <iostream>
int main()
{
int a;
int b = -1;
int c;
int d = 4;
int e = 2;
int f = 3;
int g;
a = b + c;
d = e - f;
g = a * d;
std::cout << "g = " << std::endl;
std::cin.get();
std::cin.get();
return 0;
}
Keď sa ďalej pozrieme na kód, môžeme niektoré deklarácie umiestniť na jeden riadok. Konkrétne prevedenie nechám na vás, ale ja by som odporúčal deklarovať na jednom riadku premenné, ktoré sa neinicializujú hneď na začiatku súčasne s deklaráciou. Na druhý riadok by som umiestnil premenné, ktoré sa inicializujú súčasne s deklaráciou. Takto získate ešte väčší prehľad v kóde a ušetríte 4 riadky kódu. Kód bude vyzerať nasledovne:
#include <iostream>
int main()
{
int a, c, g;
int b = -1, d = 4, e = 2, f = 3;
a = b + c;
d = e - f;
g = a * d;
std::cout << "g = " << std::endl;
std::cin.get();
std::cin.get();
return 0;
}
Teraz prejdeme k spomínanej rýchlosti. Je mi jasné, že pri tak krátkom kóde ušetríme relatívne málo času, ale keby sa nosná časť kódu, čiže tri matematické operácie s priraďovaním, vykonávali v cykle napr. 1 000 000 krát, videli by ste zaručene rozdiel.
V uvedenom príklade nie je nutné použiť 7 premenných a výsledok vyhodnocovať na trikrát. Výsledky b + c a e - f sa vynásobia a priradia do ďalšej premennej. Tak, ako to je naprogramované, je to zbytočné. Skúste všetko vyhodnotiť ako jeden výraz a priradiť na jednom riadku. Vznikne nám kód, ktorý bude mať o dva riadky menej a bude vykonávať to isté.
A v čom je vlastne problém. No v operátore priradenia. Táto operácia je príliš časovo náročná. V podstate sa musí presunúť hodnota premennej uložená na jednom pamäťovom mieste do pamäťového miesta, ktoré je určené pre inú premennú. A po kurze už viete, že počítač pozná len 0 a 1. Organizačne existuje najmenej jeden bajt. Nespomínal som síce, čo je zásobník, ale keď sa pohybujeme v jeho pamäti, trvá to ešte dlhšie. Vráťme sa ale späť, po úprave bude kód vyzerať nasledovne:
#include <iostream>
int main()
{
int g;
int b = -1, d = 4, e = 2, f = 3;
g = (b + c) * (e - f);
std::cout << "g = " << std::endl;
std::cin.get();
std::cin.get();
return 0;
}
A poďme ešte ďalej. Na čo vôbec v tomto kóde používame premenné, keď ich nenačítavame s vstupu. Výsledok kombinácie matematických operácií môžeme predsa zapísať rovno na obrazovku, bez toho, aby sme hodnoty priraďovali do premenných. Odstránime tým aj deklarácie. Po konečnej úprave, bude kód vyzerať nasledovne:
#include <iostream>
int main()
{
std::cout << "res = " << (-1 + 4) * (2 - 3) << std::endl;
std::cin.get();
std::cin.get();
return 0;
}
Záverom by som teda znovu chcel zdôrazniť, aké sú programátorský štýl a technika dôležité. Vidíte, že z 18 riadkového kódu, ktorý sme získali odsadením pôvodného kódu, nám po niekoľkých úpravách zostal kód, ktorý má 8 riadkov. A tento kód, hoci je malý, je laicky povedané, pekný. To znamená, že sa jeho spustiteľný kód vykoná rýchlo, je prehľadný a ľahko udržiavateľný.