Diskuze: přeskočení v kódu
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Návěstí a goto jsou v c++ taky, nicméně je to stejně jako ve většině ostatních programovacích jazycích špatná praktika a neměla by se používat.
To jo.. Ale používej to opravdu jen tehdy, když přesně víš, co děláš a taky co to udělá na úrovni vygenerovaných instrukcí.. A opravdu neskákej z funkce do funkce, nepřeskoč konstruktor, ...
Je to opravdu velmi specifická záležitost... Viděl jsem to například použité, když máš 4 úrovně cyklu (což samo o sobě naznačuje špatný návrh) a potřebuješ vyskočit a ošetřit chybu (v čistém C ovšem, tu použij výjimky) a já osobně to použil, abych stihl odevzdat projekt.. Ale fakt opatrně - můžeš se tím fakt nepříjemně střelit do nohy a pak hodiny hledat chybu
Tak samozřejmě, mezi funkcema to používat nehodlám, to jsem ani neměl v
plánu, ani jsem netušil že to vůbec jde, ale uvnitř jedný funkce by to
někdy bylo ideální.
Ale trochu jsi mě zaskočil tím, že 4 urovně cyklu jsou špatný návrh,
platí to třeba i když v if () testuji více podmínek najednou a nejde
použít switch?
Ale trochu jsi mě zaskočil tím, že 4 urovně cyklu jsou špatný návrh, platí to třeba i když v if () testuji více podmínek najednou a nejde použít switch?
Řekl bych, že spíš bylo míněno, že v takovém případě (čtyři cykly, přílišné zanoření) je rozumné rozdělit kód do více funkcí.
Jinak v C se při následujícím programovacím stylu goto používá poměrně běžně, alespoň u ovladačů jádra Windows (např. v příkladech k SDK).
status = proved_funkci1(....);
if (status == chyba)
goto Exit;
...
status = proved_funkciN(...);
if (status == chyba)
goto Exit;
...
return status;
Exit:
// Tady zrusime efekty zpusobene uspesnym provedenim funkci proved_funkci1, ..., proved_funkciK
return status;
Přitom se předpokládá, že píšeš funkce tak, že tě nedostanou do nekonzistentního stavu. Tzn. když nějaká funkce v půlce svého provádění selže, tak vše vrátí do stavu před svým zavoláním a vrátí chybu.
Tenhle způsob kódování nemám moc rád (preferuju spíš zanořování), ale nevzniká žádné úroveň zanoření (nebo velmi malá) a třeba Windows Driver Framework (knihovna pro tvoru ovladačů na fyzický i virtuální HW) je pro tento styl hodně stavěná.
Na druhou stranu, v C++ se zrovna tomuto stylu dá dost dobře vyhnout tím, že se návrat do původního stavu provede v rámci destruktorů lokálních proměnných. Takže tam těch důvodů je o hodně méně.
Zobrazeno 6 zpráv z 6.