ceckovy kviz 2 (hardcore)
Petr Labaj
labaj na volny.cz
Čtvrtek Září 7 02:36:44 CEST 2023
Souhlas.
Nějaká skákání doprostřed bloků před else (jak tady bylo zmiňováno)
jistě není to pravé.
Ale při ošetření různých speciálních stavů často dokáže goto výrazně
zpřehlednit a zjednodušit kód.
Nějaké to nadávání na C často vychází z nepravdivé premisy, že protože
jazyk umožňuje i krkolomné konstrukce, tak je programátor musí používat.
Ale to není pravda. Že jazyk něco umožňuje přece neznamená, že to
využívat musím.
Čitelnost a štábní kultura závisí v neprosté většině na programátorovi,
ne na jazyku.
(samozřejmě v výjimkou toho, když jazyk vyžaduje takovou kravinu, jako
je psaní textových oddělovačů bloků begin a end ;-) )
PL
*******************
Dne 7.9.2023 v 2:07 Miroslav Šinko napsal(a):
> 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