ceckovy kviz 2 (hardcore)
Miroslav Šinko
sinkomiro na gmail.com
Čtvrtek Září 7 02:07:14 CEST 2023
On 6.9.2023 18:33, Jan Waclawek wrote:
> Na druhej strane to goto je skutocne svinstvo
S tymto zas uplne nesuhlasim. Je to svinstvo, ked sa pouziva v
algoritmoch, to absolutne nepouzivam. Ale na osetrovanie podmienok a
skok vylucne na "upratovaci" koniec funkcie je vyhodne ho pouzit. To aj
robime a dokonca to doporucujeme novym kolegom. Vedie to k eliminacii
chyb (memory leakov) a jednoduchsiemu kodu. Pisem o cistom C, nie C++,
kde su moznosti ine.
Majme (s cim sa stretavame vo vacsine nasich kodov) funkciu na prijem
dat, ktora musi zistit stav spracovania, ak ok, zistit velkost prijatych
dat, ak ok, alokovat data buffer, ak ok, vycitat data do buffra, ak ok,
zavolat parsovaciu funkciu, ktora vytvori (alokuje) prehladavaciu
tabulku, ak ok, vyhladat record, ak ok, pripadne alokovat buffer na
response data k danemu recordu, ak ok, to iste s dalsim recordom, a s
dalsim, a s dalsim, atd...
Mozme urobit sekvenciu ifov a elsov, pekne poodsadzovanu az za pravy
okraj monitora. V kazdom jednom else uvolnit buffre, ktore boli dovtedy
alokovane, t.j. co dalsie else, to kopia predosleho kodu + riadok navyse.
Alebo mozme urobit sadu funkcii, do ktorych budeme predavat vzdy o jeden
parameter viac. Alebo mat jednu free funkciu, kde predame vsetky
pointery na buffre, ta bude volana X-krat a odsadzovanie az za okraj
monitora aj tak ostane.
No, alebo mozme pisat len ify na negativny vysledok, v nom jeden riadok
log(..prislusny error..) a druhy riadok goto _end;
A pred koncom funkcie mat navestie _end:, za ktorym je spolocny kod,
ktory sa vykona, aj ked vsetko zbehlo spravne, v zmysle:
if(data != NULL)
{
free(data);
}
if(searchTable != NULL)
{
free(searchTable);
}
if(recordX != NULL)
{
free(recordX);
}
atd..
Vsetky pointery na alokovane buffre su samozrejme na zaciatku
inicializovane na NULL. To je dalsi best practice, mat vsetky premenne
inicializovane.
miro
Další informace o konferenci Hw-list