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