Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Jeded Vojka 12. 07. 2018, 09:56:42

Název: Jak můžu opustit funkci
Přispěvatel: Jeded Vojka 12. 07. 2018, 09:56:42
Mám funkci:

void Kresli ()
{
 .. nějaký ten kód
if (nějaká podmínka)
vyfuň z funkce ..

}

na místo "vyfuň z funkce" jsem zkoušel dát break; ale překladači se to nelíbilo, jako že "illegal break".
Tak jsem dal return;, ten se provedl, ale vytuhnul mi celý program.
Jak mohu opustit tu funkci Kresli, aby program pokračoval za místem, odkud byla Kresli zavolána?
Název: Re:Jak můžu opustit funkci
Přispěvatel: Jenda 12. 07. 2018, 10:02:52
Ano, return. A to vytuhnutí musíš nějak vyřešit, tipuju, že jsi před tím alokoval nějaké prostředky, zamkl nějaký zámek atd. a proto ti to vytuhne. Ty prostředky musíš samozřejmě zase uvolnit.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 12. 07. 2018, 10:45:27
Navrhoval by som spravne pouzit strukturovane programovanie a vyhnut sa returnom a breakom uprostred procedury.
Název: Re:Jak můžu opustit funkci
Přispěvatel: daemon 12. 07. 2018, 10:46:41
A víš, kde to vytuhne? Třeba to není v okamžiku návratu z Kresli(), ale někde pozděj. Přidej si tam nějaký pomocný printf() nebo puts(), do Kresli() před return, potom až za volání Kresli(). Nebo to odkrokuj v debuggeru. Za tím ifem je ještě nějaký další kód? Takto, jak jsi to napsal, Kresli() skončí vždy, bez ohledu na výsledek toho ifu. Ani bys tam ten return nemusel psát.

void Kresli()
{
 puts("zacatek funkce Kresli()\n");
  nějaký kód
  if (podmínka)
  {
    puts("konec funkce Kresli() - podminka splnena\n");
    return;
  }
  nějaký další kód
  puts("konec funkce Kresli()\n");
}

/* ------ */

/* odtud Kresli() volame */
 puts("ted zavolam Kresli()\n");
 Kresli();
 puts("ted jsem zpet z Kresli()\n");


Pokud to bude psát:

ted zavolam Kresli()
zacatek funkce Kresli()
konec funkce Kresli() - podminka splnena
ted jsem zpet z Kresli()

return funguje správně a příčinu problému musíš hledat jinde.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Jeded Vojka 12. 07. 2018, 11:04:46
Jo, jasně - dík všem. Jenda měl pravdu, já měl v "Kresli" zámek, aby mi proběhla vždycky úplně celá a nenarušil mi jí třeba časovač windows, i když si nejsem jist, jestli je vůbec něco takového možné. No a pak jsem tam přidal kód s tím, že část "Kresli" by pod podmínkou chvíli běhala v takové jako smyčce. Ale musí si při tom "odskočit" pro zprávy windows, čtení klávesnice a tak, takže fakt musí úplně ven. Takže "Kresli" skutečně "vyfuněla" nebo spíš ten - jak vono se to- ten ukazatel do programu nebo tak, a nechal "Kresli" zamknutou a když se chtěl vrátit, tak strašně vytuhl, aniž by se k tomu mohl jakkoliv vyjádřit  :D
No, jinak ano -"Kresli" pokračovala ještě za podmínkou, takže to ona by neskončila a provedl by se další kód. Tenhle return je tam fakt výjimečně, taky to nemám moc rád, vlastně jsem to použil poprvé.
Název: Re:Jak můžu opustit funkci
Přispěvatel: borekz 12. 07. 2018, 13:15:21
Jestli pod časovačem myslíš SetTimer a jestli metodu Kresli voláš z události WM_PAINT, tak by ti ji časovač přerušit neměl, protože jen pošle událost WM_TIMER do stejné fronty, ze které předtím tvůj program nebo framework vytáhnul WM_PAINT. Pokud se chceš profesionálně zabývat aplikacemi pro Windows 7 a starší, doporučuji začít v C nebo C++ a v čistém Win32 bez frameworků, aby jsi měl představu, jak to funguje.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Jeded Vojka 12. 07. 2018, 13:20:44
borekz:
já jí volám z case WM_TIMER:
a časovač mám 100.
   case WM_CREATE:
      SetTimer(hWnd, 1, 100, NULL);
      break;
Název: Re:Jak můžu opustit funkci
Přispěvatel: Honza 12. 07. 2018, 16:36:28
Navrhoval by som spravne pouzit strukturovane programovanie a vyhnut sa returnom a breakom uprostred procedury.

Ty vado.... Ten člověk má evidentně problémy se základy C a ideolog mu tady radí jak psát krásný kód.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 12. 07. 2018, 16:54:33
Navrhoval by som spravne pouzit strukturovane programovanie a vyhnut sa returnom a breakom uprostred procedury.
Mohl byste uvést konkrétní příklad, kdy může být v C break na konci procedury (a má tam nějaký smysl)?
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kiwi 12. 07. 2018, 17:07:02
Navrhoval by som spravne pouzit strukturovane programovanie a vyhnut sa returnom a breakom uprostred procedury.
Mohl byste uvést konkrétní příklad, kdy může být v C break na konci procedury (a má tam nějaký smysl)?
Chtěl tím říci, že puristi místo

if (chyba)
    return;
/* zbytek kódu */

napíšou

if (!chyba) {
   /* zbytek kódu */
}
Název: Re:Jak můžu opustit funkci
Přispěvatel: Jenda 12. 07. 2018, 17:18:46
...

Deadlock (a segfault) jsou podle mě dvě nejjednodušší věci, při kterých se začátečník může naučit s debuggerem - například v gdb stačí napsat "bt" a ihned vidíš, kde to skončilo.

(jinak teda hodilo by se příště říct, co to je za jazyk :)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 12. 07. 2018, 18:34:32
Chtěl tím říci, že puristi…
Ovšem je hloupé, když chce být někdo purista a puntičkář, a zamotá break mezi způsoby, jak v C ukončit funkci. Čtenář pak totiž může pochybovat, jestli dotyčný vůbec umí programovat…
Název: Re:Jak můžu opustit funkci
Přispěvatel: BoneFlute 12. 07. 2018, 18:51:04
Ovšem je hloupé, když chce být někdo purista a puntičkář, a zamotá break mezi způsoby, jak v C ukončit funkci. Čtenář pak totiž může pochybovat, jestli dotyčný vůbec umí programovat…
Normálního člověka to nenapadne. Normální člověk chápe, že chtěl předat myšlenku. Normální člověk neprudí... oh wait!
Název: Re:Jak můžu opustit funkci
Přispěvatel: TomBA 12. 07. 2018, 22:16:24
"Jak můžu opustit funkci?"
Bureš, si to ty?
Optimálne by bolo "v želiezkach"...
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 12. 07. 2018, 22:35:44
Normálního člověka to nenapadne. Normální člověk chápe, že chtěl předat myšlenku. Normální člověk neprudí... oh wait!
Jistěže mi připadalo pravděpodobné, že balki prostě jen prudí. Ale předpokládám u lidí vždy tu lepší variantu, proto jsem se zeptal – co kdyby tam opravdu nějaká myšlenka byla a já jsem jí přehlédl?
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 12. 07. 2018, 22:38:03
Chtěl tím říci, že puristi…
Ovšem je hloupé, když chce být někdo purista a puntičkář, a zamotá break mezi způsoby, jak v C ukončit funkci. Čtenář pak totiž může pochybovat, jestli dotyčný vůbec umí programovat…

Boha jeho, clovek vam toho Buresa aj dopraje, clovek aspon vie, ze ste si ho nezvolili omylom.
Název: Re:Jak můžu opustit funkci
Přispěvatel: LambdaBender 12. 07. 2018, 23:05:53
Normálního člověka to nenapadne. Normální člověk chápe, že chtěl předat myšlenku. Normální člověk neprudí... oh wait!
Jistěže mi připadalo pravděpodobné, že balki prostě jen prudí. Ale předpokládám u lidí vždy tu lepší variantu, proto jsem se zeptal – co kdyby tam opravdu nějaká myšlenka byla a já jsem jí přehlédl?
Balki a myšlenka?  ;D
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 12. 07. 2018, 23:11:53
Normálního člověka to nenapadne. Normální člověk chápe, že chtěl předat myšlenku. Normální člověk neprudí... oh wait!
Jistěže mi připadalo pravděpodobné, že balki prostě jen prudí. Ale předpokládám u lidí vždy tu lepší variantu, proto jsem se zeptal – co kdyby tam opravdu nějaká myšlenka byla a já jsem jí přehlédl?
Balki a myšlenka?  ;D

Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze. Procedura by mala mat podla moznosti len jeden return.  To ze tu mate vystudovane hnojariny a potrebujete si honit ego a slovickarit, na tomto fakte nic nezmeni.
Název: Re:Jak můžu opustit funkci
Přispěvatel: LambdaBender 12. 07. 2018, 23:38:13
Normálního člověka to nenapadne. Normální člověk chápe, že chtěl předat myšlenku. Normální člověk neprudí... oh wait!
Jistěže mi připadalo pravděpodobné, že balki prostě jen prudí. Ale předpokládám u lidí vždy tu lepší variantu, proto jsem se zeptal – co kdyby tam opravdu nějaká myšlenka byla a já jsem jí přehlédl?
Balki a myšlenka?  ;D
Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze. Procedura by mala mat podla moznosti len jeden return.  To ze tu mate vystudovane hnojariny a potrebujete si honit ego a slovickarit, na tomto fakte nic nezmeni.
To tě naučili na VOŠ salašnické?  ;)
Název: Re:Jak můžu opustit funkci
Přispěvatel: jouda 12. 07. 2018, 23:51:42
Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze. Procedura by mala mat podla moznosti len jeden return.  To ze tu mate vystudovane hnojariny a potrebujete si honit ego a slovickarit, na tomto fakte nic nezmeni.
Věci jako break, continue, a v nejhorším i to goto by se měly používat tam, kde to dává smysl co do přehlednosti v rámci daného jazyka a dané úlohy.

A diskuse o dobru, zlu, milionu vnořených ifů případně try/catch a jednoho goto a krajní nouzi nepatří jinam než na teologii, již od doby pánů Churche a Turinga, kteří nám nemoudrým zjevili, že všechno jedno jest fakticky ekvivalentní.

P.S. Chudák zjevnej začátečník, kterej je až tak nezkušenej, že ho vůbec napadne se tu na cokoli zeptat.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 00:04:12
Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze. Procedura by mala mat podla moznosti len jeden return.  To ze tu mate vystudovane hnojariny a potrebujete si honit ego a slovickarit, na tomto fakte nic nezmeni.
Věci jako break, continue, a v nejhorším i to goto by se měly používat tam, kde to dává smysl co do přehlednosti v rámci daného jazyka a dané úlohy.

A diskuse o dobru, zlu, milionu vnořených ifů případně try/catch a jednoho goto a krajní nouzi nepatří jinam než na teologii, již od doby pánů Churche a Turinga, kteří nám nemoudrým zjevili, že všechno jedno jest fakticky ekvivalentní.

P.S. Chudák zjevnej začátečník, kterej je až tak nezkušenej, že ho vůbec napadne se tu na cokoli zeptat.

Ja neviem, len som to normalne napisal, ako dobre mienenu radu. Nemalo to byt, ziadne trollenie. Ale asi sa v tom nasli, tak ich to nejak popudilo.

Uz som videl v zivote tolko kurvenia strukturalneho programovania pomocou vyssie uvedenych statementov, ze som povazoval svoj prispevok za dobry napad. Ono je potom bolest taky kod upravovat.  Aj vnorene if-y sa daju vyriesit, vsetko sa da.  Holt, root, tu je vsetko urazka. Clovek si predstavi plesateho spoteneho jirsaka s ponozkami v sandaloch, ako vybojoval dalsiu zivotnu bitku. Normalne mi je ho luto teraz, ze mu to kazim. Tak teda, vyhrali ste, no ste chlapaci, gratulujem, ja som nula. *Palec hore*
Název: Re:Jak můžu opustit funkci
Přispěvatel: Trollopata 13. 07. 2018, 00:23:37
Když to v nějakém specifickém případě pomůže k lepší čitelnosti kódu, proč nemít víc returnů? IDE mi je stejně označí, když budu potřebovat. Totéž break, continue... Když jsou nějaké konstrukce ekvivalentní, volím zpravidla tu s nejlepší čitelností, protože nejsem sobec a myslím na ostatní, co ten kód budou po mně v budoucnu luštit.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 13. 07. 2018, 07:31:31
Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze. Procedura by mala mat podla moznosti len jeden return.  To ze tu mate vystudovane hnojariny a potrebujete si honit ego a slovickarit, na tomto fakte nic nezmeni.
Ty vaše rady jsou dobré akorát v případě, kdy chcete psát špatný a nečitelný kód. Protože papouškujete rady, o nichž jste možná někde něco zaslechl, ale úplně jste je nepochopil.

V případě toho returnu ta rada ve skutečnosti zní, že procedura by měla mít jednu hlavní linku, ve které se řeší její výkonný kód, a tato hlavní linka by měla být přímo v těle té procedury. Tím, že je jedna, bude mít tedy i jeden return. Je to opatření právě proti tomu, aby v proceduře bylo několik vnořených velkých ifů, z nichž každý bude dělat něco jiného a bude mít svůj vlastní konec – taková procedura dělá mnoho věcí a je lepší jí rozdělit.

K tomu, aby bylo možné kód takhle napsat, se často používá technika, kdy na začátku procedury vyhodnotíte vstupní parametry, a teprve když je vše v pořádku, následuje vlastní výkonný kód. Když parametry v pořádku nejsou, opustíte proceduru hned – buď pomocí returnu, nebo v jiných jazycích také pomocí výjimek. Ostatně pravidlo „jediný výstupní bod procedury“ by jakýkoli smysl výjimek úplně pohřbilo.

Takže to vaše zkomolené pravidlo o jediném returnu je ve skutečnosti pravým opakem toho skutečného pravidla, které se programátorům doporučuje.

Upozornění na to, že házíte break, continue a goto do jednoho pytle a pletete si return a break, není slovíčkaření, ale upozornění na to, že tomu moc nerozumíte, takže ať se začátečníci od vašich rad raději drží dál. (Mírně pokročilí to upozornění nepotřebují, protože ti už to poznají sami.)
Název: Re:Jak můžu opustit funkci
Přispěvatel: daemon 13. 07. 2018, 08:26:46
Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze.

Tam ten původní kód byl v C, předpokládám tedy, že se stále bavíme o C.
Vysvětlíš mi, jak bez použití break mám v C správně používat switch, case?
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 08:52:14
Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze.

Tam ten původní kód byl v C, předpokládám tedy, že se stále bavíme o C.
Vysvětlíš mi, jak bez použití break mám v C správně používat switch, case?

Lebo zrovna ten pripad som mal na mysli...  Jeden je domyslavy, druhy nedomyslavy.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 08:54:07
Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze. Procedura by mala mat podla moznosti len jeden return.  To ze tu mate vystudovane hnojariny a potrebujete si honit ego a slovickarit, na tomto fakte nic nezmeni.
Ty vaše rady jsou dobré akorát v případě, kdy chcete psát špatný a nečitelný kód. Protože papouškujete rady, o nichž jste možná někde něco zaslechl, ale úplně jste je nepochopil.

V případě toho returnu ta rada ve skutečnosti zní, že procedura by měla mít jednu hlavní linku, ve které se řeší její výkonný kód, a tato hlavní linka by měla být přímo v těle té procedury. Tím, že je jedna, bude mít tedy i jeden return. Je to opatření právě proti tomu, aby v proceduře bylo několik vnořených velkých ifů, z nichž každý bude dělat něco jiného a bude mít svůj vlastní konec – taková procedura dělá mnoho věcí a je lepší jí rozdělit.

K tomu, aby bylo možné kód takhle napsat, se často používá technika, kdy na začátku procedury vyhodnotíte vstupní parametry, a teprve když je vše v pořádku, následuje vlastní výkonný kód. Když parametry v pořádku nejsou, opustíte proceduru hned – buď pomocí returnu, nebo v jiných jazycích také pomocí výjimek. Ostatně pravidlo „jediný výstupní bod procedury“ by jakýkoli smysl výjimek úplně pohřbilo.

Takže to vaše zkomolené pravidlo o jediném returnu je ve skutečnosti pravým opakem toho skutečného pravidla, které se programátorům doporučuje.

Upozornění na to, že házíte break, continue a goto do jednoho pytle a pletete si return a break, není slovíčkaření, ale upozornění na to, že tomu moc nerozumíte, takže ať se začátečníci od vašich rad raději drží dál. (Mírně pokročilí to upozornění nepotřebují, protože ti už to poznají sami.)

Takze dobre som pochopil, ze mate butthurt a velke ego. Normalne vidim tu vasu navretu zilku na cele.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 09:03:22
A vynimky nie su strukturovane programovanie, to je len goto na iny sposob, to je vam hadam jasne.  Tie je vhodne vcas odchytit (tie predvidatelne) a riadenie programu robit pomocou chybovych hodnot.
Název: Re:Jak můžu opustit funkci
Přispěvatel: armabeton 13. 07. 2018, 09:12:37
`return` je ridici prikaz pro opusteni funkce (popr. vraceni hodnoty) a tak by se mel pouzivat. Davate tim jasne najevo, co se deje. Kdyz tam namisto toho bude cely zbytek tela funkce v if (opacna podminka) {}, tak jenom matete ctenare kodu, ktery ocekava, co se vlastne bude dit na konci toho bloku if - ma proste o jednu polozku v kontextu navic, i kdyz jasne vyjadrena myslenka if (nema_smysl_pokracovat) return; je cista a "kristalove jasna".
Název: Re:Jak můžu opustit funkci
Přispěvatel: . 13. 07. 2018, 09:25:11
Navrhoval by som spravne pouzit strukturovane programovanie a vyhnut sa returnom a breakom uprostred procedury.
Mohl byste uvést konkrétní příklad, kdy může být v C break na konci procedury (a má tam nějaký smysl)?
Chtěl tím říci, že puristi místo

if (chyba)
    return;
/* zbytek kódu */

napíšou

if (!chyba) {
   /* zbytek kódu */
}

Ta upravená varianta zvyšuje cyklomatickou složitost zbytku kódu, takže v současnosti je to považováno za antipattern. Netuším, co je na tom puristického.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 09:32:31
`return` je ridici prikaz pro opusteni funkce (popr. vraceni hodnoty) a tak by se mel pouzivat. Davate tim jasne najevo, co se deje. Kdyz tam namisto toho bude cely zbytek tela funkce v if (opacna podminka) {}, tak jenom matete ctenare kodu, ktery ocekava, co se vlastne bude dit na konci toho bloku if - ma proste o jednu polozku v kontextu navic, i kdyz jasne vyjadrena myslenka if (nema_smysl_pokracovat) return; je cista a "kristalove jasna".

Dam takyto priklad zo zivota. Podo mnou robila jedna koderka juniorka uctovnictvo, bol som analytik.  Ja som jej zadal priznaky, podla ktorych sa mali generovat ucty z uctovnej osnovy.  Riadila to tiez takto returnami. Trochu upravila kod, jeden return sa nevykonal a suma skoncila na uplne inom ucte.  Ked si clovek nepomaha barlickami pre rozne synonyma goto, nuti ho to aj lepsie premyslat o kode - Tento if je dlhy? spravim procedury. If-y su zanorene? Premyslim, ako ich spravit flat. Je tam vela riadenia, ktore zavisi od typu dat? - upravim to inak v ramci moznosti jazyka.

(To ze jirsak robi design by contract cez returny a vynimky, to je ina vec. Su na to elegantnejsie nastroje, ale ak mu to zamestnavatel dovoli, tak preco nie ?)

Som zbytocne mravoucny, v skutocnosti je mi jedno, kto ako programuje, ked to nemusim po nom citat.
Název: Re:Jak můžu opustit funkci
Přispěvatel: daemon 13. 07. 2018, 09:34:45
Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze.

Tam ten původní kód byl v C, předpokládám tedy, že se stále bavíme o C.
Vysvětlíš mi, jak bez použití break mám v C správně používat switch, case?

Lebo zrovna ten pripad som mal na mysli...  Jeden je domyslavy, druhy nedomyslavy.

Ok, zeptám se tedy jinak. Psal jsi totiž o "stavu nejhorší nouze".
Zanamená to tedy, že bych se v C měl "nejhorší nouzi" switch, case, break vyhnout a nepoužívat? Já jsem do teď měl pocit, že konstrukce switch, case, break je standardní nástroj, nikoli "nejhorší nouze". A break samostatně, bez switch, case, snad ani použít nelze. Resp. možná ano, nevím to, ale asi by mě nikdy nenapadlo, takovou věc udělat.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 13. 07. 2018, 09:39:22
A vynimky nie su strukturovane programovanie, to je len goto na iny sposob, to je vam hadam jasne.
Výjimky, return, cykly i podmínky jsou strukturované programování, a všude v tom jsou schované skoky. Bez skoků byste toho moc nenaprogramoval.

Váš problém je, že pořád prezentujete nějaké poučky, ale máte je naučené jen jako věty, nerozumíte jejich obsahu. A naučené je nemáte zas tak dobře, takže je komolíte.

Problém goto není v tom, že je to skok, ale že je to nepředvídatelný skok, může skočit odkudkoli kamkoli. Proto se ve strukturovaném programování skoky omezily jen na přesně definované případy. if podle splnění podmínky buď provede podmíněný blok a nebo skočí přesně za jeho konec (a nikam jinam skočit neumí), cykly jsou podobné, break skočí přesně za konec bloku a nikam jinam, continue skočí na začátek bloku cyklu, return  skočí hned za místo, odkud byla daná subrutina vyvolána.

Tie je vhodne vcas odchytit (tie predvidatelne) a riadenie programu robit pomocou chybovych hodnot.
Ne, řízení programu pomocí chybových hodnot není dobrý způsob. Znepřehledňuje to program a vede to k chybám, když se smíchá správný běh programu s ošetřením chyb. Zrovna nedávno se tu řešil případ se zápisem do souboru v PHP, kde celý problém spočíval v tom, že nebylo jasné, které návratové hodnoty jsou úspěch a které značí chybu.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 13. 07. 2018, 09:44:34
Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze. Procedura by mala mat podla moznosti len jeden return.  To ze tu mate vystudovane hnojariny a potrebujete si honit ego a slovickarit, na tomto fakte nic nezmeni.

Citace
Nesouhlasím s tím, co říkáte, ale budu do smrti bránit vaše právo to říkat.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 13. 07. 2018, 09:49:48
Dam takyto priklad zo zivota. Podo mnou robila jedna koderka juniorka uctovnictvo, bol som analytik.  Ja som jej zadal priznaky, podla ktorych sa mali generovat ucty z uctovnej osnovy.  Riadila to tiez takto returnami.
Ano, to teoreticky může být špatně, protože tam může být víc způsobů, jak se ve správném případě prochází kódem. To jsem psal, že takové použití je špatné. Ale vy to chybně generalizujete.

Navíc podle toho vašeho popisu to špatně není, podle něj to vypadá, že v tom kódu prostě jenom byla chyba. Vy byste ho možná zanořil do milionu else, protože nevíte, že i to je skryté goto, ale tím byste ten program akorát znepřehlednil.

Ked si clovek nepomaha barlickami pre rozne synonyma goto
Kdybyste věděl, co všechno jsou „synonyma pro goto“, takovýhle nesmysl byste nenapsal. Bez podmínek byste toho opravdu moc nenaprogramoval.
Název: Re:Jak můžu opustit funkci
Přispěvatel: armabeton 13. 07. 2018, 09:56:29
`return` je ridici prikaz pro opusteni funkce (popr. vraceni hodnoty) a tak by se mel pouzivat. Davate tim jasne najevo, co se deje. Kdyz tam namisto toho bude cely zbytek tela funkce v if (opacna podminka) {}, tak jenom matete ctenare kodu, ktery ocekava, co se vlastne bude dit na konci toho bloku if - ma proste o jednu polozku v kontextu navic, i kdyz jasne vyjadrena myslenka if (nema_smysl_pokracovat) return; je cista a "kristalove jasna".

Dam takyto priklad zo zivota. Podo mnou robila jedna koderka juniorka uctovnictvo, bol som analytik.  Ja som jej zadal priznaky, podla ktorych sa mali generovat ucty z uctovnej osnovy.  Riadila to tiez takto returnami. Trochu upravila kod, jeden return sa nevykonal a suma skoncila na uplne inom ucte.

tedy netusim moc jak to souvisi, ale tyto malickosti odchytily testy ze?
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 13. 07. 2018, 09:57:16
A vynimky nie su strukturovane programovanie, to je len goto na iny sposob, to je vam hadam jasne.  Tie je vhodne vcas odchytit (tie predvidatelne) a riadenie programu robit pomocou chybovych hodnot.

Výjimky naopak zachycuji tak pozdě, jak jen to jde. Jejich nespornou výhodou je, že v sobě nesou všechny informace, které potřebuji k jejich zpracování. Používat něco takového ke generování chybových hodnot je podle mne hloupost, neboť se tím velké množství předávaných informací ztratí. Řízení programu podle výjimek nebo stavových kódů je uznávaným antipatternem.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 13. 07. 2018, 10:03:32
A vynimky nie su strukturovane programovanie, to je len goto na iny sposob, to je vam hadam jasne.  Tie je vhodne vcas odchytit (tie predvidatelne) a riadenie programu robit pomocou chybovych hodnot.

Ještě bych doplnil, že výjimka není jen goto na jiný způsob, ale především je to objekt, který nese všechny potřebné informace. Do stavového kódu se název, text a místo vzniku výjimky prostě nevejde.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 10:04:00
A vynimky nie su strukturovane programovanie, to je len goto na iny sposob, to je vam hadam jasne.

Váš problém je, že pořád prezentujete nějaké poučky, ale máte je naučené jen jako věty, nerozumíte jejich obsahu. A naučené je nemáte zas tak dobře, takže je komolíte.

Skor je to problem, ze pisem aplikacie v ktorych klienti uprednostnuju robustnost pred korektnostou a musia sa spamatat za kazdej situacie.  Su to viacvlaknove lopatovace dat pre komercnu sferu, ziadne 3d videohry (tam su poziadavky ine). Na vstupe lopatovaca byva bud embedded zariadenie s exotickym protokolom, alebo nejaky iny system, co pusta dnu aj pokazene data.  Ak by som povedal "fuck off, tieto data nespracujem, hodim vynimku", tak by ma nadriadeni hnali.  Ak by som sa snazil implementovat robustne s vynimkami a roznym predcasnym opustenim kodu, tak by som nic ine nerobil len prehadzoval hore-dole returny+vynimky a dufal, ze sa to zachova dobre. Ak domrdam system, ktory ma bezat 24/7 365 dni v roku, potom su stresy, cely support je na nohach a ja mam infarktove stavy, klient ma infarktove stavy.  Nastastie sa mi to stalo zatial len raz za  10 rokov. (aj vdaka testingu a mojmu predposratemu stylu kodenia).

Tie moje poucky, ktore opakujem a nerozumiem si vytlacte na papier, zrolujte a strcte si ich viete kam. To nie su ziadne poucky.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 10:11:16
`return` je ridici prikaz pro opusteni funkce (popr. vraceni hodnoty) a tak by se mel pouzivat. Davate tim jasne najevo, co se deje. Kdyz tam namisto toho bude cely zbytek tela funkce v if (opacna podminka) {}, tak jenom matete ctenare kodu, ktery ocekava, co se vlastne bude dit na konci toho bloku if - ma proste o jednu polozku v kontextu navic, i kdyz jasne vyjadrena myslenka if (nema_smysl_pokracovat) return; je cista a "kristalove jasna".

Dam takyto priklad zo zivota. Podo mnou robila jedna koderka juniorka uctovnictvo, bol som analytik.  Ja som jej zadal priznaky, podla ktorych sa mali generovat ucty z uctovnej osnovy.  Riadila to tiez takto returnami. Trochu upravila kod, jeden return sa nevykonal a suma skoncila na uplne inom ucte.

tedy netusim moc jak to souvisi, ale tyto malickosti odchytily testy ze?

Ano
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 13. 07. 2018, 10:12:54
(...)
A break samostatně, bez switch, case, snad ani použít nelze. Resp. možná ano, nevím to, ale asi by mě nikdy nenapadlo, takovou věc udělat.

Ještě for, while..., kde je také velice užitečný. :)
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 10:18:02
Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze.

Tam ten původní kód byl v C, předpokládám tedy, že se stále bavíme o C.
Vysvětlíš mi, jak bez použití break mám v C správně používat switch, case?

Lebo zrovna ten pripad som mal na mysli...  Jeden je domyslavy, druhy nedomyslavy.

Ok, zeptám se tedy jinak. Psal jsi totiž o "stavu nejhorší nouze".
Zanamená to tedy, že bych se v C měl "nejhorší nouzi" switch, case, break vyhnout a nepoužívat? Já jsem do teď měl pocit, že konstrukce switch, case, break je standardní nástroj, nikoli "nejhorší nouze". A break samostatně, bez switch, case, snad ani použít nelze. Resp. možná ano, nevím to, ale asi by mě nikdy nenapadlo, takovou věc udělat.

Pytate sa riadne hlupo, ak to mozem tak povedat. Asi je vam jasne, ze davat break za case je standardna konstrukcia v niektorych jazykoch. Ak nie ste totalne hlupy (co nepredpokladam), je vam asi jasne, ze switch som zrovna nemal na mysli. Ani tento jirsakovsky flame o tom nie je.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 13. 07. 2018, 10:30:49
Pytate sa riadne hlupo, ak to mozem tak povedat.
Bylo potřeba se zeptat na vaší úrovni.

Asi je vam jasne, ze davat break za case je standardna konstrukcia v niektorych jazykoch. Ak nie ste totalne hlupy (co nepredpokladam), je vam asi jasne, ze switch som zrovna nemal na mysli. Ani tento jirsakovsky flame o tom nie je.
Nemáte pravdu. break za case je úplně ta samá konstrukce, jako break v cyklu (for, while, do/while). Může tam být a nemusí a mění se tím význam programu. Není to žádná standardní konstrukce v tom smyslu, že by to bylo nutné pro překlad programu, jako třeba dvojice begin…end v Pascalu.

Že jste switch neměl na mysli jsem předpokládal, ale jenom to svědčí o tom, že ta vaše pravidla pramení z neznalosti. Protože, znovu opakuju, break ve switchi a v cyklu má úplně ten samý význam – skočí těsně za konec aktuálního bloku kódu. Ve vašem jazyce – „je to synonymum goto“.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 10:36:40
Pytate sa riadne hlupo, ak to mozem tak povedat.
Bylo potřeba se zeptat na vaší úrovni.

Asi je vam jasne, ze davat break za case je standardna konstrukcia v niektorych jazykoch. Ak nie ste totalne hlupy (co nepredpokladam), je vam asi jasne, ze switch som zrovna nemal na mysli. Ani tento jirsakovsky flame o tom nie je.
Nemáte pravdu. break za case je úplně ta samá konstrukce, jako break v cyklu (for, while, do/while). Může tam být a nemusí a mění se tím význam programu. Není to žádná standardní konstrukce v tom smyslu, že by to bylo nutné pro překlad programu, jako třeba dvojice begin…end v Pascalu.

Že jste switch neměl na mysli jsem předpokládal, ale jenom to svědčí o tom, že ta vaše pravidla pramení z neznalosti. Protože, znovu opakuju, break ve switchi a v cyklu má úplně ten samý význam – skočí těsně za konec aktuálního bloku kódu. Ve vašem jazyce – „je to synonymum goto“.

Switch je if na steroidoch. Ak to niekto pouziva ako goto, tak je to antipattern. Naduzivanie switch je zapach v kode, ale o tom som nechcel. Zaujimave, ze ste si zasa precitali, len to co sa hodilo vasemu egu. Skuste prosim prestat pisat na chvilu, bude to tak lepsie.
Název: Re:Jak můžu opustit funkci
Přispěvatel: František Ryšánek 13. 07. 2018, 10:40:05
Zahlédl jsem správně:

...
vezmu zámek
if (něco) tak return;  // a za chvíli se na stejné místo možná vrátím
else ...
atd.

Dvě věci:

1) v tom případě bych tam viděl místo returnu spíš volání funkce.
   A hluboko v té funkci může být schováno třeba schedule() nebo tak něco,
   tzn. procedura která předá řízení operačnímu systému, dokud nenastane
   nějaká podmínka (prostě se to zablokuje, usne, říkejte tomu jak chcete).
   A nakonec se po probuzení vrátí na stejné místo!

2) v tom případě je ale obecně blbost, držet při tom "usnutí" zámek.
   Ledaže víte přesně co děláte :-)
   Vzít zámek a usnout, to znamená, že jste zablokoval někoho dalšího,
   dokude se neprobudíte.

Není zámek jako zámek.
Zkuste se mrknout třeba na fungování POSIXových "podmínkových proměnných" a semaforů (https://www.linux.cz/noviny/1998-0809/clanek11.html).
Ano pod Windows je to jinak.
S použitím základních "synchronizačních primitiv" operačního systému lze budovat
své vlastní, složitější, zamykací konstrukce vyšší úrovně, které budou vyhovovat Vašim potřebám.
Třeba já jsem s oblibou kombinoval podmínkovou proměnnou (vyžaduje mutex) s frontou nějakých požadavků - problém s jedním konzumentem a více producenty.
Název: Re:Jak můžu opustit funkci
Přispěvatel: armabeton 13. 07. 2018, 11:05:17
`return` je ridici prikaz pro opusteni funkce (popr. vraceni hodnoty) a tak by se mel pouzivat. Davate tim jasne najevo, co se deje. Kdyz tam namisto toho bude cely zbytek tela funkce v if (opacna podminka) {}, tak jenom matete ctenare kodu, ktery ocekava, co se vlastne bude dit na konci toho bloku if - ma proste o jednu polozku v kontextu navic, i kdyz jasne vyjadrena myslenka if (nema_smysl_pokracovat) return; je cista a "kristalove jasna".

Dam takyto priklad zo zivota. Podo mnou robila jedna koderka juniorka uctovnictvo, bol som analytik.  Ja som jej zadal priznaky, podla ktorych sa mali generovat ucty z uctovnej osnovy.  Riadila to tiez takto returnami. Trochu upravila kod, jeden return sa nevykonal a suma skoncila na uplne inom ucte.

tedy netusim moc jak to souvisi, ale tyto malickosti odchytily testy ze?

Ano

takze neni problem ne?
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 11:13:48
takze neni problem ne?

Je, aj nie je, testy nepokryju vsetko. Proste moze sa stat, ze take dojde do produkcie. ;) 

A uz slubujem, ze v tomto topicu na nic nereagujem, nech si napise kto chce, co che. Nepotrebujem krmit trollov. (Nemyslim konkretne vas)
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 13. 07. 2018, 11:15:24
Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze. Procedura by mala mat podla moznosti len jeden return.  To ze tu mate vystudovane hnojariny a potrebujete si honit ego a slovickarit, na tomto fakte nic nezmeni.

Jasně, ale best practice je třeba i max. dvě úrovně zanoření a hlavně, čitelný kód. Pokud ho nedokážeš přečíst, nepochopíš ho. A když ho nepochopíš, tak v něm nevidíš chyby a problémy.

Tvoje řešení (C):

Kód: [Vybrat]
void funkce(int a, int b, int c) {
  if((a < A_MIN)|| (a > A_MAX)||(b < B_MIN)|| (b > B_MAX)||(c < C_MIN)|| (c > C_MAX)) {
    ... // cast funkcionality
    if(!chyba1) {
      ... // cast funkcionality
      if(!chyba2) {
        ... // cast funkcionality
      }
    }
  }
}

Čitelný a pochopitelný řešení:

Kód: [Vybrat]
#define check(podminka) if(!(podminka)) return
#define check_range(val, min, max) check((val >= min) && (val <= max))

void funkce(int a, int b, int c) {
  check_range(A, A_MIN, A_MAX);
  check_range(B, B_MIN, B_MAX);
  check_range(C, C_MIN, C_MAX);
  ... // cast funkcionality
  check(chyba1);
  ... // cast funkcionality
  check(chyba2);
   ... // cast funkcionality
}

A nakonec kód, který fanatik do strukturovanýho programování nemá šanci přežít:

Kód: [Vybrat]
void initStruct(struct mojestruct* data) {
  assert(data != NULL);
  ...
}

A co teprve __attribute__((noreturn)) v GCC...  Ta ti taky do plánu nezapadá, že?  ;D ;D ;D
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 13. 07. 2018, 11:41:22
Tvoje řešení (C):

Kód: [Vybrat]
void funkce(int a, int b, int c) {
  if((a < A_MIN)|| (a > A_MAX)||(b < B_MIN)|| (b > B_MAX)||(c < C_MIN)|| (c > C_MAX)) {
    ... // cast funkcionality
    if(!chyba1) {
      ... // cast funkcionality
      if(!chyba2) {
        ... // cast funkcionality
      }
    }
  }
}

Chybí tomu větve "else" s ošetřením chyb, které budou nejspíš úplně vespod, aby je nikdo nenašel.
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 13. 07. 2018, 12:11:25
Switch je if na steroidoch. Ak to niekto pouziva ako goto, tak je to antipattern. Naduzivanie switch je zapach v kode, ale o tom som nechcel. Zaujimave, ze ste si zasa precitali, len to co sa hodilo vasemu egu. Skuste prosim prestat pisat na chvilu, bude to tak lepsie.

Ne, to není ani náhodou, protože:
1) řetězec if-else nad enumem (třeba stavy ve stavovým automatu) nehlídá, že je některý stav neošetřený. Switch aspoň hodí warning, pokud vyhodíš DEFAULT (další synonymum pto GOTO).
2) Přepiš pomocí switche bez jakýhokoliv IFu následující kód (pokud je SWITCH rozšířením IFu, neměl by to být problém):
Kód: [Vybrat]
if(a == 5) {
  akce1();
} else if(b == 7) {
  akce2();
} else if((c > 0x07) && (c <= 0xf3) {
  akce3();
} else  {
  akce4();
}
3. Dovoluje pass through z jedné větve do druhé, to bez něj dáš jenom s GOTO nebo nepřehledným chaosem a opakovaným vyhodnocováním (= drahý, zahazuješ zbytečně pipeline).

Prostě IF != SWITCH a programátor ví, kdy co použít. Pokud to zaměňuješ, jsi fakt dřevo.
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 13. 07. 2018, 12:25:27
Chybí tomu větve "else" s ošetřením chyb, které budou nejspíš úplně vespod, aby je nikdo nenašel.

Nechybí. To může být na vyšší úrovni. Třeba zrovna včera jsem dělal ovladač HW, který běží ve vlastním vlákně a init vypadal (zjednodušeně) asi takhle:
Kód: [Vybrat]
error_t initDriver(struct params* params) {
  // Parametry jsou povinne
  if(!assigned(params)) return ERR_INVALID_PARAMS;

  // Potrebujeme frontu pro komunikaci
  queue = queueCreate(dataType, size);
  if(!assigned(queue)) {
     releaseMem();
     return ERR_OUT_OF_MEMORY;
  }
 
  // Potrebujeme mutex pro zamykani HW
  mutex = mutexCreate();
  if(!assigned(mutex)) {
     releaseMem();
     return ERR_OUT_OF_MEMORY;
  }

  // Init zeleza
  if(!hwInit()) return ERROR_HARDWARE;

  // Ted muzeme udelat vlakno pro obsluhu
  threadHandle = threadCreate(funkce, priorita, stack);
  if(!assigned(threadHandle)) {
     releaseMem();
     return ERR_OUT_OF_MEMORY;
  }

  // Init
  ...
  // Hotovo
  return ERROR_NONE;
}

Víš, jaký by to byl binec Balkiho stylem? A opravdu by nestačil jeden return, protože v tomhle se i jednoduše zaručí, že pokud není paměť, nebude se pokoušet tvořit další objekty...
Název: Re:Jak můžu opustit funkci
Přispěvatel: BoneFlute 13. 07. 2018, 12:38:33
Ne, to není ani náhodou, protože:
1) řetězec if-else nad enumem (třeba stavy ve stavovým automatu) nehlídá, že je některý stav neošetřený. Switch aspoň hodí warning, pokud vyhodíš DEFAULT (další synonymum pto GOTO).
To hódně záleží na jazyku. S goto to vůbec nesouvisí.

2) Přepiš pomocí switche bez jakýhokoliv IFu následující kód (pokud je SWITCH rozšířením IFu, neměl by to být problém):
Kód: [Vybrat]
if(a == 5) {
  akce1();
} else if(b == 7) {
  akce2();
} else if((c > 0x07) && (c <= 0xf3) {
  akce3();
} else  {
  akce4();
}
Kód: [Vybrat]
switch (True) {
  case (a == 5):
    akce1();
    break;
  case (b == 7):
    akce2();
    break;
  case ((c > 0x07) && (c <= 0xf3)):
    akce3();
    break;
  default:
    akce4();
}

3. Dovoluje pass through z jedné větve do druhé, to bez něj dáš jenom s GOTO nebo nepřehledným chaosem a opakovaným vyhodnocováním (= drahý, zahazuješ zbytečně pipeline).
Záleží na jazyku.
V mnoha případech to naopak zpřehledňuje.

Prostě IF != SWITCH a programátor ví, kdy co použít.
Tak to každopádně.

Pokud to zaměňuješ, jsi fakt dřevo.
Odpusť si ty invektivy.

Zásadní rozdíl mezi IF a SWITCH je v tom, že IF je binární, zatímco SWITCH je na enum. A vzhledem k tomu, že bool je taky enum, tak má balki do určité míry pravdu.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 13. 07. 2018, 12:39:10
Chybí tomu větve "else" s ošetřením chyb, které budou nejspíš úplně vespod, aby je nikdo nenašel.

Nechybí. To může být na vyšší úrovni. Třeba zrovna včera jsem dělal ovladač HW, který běží ve vlastním vlákně a init vypadal (zjednodušeně) asi takhle:
Kód: [Vybrat]
...

Takhle to dělám také a snad i každý rozumný programátor. Odkazoval jsem se na předchozí špagetový zdroják.
Název: Re:Jak můžu opustit funkci
Přispěvatel: x14 13. 07. 2018, 12:49:15
Chybí tomu větve "else" s ošetřením chyb, které budou nejspíš úplně vespod, aby je nikdo nenašel.

Nechybí. To může být na vyšší úrovni. Třeba zrovna včera jsem dělal ovladač HW, který běží ve vlastním vlákně a init vypadal (zjednodušeně) asi takhle:
Kód: [Vybrat]
error_t initDriver(struct params* params) {
  // Parametry jsou povinne
  if(!assigned(params)) return ERR_INVALID_PARAMS;

  // Potrebujeme frontu pro komunikaci
  queue = queueCreate(dataType, size);
  if(!assigned(queue)) {
     releaseMem();
     return ERR_OUT_OF_MEMORY;
  }
 
  // Potrebujeme mutex pro zamykani HW
  mutex = mutexCreate();
  if(!assigned(mutex)) {
     releaseMem();
     return ERR_OUT_OF_MEMORY;
  }

  // Init zeleza
  if(!hwInit()) return ERROR_HARDWARE;

  // Ted muzeme udelat vlakno pro obsluhu
  threadHandle = threadCreate(funkce, priorita, stack);
  if(!assigned(threadHandle)) {
     releaseMem();
     return ERR_OUT_OF_MEMORY;
  }

  // Init
  ...
  // Hotovo
  return ERROR_NONE;
}

Víš, jaký by to byl binec Balkiho stylem? A opravdu by nestačil jeden return, protože v tomhle se i jednoduše zaručí, že pokud není paměť, nebude se pokoušet tvořit další objekty...

Nechybí ti tam náhodou releaseMem() ve větvi if(!hwInit()) ?
BTW: Ten mutex, thread a queue není třeba uklízet?
Název: Re:Jak můžu opustit funkci
Přispěvatel: BoneFlute 13. 07. 2018, 12:54:27
Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze. Procedura by mala mat podla moznosti len jeden return.
Kód: [Vybrat]
def foo (xs):
    assertList(xs) # vyhodí výjimku
    if isEmpty(xs):
        return 0     # speciální hodnoty ukončíme předčasně
    val = fetchDefaultValueFromDB()
    for x in xs:
        val = val + x
    return val
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 13:02:01
Ja len tak, ze ci ten spagetovy festival s memory leakmi nechcete predvadzat v inom vlakne. Nereagujte na mna prosim.
Název: Re:Jak můžu opustit funkci
Přispěvatel: BoneFlute 13. 07. 2018, 13:04:51
Pro původního autora:

void Kresli ()
{
 .. nějaký ten kód
if (nějaká podmínka)
vyfuň z funkce ..

}

na místo "vyfuň z funkce" jsem zkoušel dát break; ale překladači se to nelíbilo, jako že "illegal break".
Tak jsem dal return;, ten se provedl, ale vytuhnul mi celý program.
Jak mohu opustit tu funkci Kresli, aby program pokračoval za místem, odkud byla Kresli zavolána?
Z funkce můžeš vyfunět pouze pomocí:
- kód doputuje až do konce (týká se jen procedur)
- pomocí return
- pomocí výjimky

Technicky ještě můžeš ukončit celej program pomocí exit, a možná by se našel i další způsob - ale to obecně neřeš a drž se  předchozího seznamu.

return a výjimka ti vyfuní z libovolně zanořeného výrazu. break, continue, etc je součástí struktur switch, while, for.
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 13. 07. 2018, 13:13:51
Nechybí ti tam náhodou releaseMem() ve větvi if(!hwInit()) ?

Koukám, že chybí, chyba při kopírování. Normálně je odeslání chyby zabaleno v makru, tady jsem to ručně rozepsal...

BTW: Ten mutex, thread a queue není třeba uklízet?

Jo, ten se uklidí. Při initu jsou handle NULL. Funkce releaseMem testuje ty pointery a pokud je některý pointer NULL, uvolní ho. Takže bez ohledu na místo chyby se paměť uvolní...
Název: Re:Jak můžu opustit funkci
Přispěvatel: kkk 13. 07. 2018, 13:30:48
Skratka, veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze. Procedura by mala mat podla moznosti len jeden return.  To ze tu mate vystudovane hnojariny a potrebujete si honit ego a slovickarit, na tomto fakte nic nezmeni.

Jasně, ale best practice je třeba i max. dvě úrovně zanoření a hlavně, čitelný kód. Pokud ho nedokážeš přečíst, nepochopíš ho. A když ho nepochopíš, tak v něm nevidíš chyby a problémy.

Tvoje řešení (C):

Kód: [Vybrat]
void funkce(int a, int b, int c) {
  if((a < A_MIN)|| (a > A_MAX)||(b < B_MIN)|| (b > B_MAX)||(c < C_MIN)|| (c > C_MAX)) {
    ... // cast funkcionality
    if(!chyba1) {
      ... // cast funkcionality
      if(!chyba2) {
        ... // cast funkcionality
      }
    }
  }
}

Čitelný a pochopitelný řešení:

Kód: [Vybrat]
#define check(podminka) if(!(podminka)) return
#define check_range(val, min, max) check((val >= min) && (val <= max))

void funkce(int a, int b, int c) {
  check_range(A, A_MIN, A_MAX);
  check_range(B, B_MIN, B_MAX);
  check_range(C, C_MIN, C_MAX);
  ... // cast funkcionality
  check(chyba1);
  ... // cast funkcionality
  check(chyba2);
   ... // cast funkcionality
}

A nakonec kód, který fanatik do strukturovanýho programování nemá šanci přežít:

Kód: [Vybrat]
void initStruct(struct mojestruct* data) {
  assert(data != NULL);
  ...
}

A co teprve __attribute__((noreturn)) v GCC...  Ta ti taky do plánu nezapadá, že?  ;D ;D ;D


#define check(podminka) if(!(podminka)) return

Tak ty jses dobry cune. Pouzivani maker je problematicke samo o sobe. Neda se to poradne debugovat. Atd. Takovehle makra mas v produkcnim kodu?
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 13. 07. 2018, 13:35:36
Ja len tak, ze ci ten spagetovy festival s memory leakmi nechcete predvadzat v inom vlakne. Nereagujte na mna prosim.

Nevadí nám, že sem píšeš příspěvky. Nemělo by ti vadit, že my sem také píšeme příspěvky.

Memory leaky se týkají zejména jazyka C, který se zde řeší.
Název: Re:Jak můžu opustit funkci
Přispěvatel: BoneFlute 13. 07. 2018, 13:43:40
Ja len tak, ze ci ten spagetovy festival s memory leakmi nechcete predvadzat v inom vlakne. Nereagujte na mna prosim.
Nevadí nám, že sem píšeš příspěvky. Nemělo by ti vadit, že my sem také píšeme příspěvky.
Ty tu určuješ pravidla komu může co vadit?
Název: Re:Jak můžu opustit funkci
Přispěvatel: x14 13. 07. 2018, 14:14:49
Já jsem tak rád, že nemusím dělat v C. V C++ dělám vše 100 % RAII a utéct z funkce můžu kdykoliv - uklízí destruktory.

V C jsem většinou dopadl tak, že jsem na začátku měl vynulované všechny proměnné a jednu stavovou proměnnou (často jen bool success=true) a kousek před koncem funkce label se jménem exitus, na který jsem skákal při předčasném ukončení. A za ním už byly jen samé delete, free, closehande, closefile...

Bylo to přehledné a bránilo to opomenutí v případě nečekaného selhání. Jiné goto než goto exitus jsem nikdy nepoužil a tento skok v naprosté většině případů znamenal chybu.
A zdroják pak byl čistě takto:
Kód: [Vybrat]
mem = alloc(...);
if(!mem)
{
     succes = false;
     goto exitus;
}
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 13. 07. 2018, 14:31:49
#define check(podminka) if(!(podminka)) return

Tak ty jses dobry cune. Pouzivani maker je problematicke samo o sobe. Neda se to poradne debugovat. Atd. Takovehle makra mas v produkcnim kodu?

Makra taky nepreferuju, ale mají několik výhod, který se prostě nedají ignorovat.
Třeba to, že kdybych tohle zapouzdřil jako funkci, tak se nemůžu vrátit z funkce o level výš.
Nebo je to nejjednodušší způsob, jak udělat polymorfní funkci - místo add(a, b) pro int a pod jiným jménem pro float je tam makro, kde nezáleží na typech.
Anebo prostě fakt, že ošetření návratu přes setjmp() na embedded věcech sežere dost RAMky a třeba ve FreeRTOSu havaruje celá aplikace...
Pak taky není špatný zabalit funkci, které předáváš pointer na buffer a velikost bufferu společně se sizeof(), to taky ušetří hodně práce. Prostě
Kód: [Vybrat]
uint8_t buffer_8b[];
uint16_t buffer_16b[];
uint32_t buffer_32b[];
intptr_t buffer_ptr[];

fillZero(buffer_8b);
fillZero(buffer_16b);
fillZero(buffer_32b[]);
fillZero(buffer_ptr[]);

kde je makro
Kód: [Vybrat]
#define fillZero(buff) _fillZero(buff, sizeof(buff) / sizeof(buff[1]))
je přehlednější, než tam ručně cpát vnitřek té definice, nebo jako velikost rvát magický konstanty apod.

Jedno ze základních pravidel je, že je lepší jednu věc mít na jednom místě v kódu, i za cenu makra nebo (inline) funkce.

A co se debugování maker týká, pokud je zřejmý, co makro dělá (= odladěný a schovaný 1 LOC), nebo jenom zpouzdřuje funkci (do které skočíš a vidíš parametry), není to problém.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 13. 07. 2018, 14:38:34
V C jsem většinou dopadl tak, že jsem na začátku měl vynulované všechny proměnné a jednu stavovou proměnnou (často jen bool success=true) a kousek před koncem funkce label se jménem exitus, na který jsem skákal při předčasném ukončení. A za ním už byly jen samé delete, free, closehande, closefile...

K čemu je dobré na začátku nulovat proměnné? Hodnoty jim definuji až za běhu a zpravidla je už neměním - snad až na řídicí proměnné cyklu a proměnné typu sum, které stejně musím vynulovat před sčítacím cyklem. Bool proměnné nepoužívám - když je vypustím bez náhrady, tak aplikace běží ještě lépe a radostněji.

Ten label exitus se však jistě hodil, i když si nedovedu moc představit, jak bych ho využil. Goto v mých programech nenajdeš.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 13. 07. 2018, 14:54:19
Kód: [Vybrat]
#define check(podminka) if(!(podminka)) returnTak ty jses dobry cune. Pouzivani maker je problematicke samo o sobe. Neda se to poradne debugovat. Atd. Takovehle makra mas v produkcnim kodu?
Makra taky nepreferuju, ale mají několik výhod, který se prostě nedají ignorovat.
Třeba to, že kdybych tohle zapouzdřil jako funkci, tak se nemůžu vrátit z funkce o level výš.

Tohle makro je sice zajímavé, ale chybí mu návratová hodnota, takže už nikdo nepozná důvod, proč ta funkce neproběhla. U procedur v C považuji za standard, že návratový typ není void, ale int a obsahuje stavový kód. Makro by v mém provedení vypadalo asi takto:
Kód: [Vybrat]
#define check(podminka, errorCode) if(!(podminka)) return errorCodeNebylo by vhodnější to makro pojmenovat assert?
Název: Re:Jak můžu opustit funkci
Přispěvatel: x14 13. 07. 2018, 15:43:41
K čemu je dobré na začátku nulovat proměnné?
Přece abych za exitusem nevolal free(mem) na náhodou adresu, nezavíral soubor, k jehož otevření nikdy nedošlo...
Název: Re:Jak můžu opustit funkci
Přispěvatel: x14 13. 07. 2018, 15:48:22
Nebylo by vhodnější to makro pojmenovat assert?
To by určitě nebylo, když to není assert. Nápověda: assert se v release kódu odstraňuje.
Název: Re:Jak můžu opustit funkci
Přispěvatel: . 13. 07. 2018, 22:27:50
Skor je to problem, ze pisem aplikacie v ktorych klienti uprednostnuju robustnost pred korektnostou a musia sa spamatat za kazdej situacie. 
Nedá mi to, abych znovu nevytáhl výrok, který zapadl a přitom aspiruje na výrok roku v tomto fóru.

NIKDO, opravdu NIKDO, nemůže upřednostňovat robustnost před správnou funkčnosti. Jedinou výjimkou by za určitých podmínek mohla být armáda, ale ani tam si to nikdo nedovolí. Až ta vaše mašina někoho zabije nebo se zničí, tak budete těžko vysvětlovat, že jste jen splnil zadání. Mimochodem, napsat robustní program je triviální, problém trochu je, že nic nedělá.

A na závěr, pokud je vašim cílem vysoká robustnost, vybral jste si špatný jazyk, C rozhodně robustní není. Ale už vám do toho nebudu mluvit, znám takové týpky, 15 let oprašuje svoje zlaté tele, zpravidla jsou to samouci, co znají ve svém kódu každý řádek, ale jinak jsou nepoužitelní. Jejich zákazníci se každý den modlí, aby je náhodou nesrazilo auto, protože to nikdo jiný není schopen převzít.
Název: Re:Jak můžu opustit funkci
Přispěvatel: dustin 13. 07. 2018, 22:46:16
Tou korektností určitě nemyslel správnou funkcionalitu, ale "korektní čistotu" kódu.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 23:00:07
Skor je to problem, ze pisem aplikacie v ktorych klienti uprednostnuju robustnost pred korektnostou a musia sa spamatat za kazdej situacie. 
Nedá mi to, abych znovu nevytáhl výrok, který zapadl a přitom aspiruje na výrok roku v tomto fóru.

NIKDO, opravdu NIKDO, nemůže upřednostňovat robustnost před správnou funkčnosti. Jedinou výjimkou by za určitých podmínek mohla být armáda, ale ani tam si to nikdo nedovolí. Až ta vaše mašina někoho zabije nebo se zničí, tak budete těžko vysvětlovat, že jste jen splnil zadání. Mimochodem, napsat robustní program je triviální, problém trochu je, že nic nedělá.

A na závěr, pokud je vašim cílem vysoká robustnost, vybral jste si špatný jazyk, C rozhodně robustní není. Ale už vám do toho nebudu mluvit, znám takové týpky, 15 let oprašuje svoje zlaté tele, zpravidla jsou to samouci, co znají ve svém kódu každý řádek, ale jinak jsou nepoužitelní. Jejich zákazníci se každý den modlí, aby je náhodou nesrazilo auto, protože to nikdo jiný není schopen převzít.

Ok, vy si kodte taky softver, co vam nespracuje vstup na vystup, lebo vam sa nepaci. Ked sa vstup ale uctuje, tak sa nemoze vyparit. Musi sa oznacit patricne spracovat, opravit a oznacit ako chybny pre dalsie pouzitie. Ono, ked sa spracuva kvantum dat realtime a ide zo modulu A do modulu B cez ine moduly, tak sa asi zakaznik spyta, ze kam mu nieco zmizlo, nie?

Ad ta narazka z oprasovanim 15 rocneho systemu, vy budete nejaky fluktuant, co nieco spravi a ide o dum dal, a ini opravuju potom tu katastrofu, ze ? ;) Nie som samouk.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 23:10:16
Tou korektností určitě nemyslel správnou funkcionalitu, ale "korektní čistotu" kódu.

Tou korektnostou myslim to, ze program nespracuva zle vstupy, ale proste ich zahodi. (pripadne sa zjebe pri zlych vstupoch, to je ten horsi pripad)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 13. 07. 2018, 23:19:15
Ok, vy si kodte taky softver, co vam nespracuje vstup na vystup, lebo vam sa nepaci. Ked sa vstup ale uctuje, tak sa nemoze vyparit. Musi sa oznacit patricne spracovat, opravit a oznacit ako chybny pre dalsie pouzitie. Ono, ked sa spracuva kvantum dat realtime a ide zo modulu A do modulu B cez ine moduly, tak sa asi zakaznik spyta, ze kam mu nieco zmizlo, nie?

Účetnictví není moc realtime, tam se prodlevy do několika sekund snesou. Pokud se něco nepovede, je potřeba vyhodit a zalogovat výjimku. V C to moc nejde a tak se na to vymýšlí různé berličky, i když jsou vcelku zbytečné.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 23:35:18
Ok, vy si kodte taky softver, co vam nespracuje vstup na vystup, lebo vam sa nepaci. Ked sa vstup ale uctuje, tak sa nemoze vyparit. Musi sa oznacit patricne spracovat, opravit a oznacit ako chybny pre dalsie pouzitie. Ono, ked sa spracuva kvantum dat realtime a ide zo modulu A do modulu B cez ine moduly, tak sa asi zakaznik spyta, ze kam mu nieco zmizlo, nie?

Účetnictví není moc realtime, tam se prodlevy do několika sekund snesou. Pokud se něco nepovede, je potřeba vyhodit a zalogovat výjimku. V C to moc nejde a tak se na to vymýšlí různé berličky, i když jsou vcelku zbytečné.

To nie je uctovnictvo.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 13. 07. 2018, 23:42:00
Ok, vy si kodte taky softver, co vam nespracuje vstup na vystup, lebo vam sa nepaci. Ked sa vstup ale uctuje, tak sa nemoze vyparit. Musi sa oznacit patricne spracovat, opravit a oznacit ako chybny pre dalsie pouzitie. Ono, ked sa spracuva kvantum dat realtime a ide zo modulu A do modulu B cez ine moduly, tak sa asi zakaznik spyta, ze kam mu nieco zmizlo, nie?

Účetnictví není moc realtime, tam se prodlevy do několika sekund snesou. Pokud se něco nepovede, je potřeba vyhodit a zalogovat výjimku. V C to moc nejde a tak se na to vymýšlí různé berličky, i když jsou vcelku zbytečné.

To nie je uctovnictvo.

Viděl jsem jednu skutečně realtime aplikaci v C, která ze země řídí přistání letadel pomocí radarů a dalších senzorů. Pokud nejde o život, jde o ho*no. Před touto aplikací však mám respekt.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 13. 07. 2018, 23:57:30
Ok, vy si kodte taky softver, co vam nespracuje vstup na vystup, lebo vam sa nepaci. Ked sa vstup ale uctuje, tak sa nemoze vyparit. Musi sa oznacit patricne spracovat, opravit a oznacit ako chybny pre dalsie pouzitie. Ono, ked sa spracuva kvantum dat realtime a ide zo modulu A do modulu B cez ine moduly, tak sa asi zakaznik spyta, ze kam mu nieco zmizlo, nie?

Účetnictví není moc realtime, tam se prodlevy do několika sekund snesou. Pokud se něco nepovede, je potřeba vyhodit a zalogovat výjimku. V C to moc nejde a tak se na to vymýšlí různé berličky, i když jsou vcelku zbytečné.

To nie je uctovnictvo.

Viděl jsem jednu skutečně realtime aplikaci v C, která ze země řídí přistání letadel pomocí radarů a dalších senzorů. Pokud nejde o život, jde o ho*no. Před touto aplikací však mám respekt.

Take nieco by som si netrufol.  Alebo obsluha tazkych robotov, zdravotnicke zariadenia, jadrove elektrarne, tovarne. Kod z takych miest pre svoj klud radsej nechcem vidiet :)  Tipujem, ze sa tam programuje spajanim certifikovanych ciernych krabiciek (myslim modulov) :) A v tych certifikovanych moduloch nastane chyba max raz za 5 rokov a protichemicka jednotka to vycisti :)
Název: Re:Jak můžu opustit funkci
Přispěvatel: x14 14. 07. 2018, 00:08:26
Tou korektnostou myslim to, ze program nespracuva zle vstupy, ale proste ich zahodi. (pripadne sa zjebe pri zlych vstupoch, to je ten horsi pripad)
Znělo to tak honosně a přitom jde jen o část zadání úlohy. Ovšem pokud je to postaveno vedle robustnosti programu (která je pro slušný program bezpodmínečná), tak je jasné, jak autor myslel "veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze".
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 14. 07. 2018, 01:12:37
Viděl jsem jednu skutečně realtime aplikaci v C, která ze země řídí přistání letadel pomocí radarů a dalších senzorů. Pokud nejde o život, jde o ho*no. Před touto aplikací však mám respekt.

Take nieco by som si netrufol.  Alebo obsluha tazkych robotov, zdravotnicke zariadenia, jadrove elektrarne, tovarne. Kod z takych miest pre svoj klud radsej nechcem vidiet :)  Tipujem, ze sa tam programuje spajanim certifikovanych ciernych krabiciek (myslim modulov) :) A v tych certifikovanych moduloch nastane chyba max raz za 5 rokov a protichemicka jednotka to vycisti :)

Nakonec jsem do toho nešel právě kvůli tomu C. Prostě mi ten jazyk nesedí. Samozřejmě to nepíše jeden člověk a důsledně se dělá TDD, code review a další podceňované techniky vývoje. Kdyby to bylo ve Fortranu, tak by mi to vyhovovalo.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Radovan. 14. 07. 2018, 06:26:47
Tou korektnostou myslim to, ze program nespracuva zle vstupy, ale proste ich zahodi. (pripadne sa zjebe pri zlych vstupoch, to je ten horsi pripad)
K tomu doporučuji prostudovat knížečku "Programátorské poklesky" od Kopečka a Kučery. Stará ale dobrá, a jsou v ní krásně popsané kategorie programů podle jejich chování k uživateli a jeho datům :)
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 14. 07. 2018, 07:22:30
Viděl jsem jednu skutečně realtime aplikaci v C, která ze země řídí přistání letadel pomocí radarů a dalších senzorů. Pokud nejde o život, jde o ho*no. Před touto aplikací však mám respekt.

Take nieco by som si netrufol.  Alebo obsluha tazkych robotov, zdravotnicke zariadenia, jadrove elektrarne, tovarne. Kod z takych miest pre svoj klud radsej nechcem vidiet :)  Tipujem, ze sa tam programuje spajanim certifikovanych ciernych krabiciek (myslim modulov) :) A v tych certifikovanych moduloch nastane chyba max raz za 5 rokov a protichemicka jednotka to vycisti :)

Nakonec jsem do toho nešel právě kvůli tomu C. Prostě mi ten jazyk nesedí. Samozřejmě to nepíše jeden člověk a důsledně se dělá TDD, code review a další podceňované techniky vývoje. Kdyby to bylo ve Fortranu, tak by mi to vyhovovalo.

TDD je frikulinsky agilny vymysel poslednych rokov, aby sme mali na co pri robote nadavat.  Ale budis, asi jo, v nejakej inej forme sa to tam asi robi.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 14. 07. 2018, 07:26:14
Tou korektnostou myslim to, ze program nespracuva zle vstupy, ale proste ich zahodi. (pripadne sa zjebe pri zlych vstupoch, to je ten horsi pripad)
K tomu doporučuji prostudovat knížečku "Programátorské poklesky" od Kopečka a Kučery. Stará ale dobrá, a jsou v ní krásně popsané kategorie programů podle jejich chování k uživateli a jeho datům :)

Dakujem za odporucenu literaturu. Bud sa v tej knihe budem smiat na pokleskoch, alebo schytam zachvaty paniky a budem chciet vsetko prekodit :)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kiwi 14. 07. 2018, 09:49:44
Výjimky jsou zlo. C++ je zlo.

http://250bpm.com/blog:4
http://250bpm.com/blog:8
Název: Re:Jak můžu opustit funkci
Přispěvatel: Sten 14. 07. 2018, 10:29:57
Výjimky jsou zlo. C++ je zlo.

http://250bpm.com/blog:4
http://250bpm.com/blog:8

Ty výtky k výjimkám v tom prvním nějak nechápu. Výjimky jsou náhrada za návratové kódy v C a jejich řešení mimo funkci, když takový kód porovnáte, tak to vypadá velmi podobně, ale v C++ máte jasně rozděleno, co je chyba a co hodnota a navíc nepotřebujete desítky if (selhalo) { dealokuj(); return CHYBA; }, protože o to se postará překladač. Ke zpracování chyb v místě jejich vzniku je zbytečné používat výjimky.
Název: Re:Jak můžu opustit funkci
Přispěvatel: BoneFlute 14. 07. 2018, 10:50:24
Výjimky jsou náhrada za návratové kódy v C

Vypíchl bych skutečnost, že výjimky jsou nutnou náhradou. V jazycích jako je C, Java, ale třeba i PHP, Javascript řešit příznak chyby návratovou hodnotou nejde - protože si tu návratovou hodnotu nemusíš vyzvednout.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 14. 07. 2018, 11:17:10
Výjimky jsou zlo. C++ je zlo.

http://250bpm.com/blog:4
http://250bpm.com/blog:8

Koukám, že výjimky v C++ jsou skutečně zlo, zejména když je někdo použije tak hloupým způsobem, jako autor těch článků.
Název: Re:Jak můžu opustit funkci
Přispěvatel: λ bender 14. 07. 2018, 11:51:51
Výjimky jsou zlo. C++ je zlo.
Výjimky se musí udělat tak, aby nebyly vidět. Jako například v Go, kde si většina myslí, že žádné nemá, i když na nich stojí velká část standardní knihovny.
Název: Re:Jak můžu opustit funkci
Přispěvatel: LambdaBender 14. 07. 2018, 13:31:54
Viděl jsem jednu skutečně realtime aplikaci v C, která ze země řídí přistání letadel pomocí radarů a dalších senzorů. Pokud nejde o život, jde o ho*no. Před touto aplikací však mám respekt.

Take nieco by som si netrufol.  Alebo obsluha tazkych robotov, zdravotnicke zariadenia, jadrove elektrarne, tovarne. Kod z takych miest pre svoj klud radsej nechcem vidiet :)  Tipujem, ze sa tam programuje spajanim certifikovanych ciernych krabiciek (myslim modulov) :) A v tych certifikovanych moduloch nastane chyba max raz za 5 rokov a protichemicka jednotka to vycisti :)

Nakonec jsem do toho nešel právě kvůli tomu C. Prostě mi ten jazyk nesedí. Samozřejmě to nepíše jeden člověk a důsledně se dělá TDD, code review a další podceňované techniky vývoje. Kdyby to bylo ve Fortranu, tak by mi to vyhovovalo.

TDD je frikulinsky agilny vymysel poslednych rokov, aby sme mali na co pri robote nadavat.  Ale budis, asi jo, v nejakej inej forme sa to tam asi robi.
Kdo je Budiš?
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 14. 07. 2018, 13:42:17
TDD je frikulinsky agilny vymysel poslednych rokov, aby sme mali na co pri robote nadavat.  Ale budis, asi jo, v nejakej inej forme sa to tam asi robi.
Kdo je Budiš?

Nikoho jsem tam nebudil.
Název: Re:Jak můžu opustit funkci
Přispěvatel: ded.kenedy 15. 07. 2018, 02:07:34
Ta diskuze je dojemna. Dotazujici se, evidentne zacatecnik, prijde s problemem se zakladnim konstruktem. A misto toho, aby se mu poradilo na urovni jeho schopnosti, tj. ze k hezkemu strukturovanemu programovani return v if-u nepatri, a pokud mam nekde if, melo byt mit i else, tak se mistni frajeri zacnout predhanet, kdo je vetsi machr a umi napsat vymakanejsi kod. PetrM s propadajicimi casy pochopitelne vyhrava.

Paradoxni je, ze hned ve druhem prispevku (a byl to vlastne duvod dotazu jako takoveho) jde videt, k cemu muze nedomyslene predcasne opusteni funkce returnem vest, tj. resource leaky, nedefinovane stavy, visici zamky...

Samozrejme, vetsina mistnich odborniku bude tvrdit, ze takove chyby se jim nikdy nestavaji, ale opak bude spis pravdou.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 15. 07. 2018, 09:51:46
Ta diskuze je dojemna. Dotazujici se, evidentne zacatecnik, prijde s problemem se zakladnim konstruktem. A misto toho, aby se mu poradilo na urovni jeho schopnosti, tj. ze k hezkemu strukturovanemu programovani return v if-u nepatri, a pokud mam nekde if, melo byt mit i else (...)

Ale vždyť toto je blbost. Proč by nemohl mít return v ifu? Zvlášť když je řeč o C?

Typicky

Kód: [Vybrat]
if (argc < 2) {
    return 1;
}

je pro začátečníka naprosto v pořádku, naopak je to dobrý návyk. (Samozřejmě lze použít err() a jiné, ale mluvíme o příkladu pro začátečníka).
Nějaká nutnost else je taky blbost.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 15. 07. 2018, 10:19:43
Typicky
Kód: [Vybrat]
if (argc < 2) {
    return 1;
}
je pro začátečníka naprosto v pořádku, naopak je to dobrý návyk. (Samozřejmě lze použít err() a jiné, ale mluvíme o příkladu pro začátečníka).
Nějaká nutnost else je taky blbost.

Přesně. Dnes se else používá ve funkcionálních jazycích u ternárních operací. Jinde postrádá na významu a jen znepřehledňuje kód. Return v podmíněném příkazu se už stal běžnou součástí, jeden výstupní bod podprogramu má význam snad už jen v Assembleru.

XSLT pro jistotu nemá else vůbec. Cykly a podmínky se v něm často vypouští také, jenže to je tak trochu jiný level.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 15. 07. 2018, 10:22:02
Nevím jak obecně u funkcionálních, ale v Haskellu mám radši stráže a vzory než if/else :)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 15. 07. 2018, 10:43:57
Nevím jak obecně u funkcionálních, ale v Haskellu mám radši stráže a vzory než if/else :)

Stráže a vzory se mi také líbí. Princip je podobný ACL.
Název: Re:Jak můžu opustit funkci
Přispěvatel: ded.kenedy 15. 07. 2018, 13:23:10
Citace
Ale vždyť toto je blbost. Proč by nemohl mít return v ifu?

Bylo by vhodne naucit se vnimat veci v kontextu a ne jen jednotlive drobne useky. Vzdyt pisu:

Citace
hned ve druhem prispevku (a byl to vlastne duvod dotazu jako takoveho) jde videt, k cemu muze nedomyslene predcasne opusteni funkce returnem vest, tj. resource leaky, nedefinovane stavy, visici zamky...
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 15. 07. 2018, 13:44:52
Citace
Ale vždyť toto je blbost. Proč by nemohl mít return v ifu?

Bylo by vhodne naucit se vnimat veci v kontextu a ne jen jednotlive drobne useky. Vzdyt pisu:

Citace
hned ve druhem prispevku (a byl to vlastne duvod dotazu jako takoveho) jde videt, k cemu muze nedomyslene predcasne opusteni funkce returnem vest, tj. resource leaky, nedefinovane stavy, visici zamky...

Úplně nejlepší by bylo být schopen psát a strukturovat text tak, aby dával ten smysl, co chci. Nebo to máme chápat tak (pokud na sebe odstavce navazují), že if s returnem je "nedomyšlené předčasné opuštění funkce"?
Název: Re:Jak můžu opustit funkci
Přispěvatel: ded.kenedy 15. 07. 2018, 15:04:21
Citace
pokud na sebe odstavce navazují

Ano, navazuji, proto byly v puvodnim prispevku uvedeny za sebou.

Citace
Nebo to máme chápat tak, že if s returnem je "nedomyšlené předčasné opuštění funkce"?

Ne, nemate. Vsimnete si, ze v dane vete bylo pouzito modalni sloveso "muze". Z toho plyne, ze ne kazde pouziti if s returnem je nedomyslene, ale pokud je, ma to opravdu neprijemne dusledky. A z vlastni zkusenosti muzu rict, ze zacinajici programatori opravdu maji problemy dusledky takoveho "vyskoceni" domyslet. Proto je lepsi, kdyz se takovym konstrukcim budou vyhybat, obzvlast, pokud maji problem zvladnout jazyk jako takovy.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 15. 07. 2018, 16:00:48
Citace
Nebo to máme chápat tak, že if s returnem je "nedomyšlené předčasné opuštění funkce"?
Ne, nemate. Vsimnete si, ze v dane vete bylo pouzito modalni sloveso "muze". Z toho plyne, ze ne kazde pouziti if s returnem je nedomyslene, ale pokud je, ma to opravdu neprijemne dusledky. A z vlastni zkusenosti muzu rict, ze zacinajici programatori opravdu maji problemy dusledky takoveho "vyskoceni" domyslet. Proto je lepsi, kdyz se takovym konstrukcim budou vyhybat, obzvlast, pokud maji problem zvladnout jazyk jako takovy.

Začátečník se takovým situacím nemá učit vyhýbat, ale má se je učit zvládat. Minimálně 90 % funkcí nemá v takové situaci alokované žádné prostředky, nemusí je tedy uvolňovat a může rovnou skončit returnem. Takové funkce tedy není nutné prznit nějakým dogmatem o jednom výstupním bodu.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 15. 07. 2018, 16:27:55
Citace
pokud na sebe odstavce navazují

Ano, navazuji, proto byly v puvodnim prispevku uvedeny za sebou.


To je podmínka nutná, ale ne postačující.

Citace
Nebo to máme chápat tak, že if s returnem je "nedomyšlené předčasné opuštění funkce"?

Ne, nemate. Vsimnete si, ze v dane vete bylo pouzito modalni sloveso "muze". Z toho plyne, ze ne kazde pouziti if s returnem je nedomyslene, ale pokud je, ma to opravdu neprijemne dusledky.

Výborně, takže blbost je jen ta první část, jak jsem to bral původně.

Podívejme se na to:

(...) k hezkemu strukturovanemu programovani return v if-u nepatri, a pokud mam nekde if, melo byt mit i else (...)

a

(...)

Bylo by vhodne naucit se vnimat veci v kontextu a ne jen jednotlive drobne useky. Vzdyt pisu:

Citace
hned ve druhem prispevku (a byl to vlastne duvod dotazu jako takoveho) jde videt, k cemu muze nedomyslene predcasne opusteni funkce returnem vest, tj. resource leaky, nedefinovane stavy, visici zamky...

Takže obecné (mylné) tvrzení obhajujeme "modálním slovesem může", respektive nějakým hypotetickým "nedomyšleným řešením", které může, ale nemusí nastat. (proto jsem se tak "hloupě ptal", zdali na sebe navazují, protože takto vedle sebe je ta blbost, co jsi napsal, vidět jasně)
Tak tu poznámku s kontextem si příště nechej od cesty a napiš to líp.

--------------------------------------
A z vlastni zkusenosti muzu rict, ze zacinajici programatori opravdu maji problemy dusledky takoveho "vyskoceni" domyslet. Proto je lepsi, kdyz se takovym konstrukcim budou vyhybat, obzvlast, pokud maji problem zvladnout jazyk jako takovy.

Tento přístup chápu, ale nepovažuji jej za správný. Zvlášť pokud člověk začíná s programováním, tak takto černobílé vyhýbání se relativně základním konceptům vede ke špatným návykům. Naopak by bylo fajn si s takovým člověkem "sednout" a vysvětlit mu v čem by mohl být problém. Tento přístup má i tu výhodu, že se začne na svůj kód dívat zase trošku jinak. Ale ne vždycky je to možné :)


@Kit - tady plně souhlasím :)
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 15. 07. 2018, 17:10:39
Vas  tu este stale bavi tu jednu moju vetu rozoberat a negovat? Vysoka skola zivota tato diskusia. (Bolo to myslene pejorativne)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 15. 07. 2018, 17:27:04
;)

A uz slubujem, ze v tomto topicu na nic nereagujem, nech si napise kto chce, co che. Nepotrebujem krmit trollov. (Nemyslim konkretne vas)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 15. 07. 2018, 18:40:24
TDD je frikulinsky agilny vymysel poslednych rokov, aby sme mali na co pri robote nadavat.  Ale budis, asi jo, v nejakej inej forme sa to tam asi robi.

TDD používám už asi 20 let. Jenom se tomu tenkrát tak neříkalo. Podobně provozuji Scrum déle, než existuje tento pojem. Pouze se mezitím našel někdo, kdo sepsal pravidla a dal tomu jméno.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kiwi 15. 07. 2018, 21:37:22
Výjimky jsou zlo. C++ je zlo.

http://250bpm.com/blog:4
http://250bpm.com/blog:8

Koukám, že výjimky v C++ jsou skutečně zlo, zejména když je někdo použije tak hloupým způsobem, jako autor těch článků.
Mně taky nikdy nesedly. Nikdo nikdy mi nedokázal smysluplně vysvětlit, jaký je rozdíl mezi stavem a chybovým stavem a proč bych to druhé měl v programu řešit nějakými úplně jinými konstrukcemi a postupy a na jiných místech než to první.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 15. 07. 2018, 21:57:43
Koukám, že výjimky v C++ jsou skutečně zlo, zejména když je někdo použije tak hloupým způsobem, jako autor těch článků.
Mně taky nikdy nesedly. Nikdo nikdy mi nedokázal smysluplně vysvětlit, jaký je rozdíl mezi stavem a chybovým stavem a proč bych to druhé měl v programu řešit nějakými úplně jinými konstrukcemi a postupy a na jiných místech než to první.

Celková koncepce je postavená na tom, že každá komponenta (aplikace, objekt, metoda) má jeden vstup, jeden výstup a jeden chybový výstup. Vstupy se předávají přes parametry, výstupy jsou obecně objekty a chybovými výstupy chybové objekty, tedy výjimky. Pro každou z těchto tří kategorií jsou samostatné konstrukty - stačí je jen používat.

Při důsledném používání výjimek jsou stavy nepotřebné. Funkce vrací hodnotu. Procedura něco dělá, ale návratová hodnota je void. Místo chybových stavů se v obou případech použijí výjimky, které ten chybový stav popisují mnohem lépe, než pouhý návratový kód.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 15. 07. 2018, 22:14:46
(...)

Při důsledném používání výjimek jsou stavy nepotřebné. Funkce vrací hodnotu. Procedura něco dělá, ale návratová hodnota je void. Místo chybových stavů se v obou případech použijí výjimky, které ten chybový stav popisují mnohem lépe, než pouhý návratový kód.

Lze to i otočit - při důsledném používání stavů jsou výjimky nepotřebné. Tím nechci říct, že výjimky jsou k ničemu, jen mi zrovna toto nepřijde jako ultimátní argument. Chybový stav může popsat návratový stav stejně dobře jako výjimka, jde jen o to udělat v tom systém, respektive "udělat dokumentaci".
Ve výsledku je třeba ošetřit obojí - při použití výjimek vyřešit "chybu" a případně nahradit návratovou hodnotu nějakou smyslupnou - při použití návratových kódů je opět třeba to stejné. Upřímně moc ten rozdíl nevidím, jen se výrazně liší syntax, která je imho o kus komplikovanější. Nutno ale dodat, že nejvíce mám naprogramováno v Céčku a Haskellu, kdy v prvním výjimky úplně nejsou a v druhém jsou de facto jen v IO. :) Ale toto je asi na trochu jinou diskusi (které se nebráním, ba naopak!), tady jsme trochu OT. :)
Název: Re:Jak můžu opustit funkci
Přispěvatel: ded.kenedy 15. 07. 2018, 22:18:47
Citace
Začátečník se takovým situacím nemá učit vyhýbat, ale má se je učit zvládat.

Zacatecnik ma obvykle mnohem jine starosti. Vetsinou je rad, ze kod splnuje zadani. Ver mi, v praci delam code review i pro hodne zacinajici programatory.

Citace
Minimálně 90 % funkcí nemá v takové situaci alokované žádné prostředky.

A pak je tech zbylych deset procent, kde se na to muze zapomenout a hned mas memory leak nebo neuvolneny zamek raz dva. Pokud pouziji tvuj odhad, tak deseti procentni riziko, ze neco nekde prehlednu je opravdu vysoke a neprijatelne.

Citace
Tento přístup chápu, ale nepovažuji jej za správný.

To je tvuj nazor, ale bavime-li se o strukturovanem programovani, tak tam opravdu prikazy skoku (at uz jsou pojmenovany jakkoliv) nepatri, protoze tyto konstrukty rozbiji co? Strukturu kodu!
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 15. 07. 2018, 22:21:16
TDD je frikulinsky agilny vymysel poslednych rokov, aby sme mali na co pri robote nadavat.  Ale budis, asi jo, v nejakej inej forme sa to tam asi robi.

TDD používám už asi 20 let. Jenom se tomu tenkrát tak neříkalo. Podobně provozuji Scrum déle, než existuje tento pojem. Pouze se mezitím našel někdo, kdo sepsal pravidla a dal tomu jméno.

Ja som pouzival docker na PMD-85, len to nebol docker a fungovalo to uplne inak.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 15. 07. 2018, 22:36:21
Při důsledném používání výjimek jsou stavy nepotřebné. Funkce vrací hodnotu. Procedura něco dělá, ale návratová hodnota je void. Místo chybových stavů se v obou případech použijí výjimky, které ten chybový stav popisují mnohem lépe, než pouhý návratový kód.
Lze to i otočit - při důsledném používání stavů jsou výjimky nepotřebné. Tím nechci říct, že výjimky jsou k ničemu, jen mi zrovna toto nepřijde jako ultimátní argument. Chybový stav může popsat návratový stav stejně dobře jako výjimka, jde jen o to udělat v tom systém, respektive "udělat dokumentaci".

Jistě, bývaly doby, kdy se výjimky nepoužívaly a také to fungovalo.

Ve výsledku je třeba ošetřit obojí - při použití výjimek vyřešit "chybu" a případně nahradit návratovou hodnotu nějakou smyslupnou - při použití návratových kódů je opět třeba to stejné. Upřímně moc ten rozdíl nevidím, jen se výrazně liší syntax, která je imho o kus komplikovanější. Nutno ale dodat, že nejvíce mám naprogramováno v Céčku a Haskellu, kdy v prvním výjimky úplně nejsou a v druhém jsou de facto jen v IO. :) Ale toto je asi na trochu jinou diskusi (které se nebráním, ba naopak!), tady jsme trochu OT. :)

Pokud z nějaké knihovny obdržím návratový kód, tak ho mohu zpracovat, ale také ignorovat. Když tento kód převedu na výjimku, což zpravidla znamená vytvořit objekt, do kterého se uloží všechny potřebné informace o chybě, tak takový objekt není možné ignorovat. Jinak propadne až ven z aplikace a vypíše se, co bylo příčinou pádu.

Syntaxe je záměrně jiná, výsledek je naopak mnohem jednodušší. Neošetřuje se jednotlivě každá výjimka, ale celá skupina. Není tedy třeba se po každém provedení příkazu ptát, zda proběhl v pořádku, což způsobovalo dlouhé špagety. Místo toho se udělá sekvence příkazů, ve které se výjimky ošetří společně. Není ani potřebné, aby výjimka byla ošetřena v metodě, ve které vznikla - je to spíš nežádoucí právě kvůli zjednodušení.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 15. 07. 2018, 22:47:50
Citace
Začátečník se takovým situacím nemá učit vyhýbat, ale má se je učit zvládat.

Zacatecnik ma obvykle mnohem jine starosti. Vetsinou je rad, ze kod splnuje zadani. Ver mi, v praci delam code review i pro hodne zacinajici programatory.

No pokud jim radíš, že po ifu má být vždy else a return do ifu nepatří, tak jim akorát další starosti přidáváš.

Citace
Minimálně 90 % funkcí nemá v takové situaci alokované žádné prostředky.

A pak je tech zbylych deset procent, kde se na to muze zapomenout a hned mas memory leak nebo neuvolneny zamek raz dva. Pokud pouziji tvuj odhad, tak deseti procentni riziko, ze neco nekde prehlednu je opravdu vysoke a neprijatelne.

To ale @Kit neřekl. Mimo to, kolik začátečníků si hraje se zámky ? ;)

Citace
Tento přístup chápu, ale nepovažuji jej za správný.

To je tvuj nazor, ale bavime-li se o strukturovanem programovani, tak tam opravdu prikazy skoku (at uz jsou pojmenovany jakkoliv) nepatri, protoze tyto konstrukty rozbiji co? Strukturu kodu!

1) Strukturované programování je především o logické struktuře kódu, ne o nějakých pseudopravidlech. Hlavně z mého předchozího příkladu - to by měl být zbytek funkce v else větvi, abys byl spokojen?
2) Mimochodem If/Else mají také za následek skok, tak přemýšlím, jak rozbíjí strukturu kódu.
3) O jaké struktuře kódu mluvíš? Jak ji return v ifu rozbíjí, respektive jak vypadá tvůj main v céčku?

Ano, je to můj názor a zatím jsi nebyl schopen říct, v čem je špatný.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 15. 07. 2018, 22:56:46
Pokud z nějaké knihovny obdržím návratový kód, tak ho mohu zpracovat, ale také ignorovat. Když tento kód převedu na výjimku, což zpravidla znamená vytvořit objekt, do kterého se uloží všechny potřebné informace o chybě, tak takový objekt není možné ignorovat. Jinak propadne až ven z aplikace a vypíše se, co bylo příčinou pádu.

Jistě, pokud používám funkce/knihovnu, kde se výjimky používají, tak pak není na výběr. Spíš mi šlo o to, proč bych měl na návratový kód "kašlat" (tento přístup), respektive vždycky upřednostňovat výjimky. Aspoň takový jsem z tvého vyjádření měl pocit. :)

Syntaxe je záměrně jiná, výsledek je naopak mnohem jednodušší. Neošetřuje se jednotlivě každá výjimka, ale celá skupina. Není tedy třeba se po každém provedení příkazu ptát, zda proběhl v pořádku, což způsobovalo dlouhé špagety. Místo toho se udělá sekvence příkazů, ve které se výjimky ošetří společně. Není ani potřebné, aby výjimka byla ošetřena v metodě, ve které vznikla - je to spíš nežádoucí právě kvůli zjednodušení.

Jistě, to dává smysl. Na stranu druhou když ošetřuji společně výjimky pro sekvenci příkazů, tak poté pravděpodobně ztratím tu "rozlišovací schopnost", co se kde stalo (jistě, ošetřuji třeba podobné/stejné problémy/výjimky, ale už je problém s tím kde, ne? Respektive chci-li řešit toto, tak to do kódu několik řádků přidá, či ne?).
To poslední beru, to je relevantní.
Název: Re:Jak můžu opustit funkci
Přispěvatel: ded.kenedy 15. 07. 2018, 23:19:38
Citace
No pokud jim radíš, že po ifu má být vždy else a return do ifu nepatří, tak jim akorát další starosti přidáváš.

Radim jim, jak kod udelat srozumitelnejsi, aby se v nem oni a lidi, co budou jejich kod cist, vyznali hned napoprve. Ale to neni vec pro frajery, jak jsem psal vcera.

Citace
To ale @Kit neřekl.

Ale plyne to z toho.

Citace
Mimo to, kolik začátečníků si hraje se zámky ?

Tak si misto zamek dopln: neuzavreny soubor, neuvolnene spojeni do databaze a souvisejici alokovane objekty, neuzavrene sitove spojeni. Opravdu to zacatecnici nepouzivaji?

Citace
1) Strukturované programování je především o logické struktuře kódu, ne o nějakých pseudopravidlech.

A te struktury kodu dosahnes jak?

Citace
Mimochodem If/Else mají také za následek skok, tak přemýšlím, jak rozbíjí strukturu kódu.

Ja jsem k autistum tolerantni, ale vest s nimi diskuze o nicem me nabavi.

Citace
O jaké struktuře kódu mluvíš?

Precti si neco o strukturovanem programovani, bude stacit wikipedie, urcite te to obohati.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 15. 07. 2018, 23:39:56
Citace
No pokud jim radíš, že po ifu má být vždy else a return do ifu nepatří, tak jim akorát další starosti přidáváš.

Radim jim, jak kod udelat srozumitelnejsi, aby se v nem oni a lidi, co budou jejich kod cist, vyznali hned napoprve. Ale to neni vec pro frajery, jak jsem psal vcera.

Čitelnost je vždycky důležitá, ale vynucováním blbostí jí akorát tak ublížíš. Viz dole.

Citace
To ale @Kit neřekl.

Ale plyne to z toho.

Neplyne.

Citace
Mimo to, kolik začátečníků si hraje se zámky ?

Tak si misto zamek dopln: neuzavreny soubor, neuvolnene spojeni do databaze a souvisejici alokovane objekty, neuzavrene sitove spojeni. Opravdu to zacatecnici nepouzivaji?

Ne, začátečníci většinou končí neuzavřeným souborem, kdy se o to přinejhorším postará OS. Tím to neobhajuju. Paradoxně if - close - return je v tomto případě asi to nejlepší řešení, ty bys tam asi zase cpal else.

Citace
1) Strukturované programování je především o logické struktuře kódu, ne o nějakých pseudopravidlech.

A te struktury kodu dosahnes jak?

Tak, že nebudu program větvit na 150 if/else, aby celá funkce končila jedním returnem.

Citace
Mimochodem If/Else mají také za následek skok, tak přemýšlím, jak rozbíjí strukturu kódu.

Ja jsem k autistum tolerantni, ale vest s nimi diskuze o nicem me nabavi.


V pohodě, naštěstí autista nejsem, takže si rád nechám odpovědět na otázku.

Citace
O jaké struktuře kódu mluvíš?

Precti si neco o strukturovanem programovani, bude stacit wikipedie, urcite te to obohati.

Z wiki:
Citace

Kód: [Vybrat]
otevřít soubor;
while (existují data k přečtení) {
  načíst data;
  if (chyba) {
    ukončit podprogram a informovat zbytek programu o chybě;
  }
}
zpracovat načtená data;
konec podprogramu;

Výše je uvedena poměrně běžná situace, se kterou se můžeme vypořádat několika způsoby: vyhozením výjimky, předčasným (druhým) návratem z procedury a nebo třeba i příkazem skoku. Ve všech těchto případech má procedura dva výstupní body a porušuje tak principy „striktního“ strukturovaného programování. Na obhajobu tohoto přístupu však musíme říci, že přepsání této procedury v souladu s pravidlem jednoho výstupního bodu by bylo poměrně těžkopádné, nemluvě o tom, jaký chaos by v kódu vznikl, pokud by do hry vstoupilo více chybových stavů a každý se navíc musel ošetřit jiným způsobem.


Škoda, že sis takto naběhl. :) Bylo by fajn, kdybys uvedl, jak bys řešil např. ten main. Člověk, který uměle vynucuje jeden return na konci funkce, i když to prasí čitelnost, tak je stejné pako jako ten, kdo používá return na každém rohu.
Název: Re:Jak můžu opustit funkci
Přispěvatel: . 16. 07. 2018, 00:02:21
Koukám, že výjimky v C++ jsou skutečně zlo, zejména když je někdo použije tak hloupým způsobem, jako autor těch článků.
Mně taky nikdy nesedly. Nikdo nikdy mi nedokázal smysluplně vysvětlit, jaký je rozdíl mezi stavem a chybovým stavem a proč bych to druhé měl v programu řešit nějakými úplně jinými konstrukcemi a postupy a na jiných místech než to první.

Celková koncepce je postavená na tom, že každá komponenta (aplikace, objekt, metoda) má jeden vstup, jeden výstup a jeden chybový výstup. Vstupy se předávají přes parametry, výstupy jsou obecně objekty a chybovými výstupy chybové objekty, tedy výjimky. Pro každou z těchto tří kategorií jsou samostatné konstrukty - stačí je jen používat.

Při důsledném používání výjimek jsou stavy nepotřebné. Funkce vrací hodnotu. Procedura něco dělá, ale návratová hodnota je void. Místo chybových stavů se v obou případech použijí výjimky, které ten chybový stav popisují mnohem lépe, než pouhý návratový kód.
Tohle je možná fajn pro byznys logiku, ale zkuste takhle naprogramovat komunikační protokol.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 16. 07. 2018, 00:19:26
Pokud z nějaké knihovny obdržím návratový kód, tak ho mohu zpracovat, ale také ignorovat. Když tento kód převedu na výjimku, což zpravidla znamená vytvořit objekt, do kterého se uloží všechny potřebné informace o chybě, tak takový objekt není možné ignorovat. Jinak propadne až ven z aplikace a vypíše se, co bylo příčinou pádu.
Jistě, pokud používám funkce/knihovnu, kde se výjimky používají, tak pak není na výběr. Spíš mi šlo o to, proč bych měl na návratový kód "kašlat" (tento přístup), respektive vždycky upřednostňovat výjimky. Aspoň takový jsem z tvého vyjádření měl pocit. :)

Návratový kód mohu zapomenout ošetřit, což se zejména začátečníkům stává docela často. Když chybový status z knihovny přeložím na výjimku, tak mi to nedovolí ji ignorovat. Navíc taková výjimka obsahuje popis chyby a kde se stala.

Syntaxe je záměrně jiná, výsledek je naopak mnohem jednodušší. Neošetřuje se jednotlivě každá výjimka, ale celá skupina. Není tedy třeba se po každém provedení příkazu ptát, zda proběhl v pořádku, což způsobovalo dlouhé špagety. Místo toho se udělá sekvence příkazů, ve které se výjimky ošetří společně. Není ani potřebné, aby výjimka byla ošetřena v metodě, ve které vznikla - je to spíš nežádoucí právě kvůli zjednodušení.

Jistě, to dává smysl. Na stranu druhou když ošetřuji společně výjimky pro sekvenci příkazů, tak poté pravděpodobně ztratím tu "rozlišovací schopnost", co se kde stalo (jistě, ošetřuji třeba podobné/stejné problémy/výjimky, ale už je problém s tím kde, ne? Respektive chci-li řešit toto, tak to do kódu několik řádků přidá, či ne?).
To poslední beru, to je relevantní.

Každá výjimka je unikátní místem vzniku, stavovým kódem, vloženým textem a/nebo třídou výjimky. To vše si výjimka nese s sebou. Z toho se dají zjistit všechny potřebné informace a zpracovat je v jednom místě aplikace například pro všechny položky menu. To přináší značnou úsporu kódu a navíc výpis chybových hlášení pak vypadá jednotně. Pokud potřebuji jemnější granularitu, tak si v některé metodě mohu ošetřit jen některé typy výjimek a zbytek nechat propadnout. Také ji mohu obalit další výjimkou, takže si je mohu i vytrasovat.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 16. 07. 2018, 00:21:26
Celková koncepce je postavená na tom, že každá komponenta (aplikace, objekt, metoda) má jeden vstup, jeden výstup a jeden chybový výstup. Vstupy se předávají přes parametry, výstupy jsou obecně objekty a chybovými výstupy chybové objekty, tedy výjimky. Pro každou z těchto tří kategorií jsou samostatné konstrukty - stačí je jen používat.

Při důsledném používání výjimek jsou stavy nepotřebné. Funkce vrací hodnotu. Procedura něco dělá, ale návratová hodnota je void. Místo chybových stavů se v obou případech použijí výjimky, které ten chybový stav popisují mnohem lépe, než pouhý návratový kód.
Tohle je možná fajn pro byznys logiku, ale zkuste takhle naprogramovat komunikační protokol.

Bez problémů.
Název: Re:Jak můžu opustit funkci
Přispěvatel: ded.kenedy 16. 07. 2018, 01:59:08
Citace
vynucováním blbostí jí akorát tak ublížíš

V puvodnim prispevku bylo: pokud mam nekde if, melo by mit i else. Laskavy ctenar si povsimne, ze je tam pouzity podminovaci zpusob slovesa mit. Aby to bylo jasne "melo by mit" != "musi mit".

Citace
Tak, že nebudu program větvit na 150 if/else, aby celá funkce končila jedním returnem.

Pokud mas ve funkci 150 if/else, evidentne neco delas spatne. Ale zdraham se tu uvest stare dobre pravidlo, ze ve funkci by mely byt nanejvys tri nebo ctyri zanoreni if, for,... protoze nekterym by z toho mohla explodovat hlava.

Citace
Z wiki:
Kód: [Vybrat]
while (existují data k přečtení) {
  načíst data;
  ...
}
zpracovat načtená data;

Tento kod je hlavne z podstaty spatny, protoze funkce nedela jednu vec, ale minimalne dve veci: nacteni dat a jejich zpracovani. Pokud ty ulohy rozdelis, kod se da zjednodusit a vystacis si s jednim vystupnim bodem a kdyz budes vedet jak na to, muzes se obejit i bez break.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 16. 07. 2018, 03:03:53
Citace
vynucováním blbostí jí akorát tak ublížíš
V puvodnim prispevku bylo: pokud mam nekde if, melo by mit i else. Laskavy ctenar si povsimne, ze je tam pouzity podminovaci zpusob slovesa mit. Aby to bylo jasne "melo by mit" != "musi mit".

Nemělo. Ve svých programech skoro žádné else nemám a nechybí tam. Občas se zbavuji i podmínek if, pokud je to vhodné.

Citace
Tak, že nebudu program větvit na 150 if/else, aby celá funkce končila jedním returnem.
Pokud mas ve funkci 150 if/else, evidentne neco delas spatne. Ale zdraham se tu uvest stare dobre pravidlo, ze ve funkci by mely byt nanejvys tri nebo ctyri zanoreni if, for,... protoze nekterym by z toho mohla explodovat hlava.

Obvykle stačí dvě úrovně zanoření, když se else nepoužívá. Těch 150 if/else byla jistě nadsázka.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 16. 07. 2018, 06:45:36
Citace
vynucováním blbostí jí akorát tak ublížíš

V puvodnim prispevku bylo: pokud mam nekde if, melo by mit i else. Laskavy ctenar si povsimne, ze je tam pouzity podminovaci zpusob slovesa mit. Aby to bylo jasne "melo by mit" != "musi mit".

V původním příspěvku byla spousta hovadin. Vytrháváním z kontextu to neschováš. Btw pořád čekám na odpověď. ;)

Citace
Z wiki:
Kód: [Vybrat]
while (existují data k přečtení) {
  načíst data;
  ...
}
zpracovat načtená data;

Tento kod je hlavne z podstaty spatny, protoze funkce nedela jednu vec, ale minimalne dve veci: nacteni dat a jejich zpracovani. Pokud ty ulohy rozdelis, kod se da zjednodusit a vystacis si s jednim vystupnim bodem a kdyz budes vedet jak na to, muzes se obejit i bez break.

Jistě, rozdělíme to, načteme data a pak je zpracujem. To je hezký, už jsi takhle načítal třeba několika gigový soubor? ;)

Ale dobře, rádi se tu necháme poučit, hoď sem aspoň pseudokód, jak ty úlohy rozdělit, kód zjednodušit, atd.

Citace
Tak, že nebudu program větvit na 150 if/else, aby celá funkce končila jedním returnem.
Pokud mas ve funkci 150 if/else, evidentne neco delas spatne. Ale zdraham se tu uvest stare dobre pravidlo, ze ve funkci by mely byt nanejvys tri nebo ctyri zanoreni if, for,... protoze nekterym by z toho mohla explodovat hlava.

Obvykle stačí dvě úrovně zanoření, když se else nepoužívá. Těch 150 if/else byla jistě nadsázka.
[/quote]

Díky, už jsem se lekl, že to nešlo poznat.  :D
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 16. 07. 2018, 08:23:00
Zacatecnik ma obvykle mnohem jine starosti. Vetsinou je rad, ze kod splnuje zadani. Ver mi, v praci delam code review i pro hodne zacinajici programatory.
Že je potřeba uzavírat zdroje (ať už třeba soubory, paměť nebo zámky) patří k tomu splnění zadání. Programátor se to musí naučit, ne spoléhat na pochybné pravidlo, že když funkce doběhne až do konce, zdroje se uzavřou samy (a vedle toho mít druhé pravidlo, že na konci funkce je potřeba zdroje vždy uzavřít). Ono pak úplně stačí, že ve funkci drží zámek, z ní zavolá jinou funkci, která bude na to zámku také záviset, a má hezký deadlock. A bude se strašně divit, jak mohlo k něčemu takovému dojít, vždyť volání funkce přece není žádný return

To je tvuj nazor, ale bavime-li se o strukturovanem programovani, tak tam opravdu prikazy skoku (at uz jsou pojmenovany jakkoliv) nepatri, protoze tyto konstrukty rozbiji co? Strukturu kodu!
Strukturovaný kód je strukturovaný, nikoli lineární. Z lineárního kódu se strukturovaný stane tak, že přidáte určité jasně definované skoky – podmínky (a cykly) a volání subrutin. Čistě lineárně bez jakýchkoli skoků byste toho moc nenaprogramoval.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kiwi 16. 07. 2018, 11:15:19
Při důsledném používání výjimek jsou stavy nepotřebné. Funkce vrací hodnotu. Procedura něco dělá, ale návratová hodnota je void. Místo chybových stavů se v obou případech použijí výjimky, které ten chybový stav popisují mnohem lépe, než pouhý návratový kód.
Lze to i otočit - při důsledném používání stavů jsou výjimky nepotřebné. Tím nechci říct, že výjimky jsou k ničemu, jen mi zrovna toto nepřijde jako ultimátní argument. Chybový stav může popsat návratový stav stejně dobře jako výjimka, jde jen o to udělat v tom systém, respektive "udělat dokumentaci".

Jistě, bývaly doby, kdy se výjimky nepoužívaly a také to fungovalo.

Ve výsledku je třeba ošetřit obojí - při použití výjimek vyřešit "chybu" a případně nahradit návratovou hodnotu nějakou smyslupnou - při použití návratových kódů je opět třeba to stejné. Upřímně moc ten rozdíl nevidím, jen se výrazně liší syntax, která je imho o kus komplikovanější. Nutno ale dodat, že nejvíce mám naprogramováno v Céčku a Haskellu, kdy v prvním výjimky úplně nejsou a v druhém jsou de facto jen v IO. :) Ale toto je asi na trochu jinou diskusi (které se nebráním, ba naopak!), tady jsme trochu OT. :)

Pokud z nějaké knihovny obdržím návratový kód, tak ho mohu zpracovat, ale také ignorovat. Když tento kód převedu na výjimku, což zpravidla znamená vytvořit objekt, do kterého se uloží všechny potřebné informace o chybě, tak takový objekt není možné ignorovat. Jinak propadne až ven z aplikace a vypíše se, co bylo příčinou pádu.

Syntaxe je záměrně jiná, výsledek je naopak mnohem jednodušší. Neošetřuje se jednotlivě každá výjimka, ale celá skupina. Není tedy třeba se po každém provedení příkazu ptát, zda proběhl v pořádku, což způsobovalo dlouhé špagety. Místo toho se udělá sekvence příkazů, ve které se výjimky ošetří společně. Není ani potřebné, aby výjimka byla ošetřena v metodě, ve které vznikla - je to spíš nežádoucí právě kvůli zjednodušení.
Ale já stále nechápu, proč by "chybový stav" měl být nějak privilegovaný oproti jakémukoli jinému "normálnímu" stavu. Řekl bych, že ten komunikační protokol tu byl zmíněn dost trefně - když mi nepřijde ACK, tak je to "chybový" stav, nebo "normální" stav? CRC error je chybový stav, nebo normální? NAK mám generovat v rámci "normální" reakce, nebo v nějakém catchi?

Takovouhle záležitost prostě vyřeším formou stavového automatu, v němž jsou si všechny stavy rovny, na každý se nějak reaguje, což má opět za následek změnu stavu. Když chci otevřít soubor, který neexistuje - proč bych to měl ošetřovat někde jinde? Když nedostanu požadovanou paměť, když v parseru detekuji syntax error, když uživatel nějakého kreslícího programu neuzavře uzavřenou křivku, když v nějakém formuláři klikne na cancel místo ok - jsou to chyby, nebo "normální" stavy?

Právě naopak - přes výjimky vzniká špagetový kód, protože narušují tok programu. Jsou to skoky, ale nejen uvnitř procedur, ale dokonce napříč mezi procedurami a úrovněmi! Už samotný název - výjimky... Co je na chybě výjimečného? Proč bych ji měl řešit někde jinde než tam, kde vznikla? V mém kódu jsou takové situace tak výjimečné, že přesně zapadají do "tolerovaného" použití goto.

Pokud chci ošetřovat chyby tak, jak se má, tak mi všelijaké ty try-catche akorát zkomplikují práci a znepřehlední program. Pokud na to kašlu a chyba mi propadne někam dál, těžko se z takového místa na ni dá adekvátně reagovat - co bude dělat nějaká abstraktní vrstva s low-level chybou? To už je celé pak spíš debugovací nástroj.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 16. 07. 2018, 11:53:47
Ale já stále nechápu, proč by "chybový stav" měl být nějak privilegovaný oproti jakémukoli jinému "normálnímu" stavu.
Protože se na něj reaguje úplně jinak, než na normální stav. Pokud je stav normální, pokračuje program normálně v běhu. Pokud je stav chybový, může se program pokusit z něj nějak zotavit a vrátit program do nějakého normálního (předchozího nebo základního) stavu.

Představte si to třeba na bezpečných systémech. Když zabezpečovací systém na soupravě metra detekuje, že došlo k překročení maximální povolené rychlosti, nemůže se to řešit jako ostatní stavy, kde se řeší optimalizace rychlosti vzhledem k profilu tratě, grafikonu, cílovému brzdění atd. – nemůže tam mezi tím vším být schovaná podmínka „jo a pokud je překročená maximální rychlost, asi by bylo fajn začít brzdit“. Ne, ten chybový stav musí mít před vším přednost, všechno ostatní se zahodí a začne se řešit ten chybový stav – maximálním brzděním. A řešení toho chybového stavu skončí až tehdy, když je systém v nějakém jasně definovaném bezpečném stavu. Což by mohl být třeba návrat pod křivku maximální rychlosti, ale třeba v pražském metru je ten bezpečný stav až úplné zastavení soupravy. Teprve když souprava stojí, vrátila se do bezpečného normálního stavu, zruší se řešení chybového stavu a je možné pokračovat normálním způsobem, tj. strojvedoucí může soupravu znovu rozjet.

Když chci otevřít soubor, který neexistuje - proč bych to měl ošetřovat někde jinde? Když nedostanu požadovanou paměť, když v parseru detekuji syntax error
Třeba proto, abyste tu chybu vůbec ošetřil. Nebo protože jí potřebujete ošetřit na místě, kde ji vůbec nějak ošetřit můžete – což vůbec nemusí být místo, kde vznikla. Výjimky vám nebrání ošetřit chybu hned v místě, kde vznikla – ale nenutí vás k tomu. Pochybuju, že doopravdy ošetřujete možné chyby všude tam, kde teoreticky mohou nastat. Třeba při alokaci paměti.
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 16. 07. 2018, 12:25:01
@balki, ded.kennedy:

Kašpárci, když už tady šaškujete se strukturovaným programováním, znáte i strukturogram?

Nás na průmce učili, že pokud se některá větev podmínky dotkne dolní hrany diagramu a nic nedělá (max. vrací nějakou hodnotu), můžeme tam natvrdo hodit return, protože to je to, co se doopravdy při jakékoliv konstrukci v programu po prohnání kompilátorem stane. A vo tom to celý je. Ne o nějakým dogmatu.

A pokud kompilátor hodí interně stejný kód pro return a pro jinou konstrukci, proč si tam přidávat další bloky a úrovně vnoření, který jsou přehledný jak Babišovy názory?
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 12:52:59
@balki, ded.kennedy:

Kašpárci, když už tady šaškujete se strukturovaným programováním, znáte i strukturogram?

Nás na průmce učili, že pokud se některá větev podmínky dotkne dolní hrany diagramu a nic nedělá (max. vrací nějakou hodnotu), můžeme tam natvrdo hodit return, protože to je to, co se doopravdy při jakékoliv konstrukci v programu po prohnání kompilátorem stane. A vo tom to celý je. Ne o nějakým dogmatu.

A pokud kompilátor hodí interně stejný kód pro return a pro jinou konstrukci, proč si tam přidávat další bloky a úrovně vnoření, který jsou přehledný jak Babišovy názory?

Tak, vas to na priemyslovke ucili? ;)   Ano, Nassi-Schniedermanove diagramy su velmi zriedka pouzivana technika modelovania algoritmov.  Raz to na nejakej prednaske vytiahol profesor, co robil kedysi s pocitacom Ural, ze aj take nieco bolo, pre zaujimavost.  Uz aj v tych casoch bol ale popularnejsi (dnes uz tiez zriedka pouzivany) flowchart.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 16. 07. 2018, 12:55:22
;)

A uz slubujem, ze v tomto topicu na nic nereagujem, nech si napise kto chce, co che. Nepotrebujem krmit trollov. (Nemyslim konkretne vas)
Název: Re:Jak můžu opustit funkci
Přispěvatel: . 16. 07. 2018, 13:16:15
Celková koncepce je postavená na tom, že každá komponenta (aplikace, objekt, metoda) má jeden vstup, jeden výstup a jeden chybový výstup. Vstupy se předávají přes parametry, výstupy jsou obecně objekty a chybovými výstupy chybové objekty, tedy výjimky. Pro každou z těchto tří kategorií jsou samostatné konstrukty - stačí je jen používat.

Při důsledném používání výjimek jsou stavy nepotřebné. Funkce vrací hodnotu. Procedura něco dělá, ale návratová hodnota je void. Místo chybových stavů se v obou případech použijí výjimky, které ten chybový stav popisují mnohem lépe, než pouhý návratový kód.
Tohle je možná fajn pro byznys logiku, ale zkuste takhle naprogramovat komunikační protokol.

Bez problémů.
Promiňte, já zapomněl, že pán je Brouk Pytlík.
Název: Re:Jak můžu opustit funkci
Přispěvatel: ded.kenedy 16. 07. 2018, 13:23:49
Citace
Jistě, rozdělíme to, načteme data a pak je zpracujem. To je hezký, už jsi takhle načítal třeba několika gigový soubor?

Pokud si vezmes ten kod z wiki, tak ten bude mit  s gigovym souborem stejny problem, jak kdyz to mas rozdelene. Navic ten kod budes mit hur srozumitelny a netestovatelny. Prestava me bavit bavit se s clovekem, ktery nad svymi argumenty ani nepremysli.

Citace
Programátor se to musí naučit, ne spoléhat na pochybné pravidlo,

Vy to teda dobre prozivate. Toto, jak ty rikas, pochybne pravidlo, je nekde na urovni zasad typu: "s nuzkami se nebeha" nebo "nikdy neolizuj nuz". Jsou tu pro to, aby si clovek zbytecne neublizil. Pokud to pravidlo cas od casu porusis, nemusi se nic stat, kdyz ale nastane problem, muze to byt sakra neprijemne. A puvodni prispevek byl toho dukazem.

Citace
že když funkce doběhne až do konce, zdroje se uzavřou samy (a vedle toho mít druhé pravidlo, že na konci funkce je potřeba zdroje vždy uzavřít).

Dobehnuti funkce do konce jako takove nezajisti nic, ale na smeruje programatora k tomu, aby se korektne vyporadal se vsemi pouzitymi prostredky. Stejne jako nebahni s nuzkami to nezajisti, ze si clovek neublizi, ale je velka sance, ze se to riziko znatelne snizi, zejmena u zacatecniku.

Citace
Z lineárního kódu se strukturovaný stane tak, že přidáte určité jasně definované skoky – podmínky (a cykly) a volání subrutin

To nekdo popira? Podminky a cykly jsou ale jasne definovane a citelne konstrukce. Kdyz do nich pridas break, continue nebo return, doplnis do nich jen jinak pojmenovane "goto", ktere uz pred padesati lety bylo "considered harmful".

Citace
Kašpárci, když už tady šaškujete se strukturovaným programováním, znáte i strukturogram

Vazne? V roce 2018? To nekdo dnes skutecne pouziva pri tvorbe programu? Uz v devadesatych letech to byla pomucka stezi pouzitelna ve vyuce.

Citace
A pokud kompilátor hodí interně stejný kód pro return a pro jinou konstrukci, proč si tam přidávat další bloky a úrovně vnoření, který jsou přehledný jak Babišovy názory?

Protoze primarni u kodu neni prelozeny strojak, ale jeho srozumitelnost a robustnost. Obavam se, ze mistni frajeri nejsou s to pobrat, ze tvorba programu saha dal nez je buseni kodu v editoru a dodrzovani specifikace jazyka.




Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 16. 07. 2018, 13:38:29
Ale já stále nechápu, proč by "chybový stav" měl být nějak privilegovaný oproti jakémukoli jinému "normálnímu" stavu. Řekl bych, že ten komunikační protokol tu byl zmíněn dost trefně - když mi nepřijde ACK, tak je to "chybový" stav, nebo "normální" stav? CRC error je chybový stav, nebo normální? NAK mám generovat v rámci "normální" reakce, nebo v nějakém catchi?

Záleží na typu komunikačního protokolu. Z transportní vrstvy bych měl obdržet celistvou zprávu, bez chyb. Pokud je v ní chyba, je to jasná výjimka. Pokud je chybný datový paket mezi transportní a síťovou vrstvou, je to jen stav, protože může běžně nastat.

Takovouhle záležitost prostě vyřeším formou stavového automatu, v němž jsou si všechny stavy rovny, na každý se nějak reaguje, což má opět za následek změnu stavu. Když chci otevřít soubor, který neexistuje - proč bych to měl ošetřovat někde jinde? Když nedostanu požadovanou paměť, když v parseru detekuji syntax error, když uživatel nějakého kreslícího programu neuzavře uzavřenou křivku, když v nějakém formuláři klikne na cancel místo ok - jsou to chyby, nebo "normální" stavy?

Řešit komunikační protokol stavovým automatem je v pořádku. Ovšem pokud chci otevřít neexistující soubor, tak ve zbytku modulu předpokládám, že je otevřený. Výjimka mi umožní ošetřit stejnou situaci v různých modulech společně o několik pater výš. O to bývá takové řešení propracovanější.

Uvedené stavy jsou výjimkami až na to "Cancel" ve formuláři. Pokud však ve formuláři, ve kterém je pouze "OK" a "Cancel", klikne na "Send", je to výjimka.

Právě naopak - přes výjimky vzniká špagetový kód, protože narušují tok programu. Jsou to skoky, ale nejen uvnitř procedur, ale dokonce napříč mezi procedurami a úrovněmi! Už samotný název - výjimky... Co je na chybě výjimečného? Proč bych ji měl řešit někde jinde než tam, kde vznikla? V mém kódu jsou takové situace tak výjimečné, že přesně zapadají do "tolerovaného" použití goto.

Pokud chyba vznikla například v modelu aplikace, kde není dostupná žádná operace pro výpis či logování této chyby, pošle se výjimka volajícímu modulu, který těmito nástroji již disponuje.

Pokud chci ošetřovat chyby tak, jak se má, tak mi všelijaké ty try-catche akorát zkomplikují práci a znepřehlední program. Pokud na to kašlu a chyba mi propadne někam dál, těžko se z takového místa na ni dá adekvátně reagovat - co bude dělat nějaká abstraktní vrstva s low-level chybou? To už je celé pak spíš debugovací nástroj.

Abstraktní vrstva low-level chybu zobrazí nebo zaloguje. Má k tomu vše potřebné. Bloků try-catch mám podstatně méně, než volání synchronních výjimek a přitom ošetřuji i asynchronní výjimky. Pokud někdo má každý throw obalený blokem try-catch, dělá to blbě.
Název: Re:Jak můžu opustit funkci
Přispěvatel: . 16. 07. 2018, 13:39:53
Na téhle diskusi je nejzajímavější to, že ještě stále existují fundamentalisté "strukturovaného kódu", kteří jsou ochotní bez jakéhokoliv kontextu popírat break nebo continue a trvat třeba na mnohonásobném zanoření nebo potřebě else, což je ve většině nových jazyků považováno za bad practice.

V prvním příspěvku zde sice byl zmíněn jazyk C, ale uvedení fundamentalisté pak už mydlili hlava nehlava. Skoro se nabízí  korelace mezi zvyšující se útočností a snižujícím se rozhledem. Protože pak by třeba tušili, že občas existují věci jako třeba defer, kdy většina jejich argumentů skončí v koši. Pak už nezbývá než jen zapojit dogmata o jediném opouštěcím bodě funkce. Amen
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 16. 07. 2018, 13:57:14
Celková koncepce je postavená na tom, že každá komponenta (aplikace, objekt, metoda) má jeden vstup, jeden výstup a jeden chybový výstup. Vstupy se předávají přes parametry, výstupy jsou obecně objekty a chybovými výstupy chybové objekty, tedy výjimky. Pro každou z těchto tří kategorií jsou samostatné konstrukty - stačí je jen používat.

Při důsledném používání výjimek jsou stavy nepotřebné. Funkce vrací hodnotu. Procedura něco dělá, ale návratová hodnota je void. Místo chybových stavů se v obou případech použijí výjimky, které ten chybový stav popisují mnohem lépe, než pouhý návratový kód.
Tohle je možná fajn pro byznys logiku, ale zkuste takhle naprogramovat komunikační protokol.

Bez problémů.
Promiňte, já zapomněl, že pán je Brouk Pytlík.

Právě na komunikační protokol se tohle hodí. Pokud jde o vrstvový model a v jedné vrstvě nastane problém, tak není potřeba zprávu zpracovávat v jiných vrstvách - pokud nesedne CRC, netřeba dekryptovat a rovnou se v obsluze výjimky vyžádá kopie poškozené zprávy...

Stavy se naopak starají o to, co je podstatný - pokud mám hlavičku, payload (variabilní délky) a ocásek s checksumem, tak stavový automat rozhoduje, jestli se chytá délka dat, délka hlavičky nebo délka ocásku. Nemusí se tam tahat chyby, ty jdou bokem.

-------

Pár komunikačních stacků jsem viděl. Nejčastější průšvih je neohlídání si něčeho (třeba buffer overflow). Třeba protokol měl pole pro délku dat 1 Byte (max. 255 znaků), nekontroloval meze a prostě přijatou délku nablil do bufferu 64B velkýho. Kdyby buffer byl standardní modul, který po zápisu víc než požadované hodnoty vyletí bez ohledu na to, jestli si nějaký expert validuje hlavičku... Bylo by to takový nějaký blbuvzdornější.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 16. 07. 2018, 14:04:40
To nekdo popira? Podminky a cykly jsou ale jasne definovane a citelne konstrukce. Kdyz do nich pridas break, continue nebo return, doplnis do nich jen jinak pojmenovane "goto", ktere uz pred padesati lety bylo "considered harmful".
Ano, popíráte to vy. Když tu chcete diskutovat o skocích v programu, a ještě prosazujete pravidla jako „žádný break“ a „return jedině na konci funkce“, měl byste si nejprve nastudovat základy. Podmínky a cykly jsou, vaší terminologií, „jen jinak pojmenované goto“ – při porovnávání s goto není vůbec žádný rozdíl mezi if, for, while, do/while a break, continue nebo return. Rozdíl mezi goto a uvedenými konstrukcemi je v tom, že goto může skákat odkudkoli kamkoli, zatímco uvedené konstrukce mají jasně definovaná pravidla, odkud kam se skáče. Tento rozdíl je zásadní, a pokud ho nevidíte nebo marginalizujete, nechápete podstatu toho, co je na goto špatně. „considered harmful“ se týká právě obecného goto, nevztahuje se na všechny skoky v programu, jak se tu mylně snažíte tvrdit. Jak už jsem psal, bez skoků byste toho moc nenaprogramoval – pokud takhle základní věc nevíte, tak se nepokoušejte v programování nikomu radit.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 14:11:13
Na téhle diskusi je nejzajímavější to, že ještě stále existují fundamentalisté "strukturovaného kódu", kteří jsou ochotní bez jakéhokoliv kontextu popírat break nebo continue a trvat třeba na mnohonásobném zanoření nebo potřebě else, což je ve většině nových jazyků považováno za bad practice.

V prvním příspěvku zde sice byl zmíněn jazyk C, ale uvedení fundamentalisté pak už mydlili hlava nehlava. Skoro se nabízí  korelace mezi zvyšující se útočností a snižujícím se rozhledem. Protože pak by třeba tušili, že občas existují věci jako třeba defer, kdy většina jejich argumentů skončí v koši. Pak už nezbývá než jen zapojit dogmata o jediném opouštěcím bodě funkce. Amen

inb4 cikada :)

Utocit zacal pan Jirsak a ten ma pomerne nonkonformne nazory, a nihilizuje pouzitie strukturovaneho programovania, lebo na nizkej urovni su riadiace prikazy aj tak skok.  U mna to bola jedna jedina veta, nez sa tu zacal festival nonkonformneho pristupu, korunovany petromM.  Opierat  nadradenost svojich nonkonformnych nazorov o nedostatok rozhladu inych je dost nestastne.  Tak isto, ako nazyvat best practices dogmami.  Best practices su na to, aby sa porusovali, ale nie z dovodu, ze "ucitel na priemyslovke povedal". Inak je to len take plkanie do vetra, na styl: "ja to tak robim". No tak si tak robte.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 16. 07. 2018, 14:11:31
Na téhle diskusi je nejzajímavější to, že ještě stále existují fundamentalisté "strukturovaného kódu", kteří jsou ochotní bez jakéhokoliv kontextu popírat break nebo continue a trvat třeba na mnohonásobném zanoření nebo potřebě else, což je ve většině nových jazyků považováno za bad practice.
Pozoruhodné je, jak to mají nepromyšlené – ale to je pro fundamentalisty typické. Argumentují tím, že všechny skoky jsou škodlivé – ale bez skoků by nic nenaprogramovali, tak se tváří, že jeden return ve funkci není žádný skok, zatímco dva returny ve funkci najednou jsou skoky. if pro ně není skok, break ve switchi také ne, ale break v cyklu najednou skok je. Prostě si vymyslí své nesmyslné krabičky, a realita se jim pak musí přizpůsobit.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 16. 07. 2018, 14:17:00
Utocit zacal pan Jirsak a ten ma pomerne nonkonformne nazory, a nihilizuje pouzitie strukturovaneho programovania, lebo na nizkej urovni su riadiace prikazy aj tak skok.
To se pletete, já jsem akorát vyvracel vaše bludy, a odpovídal jsem vám stejným tónem, jakým jste začal vy. Strukturované programování jsem nikdy nepopíral, popíral jsem vaše bludy, které se skutečným strukturovaným programováním nemají nic společného. Když své argumenty postavíte na tvrzení, že každý skok v programu je špatný, nedivte se, že vám někdo připomene, že součástí podmínka je i skok. break, continue i return jsou úplně stejné řídící příkazy, jako if nebo while, a do strukturovaného programování patří úplně stejně.
Název: Re:Jak můžu opustit funkci
Přispěvatel: LambdaBender 16. 07. 2018, 14:18:27
Na téhle diskusi je nejzajímavější to, že ještě stále existují fundamentalisté "strukturovaného kódu", kteří jsou ochotní bez jakéhokoliv kontextu popírat break nebo continue a trvat třeba na mnohonásobném zanoření nebo potřebě else, což je ve většině nových jazyků považováno za bad practice.

V prvním příspěvku zde sice byl zmíněn jazyk C, ale uvedení fundamentalisté pak už mydlili hlava nehlava. Skoro se nabízí  korelace mezi zvyšující se útočností a snižujícím se rozhledem. Protože pak by třeba tušili, že občas existují věci jako třeba defer, kdy většina jejich argumentů skončí v koši. Pak už nezbývá než jen zapojit dogmata o jediném opouštěcím bodě funkce. Amen

inb4 cikada :)

Utocit zacal pan Jirsak a ten ma pomerne nonkonformne nazory, a nihilizuje pouzitie strukturovaneho programovania, lebo na nizkej urovni su riadiace prikazy aj tak skok.  U mna to bola jedna jedina veta, nez sa tu zacal festival nonkonformneho pristupu, korunovany petromM.  Opierat  nadradenost svojich nonkonformnych nazorov o nedostatok rozhladu inych je dost nestastne.  Tak isto, ako nazyvat best practices dogmami.  Best practices su na to, aby sa porusovali, ale nie z dovodu, ze "ucitel na priemyslovke povedal". Inak je to len take plkanie do vetra, na styl: "ja to tak robim". No tak si tak robte.
Místní Brouk Pytlík opět promluvil :)
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 14:20:34
Utocit zacal pan Jirsak a ten ma pomerne nonkonformne nazory, a nihilizuje pouzitie strukturovaneho programovania, lebo na nizkej urovni su riadiace prikazy aj tak skok.
To se pletete, já jsem akorát vyvracel vaše bludy, a odpovídal jsem vám stejným tónem, jakým jste začal vy. Strukturované programování jsem nikdy nepopíral, popíral jsem vaše bludy, které se skutečným strukturovaným programováním nemají nic společného. Když své argumenty postavíte na tvrzení, že každý skok v programu je špatný, nedivte se, že vám někdo připomene, že součástí podmínka je i skok. break, continue i return jsou úplně stejné řídící příkazy, jako if nebo while, a do strukturovaného programování patří úplně stejně.

Ok, mate pravo na svoj nonkonfromny nazor, zijeme v demokracii.
Název: Re:Jak můžu opustit funkci
Přispěvatel: ded.kenedy 16. 07. 2018, 14:29:29
Citace
Na téhle diskusi je nejzajímavější to, že ještě stále existují fundamentalisté "strukturovaného kódu"

Nebo existuji lidi, kteri i dnes vidi zbytecne chyby, protoze realni programatori obcas neco nedomysli, pricemz vi, ze reseni existuje.

Citace
trvat třeba na mnohonásobném zanoření nebo potřebě else, což je ve většině nových jazyků považováno za bad practice.

Mas pravda, proto nove jazyky smeruji od if-statement k if-expression.

Citace
Ano, popíráte to vy.

Tak to opravdu ne.

Citace
nevidíte nebo marginalizujete, nechápete podstatu toho, co je na goto špatně

Ja podstatu moc dobre chapu, a taky chapu, ze neni svet cernobily a jsou konstrukce, jejich pouziti je vhodne, ktere nevhodne, a ktere vhodne v nekterych pripadech. Ale diskutovat s lidmi, kteri vidi svet tak, ze je neco "ciste zlo", nebo "ciste dobro" pro me prestava byt prinosne a zajimave.

Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 16. 07. 2018, 14:30:51
Navic ten kod budes mit hur srozumitelny a netestovatelny.

Naopak. Pokud máš hierarchii nějakých částí kódu (file systém -> buffer -> parser -> ...) a přeteče ti buffer při testu parseru, parser přitom bere jenom konkrétní velikost bufferu, tak problém s bufferem nevidíš. Pokud ti vyskočí výjimka "Buffer overflow: 4096B available, 4100B used", tak víš, že je někde něco zhnilýho, co bys bez výjimky neviděl.

Vy to teda dobre prozivate. Toto, jak ty rikas, pochybne pravidlo, je nekde na urovni zasad typu: "s nuzkami se nebeha" nebo "nikdy neolizuj nuz". Jsou tu pro to, aby si clovek zbytecne neublizil. Pokud to pravidlo cas od casu porusis, nemusi se nic stat, kdyz ale nastane problem, muze to byt sakra neprijemne. A puvodni prispevek byl toho dukazem.

Děcku jsem nikdy neříkal "s nůžkami se neběhá", ale "pozor, nůžky jsou ostrý a pokud s nima budeš běhat, tak se na ně napíchneš". Ty tady papouškuješ nějaký pravidlo bez uvedení, proč to tak je.

Dobehnuti funkce do konce jako takove nezajisti nic, ale na smeruje programatora k tomu, aby se korektne vyporadal se vsemi pouzitymi prostredky. Stejne jako nebahni s nuzkami to nezajisti, ze si clovek neublizi, ale je velka sance, ze se to riziko znatelne snizi, zejmena u zacatecniku.

To je specifický případ, který můžeš řešit jinak. Třeba pravidlem "wrapperu se zdroji" - máš "čistou" funkci, ze které můžeš kdykoliv vypadnout. Zdroje se alokují/dealokují ve volající funkci (např. GCC inlinuje statickou funkci v rámci modulu, takže je to čitelnější a bez overheadu) a zdroj se uvolní, jak vypadneš z funkce. Pak tvá argumentace neuvolněním zdrojů ztratí smysl.

Máš tam ještě něco?

Podminky a cykly jsou ale jasne definovane a citelne konstrukce. Kdyz do nich pridas break, continue nebo return, doplnis do nich jen jinak pojmenovane "goto", ktere uz pred padesati lety bylo "considered harmful".

Ne. Schválně si zkus hodit break nebo continue do bloku if a uvidíš, co se stane.
Pak si zkus hodit  continue někam do bloku switch.

Break/continue jsou legitimní konstrukce pro řízení toku cyklu. Proto tam projdou a jinde ne. Nemůžu za to, že jsi je ještě nepochopil.

Nechci vidět, jestli chápeš obyčejný cyklus for v C.

To nekdo dnes skutecne pouziva pri tvorbe programu? Uz v devadesatych letech to byla pomucka stezi pouzitelna ve vyuce.

To je možná ta chyba. Člověk některý věci líp pochopí, když mu je názorně někdo ukáže. Rozhodně je to lepší, než když mu někdo napíše na papírek desatero a neřekne, co přesně znamená "nesesmilníš", protože o tom se přece nemluví.

Protoze primarni u kodu neni prelozeny strojak, ale jeho srozumitelnost a robustnost. Obavam se, ze mistni frajeri nejsou s to pobrat, ze tvorba programu saha dal nez je buseni kodu v editoru a dodrzovani specifikace jazyka.

V tom případě, co je nepřehlednýho na tomhle?
Kód: [Vybrat]
for(;;) { 
   char c = putch();
   if(c > 127) continue; // Podporujeme jenom ASCII, ostatni znaky mame ignorovat
   ...
}

Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 16. 07. 2018, 14:38:34
Ok, mate pravo na svoj nonkonfromny nazor, zijeme v demokracii.
Není nic nekonformního na tom, když o vašich bludech veřejně prohlásím, že jsou to bludy. Vaše snaha vytvářet dojem, že tu píšete všeobecně uznávané věci, je sice hezká, ale bohužel pro vás se nezakládá na pravdě. Jak jste nakonec ukázal i vy sám, když jste musel uznat, že vaše tvrzení „všechny skoky jsou špatné“ je nesmyslné, a snažil jste se to okecat, že jste samozřejmě myslel „všechny skoky jsou špatné, s výjimkou skoků, které jsou dobré“. Tohle upřesněné tvrzení už sice je pravdivé, akorát říká úplnou banalitu.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 16. 07. 2018, 14:42:43
taky chapu, ze neni svet cernobily a jsou konstrukce, jejich pouziti je vhodne, ktere nevhodne, a ktere vhodne v nekterych pripadech. Ale diskutovat s lidmi, kteri vidi svet tak, ze je neco "ciste zlo", nebo "ciste dobro" pro me prestava byt prinosne a zajimave.
Že vícenásobný return, break nebo continue jsou čisté zlo jste tu tvrdil vy a balki, ostatní vám to vyvraceli, že takhle černobílé to není. Je fajn, že ta diskuse k něčemu byla, když jste otočil o 180 stupňů.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 14:49:50
Ok, mate pravo na svoj nonkonfromny nazor, zijeme v demokracii.
Není nic nekonformního na tom, když o vašich bludech veřejně prohlásím, že jsou to bludy. Vaše snaha vytvářet dojem, že tu píšete všeobecně uznávané věci, je sice hezká, ale bohužel pro vás se nezakládá na pravdě. Jak jste nakonec ukázal i vy sám, když jste musel uznat, že vaše tvrzení „všechny skoky jsou špatné“ je nesmyslné, a snažil jste se to okecat, že jste samozřejmě myslel „všechny skoky jsou špatné, s výjimkou skoků, které jsou dobré“. Tohle upřesněné tvrzení už sice je pravdivé, akorát říká úplnou banalitu.

Vy mate trosku problem s rozlisenim vyssej a nizsej urovne programovania. Je mozne programovat aj priamo v assembleri, kde skoky su dost dolezite instrukcie, ale od toho je kompilator, aby taky kod vytvoril.  Uz kompilator rozhodne, ze ci nejaky for cyklus bude realizovany cez skok, alebo proste skonstatuje, ze vsetky opakovania zrealizuje sekvencne za sebou. (lebo je ich malo a vie konkretne povedat, co sa bude vykonavat). Alebo nejaky if proste vyhodi, lebo sa nikdy nevykona.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 14:56:59
taky chapu, ze neni svet cernobily a jsou konstrukce, jejich pouziti je vhodne, ktere nevhodne, a ktere vhodne v nekterych pripadech. Ale diskutovat s lidmi, kteri vidi svet tak, ze je neco "ciste zlo", nebo "ciste dobro" pro me prestava byt prinosne a zajimave.
Že vícenásobný return, break nebo continue jsou čisté zlo jste tu tvrdil vy a balki, ostatní vám to vyvraceli, že takhle černobílé to není. Je fajn, že ta diskuse k něčemu byla, když jste otočil o 180 stupňů.

Ciste zlo vyzera inak, pouzitie break, continue, goto, viacej return-ov moze byt obcas "ciste dobro", ak nie je ine vychodisko z nudze.

Nie som si vedomy pouzitia vyrazu "ciste zlo".
Název: Re:Jak můžu opustit funkci
Přispěvatel: x14 16. 07. 2018, 15:08:17
Bože už zas?
Použití break, continue, goto a return je v C naprosto normální!
Prosim vás, už nekrmete ty trolly.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 16. 07. 2018, 15:40:43
Vy mate trosku problem s rozlisenim vyssej a nizsej urovne programovania. Je mozne programovat aj priamo v assembleri, kde skoky su dost dolezite instrukcie, ale od toho je kompilator, aby taky kod vytvoril.  Uz kompilator rozhodne, ze ci nejaky for cyklus bude realizovany cez skok, alebo proste skonstatuje, ze vsetky opakovania zrealizuje sekvencne za sebou. (lebo je ich malo a vie konkretne povedat, co sa bude vykonavat). Alebo nejaky if proste vyhodi, lebo sa nikdy nevykona.
Přestaňte hledat problémy u jiných, sám jich máte s programováním dost a dost – takže začněte u sebe. Odrolování smyčky je optimalizace kompilátoru, je to speciální případ – a v tomto speciálním případě opravdu není pro implementaci cyklu potřeba skok. Vyhození ifu je opět optimalizace kompilátoru, navíc ještě v případě chybně napsaného programu, protože když se ten if nikdy nevykoná, neměl by vůbec ve zdrojáku být.

Ciste zlo vyzera inak, pouzitie break, continue, goto, viacej return-ov moze byt obcas "ciste dobro", ak nie je ine vychodisko z nudze.
Hlavně ale použití break, continue nebo více returnů může být úplně normální konstrukce – žádné východisko z nouze, ale prostě nejlepší možné řešení daného problému.
Název: Re:Jak můžu opustit funkci
Přispěvatel: x14 16. 07. 2018, 15:44:19
Ok, takže znovu: Prosím vás, už nekrmte ty trolly.
Název: Re:Jak můžu opustit funkci
Přispěvatel: hovnex 16. 07. 2018, 15:58:16
Ok, takže znovu: Prosím vás, už nekrmte ty trolly.

Proč? Je to sranda, Jirsák jim docela dává :D
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 15:58:27
Vy mate trosku problem s rozlisenim vyssej a nizsej urovne programovania. Je mozne programovat aj priamo v assembleri, kde skoky su dost dolezite instrukcie, ale od toho je kompilator, aby taky kod vytvoril.  Uz kompilator rozhodne, ze ci nejaky for cyklus bude realizovany cez skok, alebo proste skonstatuje, ze vsetky opakovania zrealizuje sekvencne za sebou. (lebo je ich malo a vie konkretne povedat, co sa bude vykonavat). Alebo nejaky if proste vyhodi, lebo sa nikdy nevykona.
Přestaňte hledat problémy u jiných, sám jich máte s programováním dost a dost – takže začněte u sebe. Odrolování smyčky je optimalizace kompilátoru, je to speciální případ – a v tomto speciálním případě opravdu není pro implementaci cyklu potřeba skok. Vyhození ifu je opět optimalizace kompilátoru, navíc ještě v případě chybně napsaného programu, protože když se ten if nikdy nevykoná, neměl by vůbec ve zdrojáku být.

Takze prave ste napisali, ze su pripady, ked kompilator riadiace prikazy ako skoky neskompiluje. Mozete vratit diplom ak nejaky mate  :'(.  Argumentacia straw-manom ide aj mne.  Som z tohto roota celkom smutny. :'(
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 16:00:58
Ok, takže znovu: Prosím vás, už nekrmte ty trolly.

Proč? Je to sranda, Jirsák jim docela dává :D

Skor by to nezainteresovanemu citatelovi mohlo pripadat ako cripple fight.
Název: Re:Jak můžu opustit funkci
Přispěvatel: x14 16. 07. 2018, 16:05:45
Ok, takže znovu: Prosím vás, už nekrmte ty trolly.

Proč? Je to sranda, Jirsák jim docela dává :D
Jeho práci většinou oceňuji, ale ne v tomto případě. Zde je to zbytečné. Opakuji, je to zbytečné.
Jen se tak dostává více prostoru nekonečným blábolům o programování ve stavu nejhorší nouze.
Doufám, že to nečte původní tazatel, jinak se programovat nikdy nenaučí.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 16:11:38
Ok, takže znovu: Prosím vás, už nekrmte ty trolly.

Proč? Je to sranda, Jirsák jim docela dává :D
Jeho práci většinou oceňuji, ale ne v tomto případě. Zde je to zbytečné. Opakuji, je to zbytečné.
Jen se tak dostává více prostoru nekonečným blábolům o programování ve stavu nejhorší nouze.
Doufám, že to nečte původní tazatel, jinak se programovat nikdy nenaučí.

Ak si povodny "tazatel" zabezpeci nejake formalne vzdelanie ohladom algoritmizacie, moze si spravit nazor o "blabolech" sam. Pochybujem, ze by nieco taketo mohlo niekomu uskodit. Teda okrem mna, zbytoce prokrastinujem.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 16. 07. 2018, 16:28:09
Takze prave ste napisali, ze su pripady, ked kompilator riadiace prikazy ako skoky neskompiluje. Mozete vratit diplom ak nejaky mate  :'(.  Argumentacia straw-manom ide aj mne.  Som z tohto roota celkom smutny. :'(
Ano, předvedl jste teď krásný příklad podsunutého argumentu – já jsem až do reakce na váš úhybný komentář o kompilátorech vůbec nic nepsal. Nicméně já jsem vám žádné argumenty nepodsouval – že break nebo continue jsou jenom skryté goto jste vy napsal, stejně jako jste napsal, že jakékoli goto je zlo. Byly to totiž jediné vaše „argumenty“ proti používání break, continue nebo vícenásobného return.

vodny "tazatel" zabezpeci nejake formalne vzdelanie ohladom algoritmizacie, moze si spravit nazor o "blabolech" sam. Pochybujem, ze by nieco taketo mohlo niekomu uskodit. Teda okrem mna, zbytoce prokrastinujem.
Vy zřejmě nějaké formální vzdělání ohledně algoritmizace máte, ale k rozpoznávání blábolů o programování vám to zjevně nepomohlo (pokud opravdu nejste troll, který bláboly píše záměrně).
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 18:11:52
vodny "tazatel" zabezpeci nejake formalne vzdelanie ohladom algoritmizacie, moze si spravit nazor o "blabolech" sam. Pochybujem, ze by nieco taketo mohlo niekomu uskodit. Teda okrem mna, zbytoce prokrastinujem.
Vy zřejmě nějaké formální vzdělání ohledně algoritmizace máte, ale k rozpoznávání blábolů o programování vám to zjevně nepomohlo (pokud opravdu nejste troll, který bláboly píše záměrně).

Zasa ste to zle pochopili, ako tradicne. Nejde o to, ci balki napise toto, a Jirsak napise hento. Hlavne je, si spravit informovany nazor.

Len som nevedel, ze sa na root.cz jedna z najklasickejsich paradigiem povazuje za "blaboly".
Clovek sa nenauci tak kodit, ze sedi po tme v pivnici s manualom od jazyka.  Potom je nekriticky a prijima zdanlive autority ako hlasatelov pravdy.  Treba si svoje odsediet, pocuvnut nazory a vediet si svoje obhajit.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 16. 07. 2018, 18:23:32
Treba si svoje odsediet, pocuvnut nazory a vediet si svoje obhajit.

S čímž tu vy fanatici máte problém. Pořád bych rád viděl čistší řešení toho primitivního mainu.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 18:40:53
Treba si svoje odsediet, pocuvnut nazory a vediet si svoje obhajit.

S čímž tu vy fanatici máte problém. Pořád bych rád viděl čistší řešení toho primitivního mainu.

To je problem ten, ze ja nie som fanatik. Ale zrovna main metody byvaju tak jednoduche, ze to ide spravit.

Spravim kontrolu, ci su vstupne parametre ok.

Ak ano spustim korektnu vetvu, inac spustim chybovu vetvu. Ktora informuje pouzivatela podrobnejsie o chybe.

Na konci spravim exit.

A co? Ak to chcete robit inak, robte si to inak.
Název: Re:Jak můžu opustit funkci
Přispěvatel: ded.kenedy 16. 07. 2018, 19:12:05
Citace
Že vícenásobný return, break nebo continue jsou čisté zlo jste tu tvrdil vy a balki, ostatní vám to vyvraceli

Ale kdepak. Ja jsem to formuloval jako vicemene nepsana, lety osvedcena, pravidla pro pekny strukturovany kod. To ostatni, vcetne tve malickosti, z toho zacali delat dogmata, pseudopravidla a nejvetsi nestesti na teto planete hned po globalnim oteplovani.

Citace
Ty tady papouškuješ nějaký pravidlo bez uvedení, proč to tak je.

A dal sis praci precist muj puvodni prispevek? Pripomenu:

Citace
Paradoxni je, ze hned ve druhem prispevku (a byl to vlastne duvod dotazu jako takoveho) jde videt, k cemu muze nedomyslene predcasne opusteni funkce returnem vest, tj. resource leaky, nedefinovane stavy, visici zamky...

Zacinajici programator, stejne jako behajici dite, takove veci nemusi hned napoprve domyslet.

Je zajimave, ze vsichni mistni machri neustale mlcky prechazi problem puvodniho tazatele a ignoruji skutecnost, ze kdyby nepouzil predcasne vyskoceni z funkce, problem by proste nebyl.

Pokud se nachazim ve spolecnosti (jmenovite PetrM a Cikada), kde je i zasada, ze funkce by mela delat prave jednu vec, povazovana za vadnou, chapu, ze v takovem pripade jsou jakekoliv diskuze o kvalitnim ci hezkem kodu uplne zbytecne.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 16. 07. 2018, 19:26:38
Pokud se nachazim ve spolecnosti (jmenovite PetrM a Cikada), kde je i zasada, ze funkce by mela delat prave jednu vec, povazovana za vadnou, chapu, ze v takovem pripade jsou jakekoliv diskuze o kvalitnim ci hezkem kodu uplne zbytecne.

Citation needed, nemám rád lháře. :)

Jinak obecně rada, nauč se číst (tj. opravdu chápat psaný text), pak si pročti tu diskusi znovu a pokud se nepropadneš hanbou, tak odpověz na těch pár primitivních otázek.
Název: Re:Jak můžu opustit funkci
Přispěvatel: ded.kenedy 16. 07. 2018, 19:42:58
Citace
Citation needed, nemám rád lháře.

viz https://forum.root.cz/index.php?topic=18986.msg274495#msg274495 a sarkasticka poznamka:

Citace
Jistě, rozdělíme to, načteme data a pak je zpracujem. To je hezký, už jsi takhle načítal třeba několika gigový soubor? ;)

Citace
Jinak obecně rada, nauč se číst (tj. opravdu chápat psaný text), pak si pročti tu diskusi znovu a pokud se nepropadneš hanbou

Zamet si pred vlastnim prahem.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 16. 07. 2018, 19:57:46
Citace
Citation needed, nemám rád lháře.

viz https://forum.root.cz/index.php?topic=18986.msg274495#msg274495 a sarkasticka poznamka:

Citace
Jistě, rozdělíme to, načteme data a pak je zpracujem. To je hezký, už jsi takhle načítal třeba několika gigový soubor? ;)

A kde vidíš, že píšu, že zásada "funkce má dělat jednu věc" je vadná ? :D :D

Citace
Jinak obecně rada, nauč se číst (tj. opravdu chápat psaný text), pak si pročti tu diskusi znovu a pokud se nepropadneš hanbou

Zamet si pred vlastnim prahem.

Stále čisto, co tam máš dál? Krom vyhýbání se otázkám?
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 16. 07. 2018, 20:32:23
Len som nevedel, ze sa na root.cz jedna z najklasickejsich paradigiem povazuje za "blaboly".
Už jste s těmi manipulacemi otravný. Nikdo tu nepovažuje za bláboly jedno z nejklasičtějších paradigmat, za bláboly označuju pouze vaši velmi svéráznou interpretaci tohoto paradigmatu. Přičemž o její svéráznosti svědčí už jenom to, kolikrát jste musel svá tvrzení vzít zpět (ve vašem podání to tedy byly jen výmluvy, že jste to tak nemyslel) –  např. že break slouží k opuštění funkce, nebo break ve switchi.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 16. 07. 2018, 20:42:47
Ale kdepak. Ja jsem to formuloval jako vicemene nepsana, lety osvedcena, pravidla pro pekny strukturovany kod. To ostatni, vcetne tve malickosti, z toho zacali delat dogmata, pseudopravidla a nejvetsi nestesti na teto planete hned po globalnim oteplovani.
Dogma z toho dávno před vámi udělal balki. Vy jste byl mírnější, označujete to jen za pravidla pro pěkný kód – jenže ani to není pravda. Na použití break nebo continue nebo na použití vícenásobného returnu není a priori nic ošklivého. Ano, dá se to použít ošklivě, jako každá konstrukce, a stejně tak existují konstrukce, kde je takové použití přirozené a vede to na pěkný strukturovaný kód – a pokoušet se těm konstrukcím vyhnout by ten kód jen znepřehlednilo.

Zacinajici programator, stejne jako behajici dite, takove veci nemusi hned napoprve domyslet.
Ovšem nijak mu nepomůže zavádět ho do slepých uliček tím, že budete tvrdit, že problém je jinde, než ve skutečnosti je.

Je zajimave, ze vsichni mistni machri neustale mlcky prechazi problem puvodniho tazatele a ignoruji skutecnost, ze kdyby nepouzil predcasne vyskoceni z funkce, problem by proste nebyl.
Vy jste mu snad radil, než se tady zeptal, ne? Tazatel původně hledal problém ve vyskočení z funkce, tak také formuloval svůj dotaz – a po několika dotazech na podrobnosti se ukázalo, že problém vůbec není ve vyskočení z funkce, ale ve způsobu, jak tazatel používá zámky. Z toho, ke je vlastně problém, byl tazatel zmatený dost, nemusíte ten jeho zmatek ještě podporovat.

Pokud se nachazim ve spolecnosti (jmenovite PetrM a Cikada), kde je i zasada, ze funkce by mela delat prave jednu vec, povazovana za vadnou
To jsem asi přehlédl, pomohlo by, kdybyste přidal odkazy.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 20:52:48
Jirsaku, dogma ste si z toho vytvorili vy.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 21:36:32
Len som nevedel, ze sa na root.cz jedna z najklasickejsich paradigiem povazuje za "blaboly".
Už jste s těmi manipulacemi otravný. Nikdo tu nepovažuje za bláboly jedno z nejklasičtějších paradigmat, za bláboly označuju pouze vaši velmi svéráznou interpretaci tohoto paradigmatu. Přičemž o její svéráznosti svědčí už jenom to, kolikrát jste musel svá tvrzení vzít zpět (ve vašem podání to tedy byly jen výmluvy, že jste to tak nemyslel) –  např. že break slouží k opuštění funkce, nebo break ve switchi.

Takze vlastne budeme pouzivat strukturovane programovanie tak, ze poprieme cyklus, vetvenie a sekvenciu.  Cize cyklus nie je cyklus, ale len tak ho v polke sekneme breakom, miesto miesta, kde sa ma.(lebo kod je dlhy, naco by sme vytvarali dalsie procedury) A je to vpohode, lebo c-cko a java napriklad obsahuje break vo switchi.(Co je jazykovo specificke a sposobuje to bugy) Trosku preskocime nieco s goto, vsak nic sa nedeje. A mame 10 returnov z  funkcie, aby smudla hladal, ze ktory to bol. Potom odchytime vynimku na poslednom moznom mieste, lebo zvysny kod nie je dolezity a koder si moze dohladavat, preco sa veci nevykonali. Vsak kompilator to vsetko aj tak prelozi na skok.  If je aj tak skok, dame tam goto.  Ano, je to ono, vlastne mate pravdu, to len ja zle interpretujem.  (To bola ironia). Podla mna mate v hlave len nejaky neurcity obraz o strukturovanom programovani. Aby ste boli kludny, nazvem to "Jirsakove strukturovane programovanie", aby sa to neplietlo.
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 16. 07. 2018, 21:41:08
Vy mate trosku problem s rozlisenim vyssej a nizsej urovne programovania. Je mozne programovat aj priamo v assembleri, kde skoky su dost dolezite instrukcie, ale od toho je kompilator, aby taky kod vytvoril.  Uz kompilator rozhodne, ze ci nejaky for cyklus bude realizovany cez skok, alebo proste skonstatuje, ze vsetky opakovania zrealizuje sekvencne za sebou. (lebo je ich malo a vie konkretne povedat, co sa bude vykonavat). Alebo nejaky if proste vyhodi, lebo sa nikdy nevykona.
Přestaňte hledat problémy u jiných, sám jich máte s programováním dost a dost – takže začněte u sebe. Odrolování smyčky je optimalizace kompilátoru, je to speciální případ – a v tomto speciálním případě opravdu není pro implementaci cyklu potřeba skok. Vyhození ifu je opět optimalizace kompilátoru, navíc ještě v případě chybně napsaného programu, protože když se ten if nikdy nevykoná, neměl by vůbec ve zdrojáku být.

Všimni si jedné věci.
- Pokud v programu opakuješ jednu věc nad stejným typem dat, vypatí se udělat funkci a testovt/ladit to jenom jednou.
- Pokud je to krátký, tak se vyplatí z toho udělat inline funkci - vloží se bez šaškáren s ukládáním registrů a s -o0 se dá krásně ladit, narozdíl od funkčního makra.
- to samý platí pro krátkou statickou funkci uvnitř souboru .c
- Pokud je v takové funkci podmínka a parametr funkce je konstanta, může podmínku vyhodnotit už kompilátor a použít jenom tu část, která se využije.

Takže co je špatně? Dát opakovanou funkcionalitu do funkce? Používat inline funkce? Volat statickou nebo inline funkci s konstantním parametrem? Nebo dávat do funkce podmínky? Nebo se snad nesmí kompilátoru povolovat optimalizace? Nebo která kombinace je vlastně blbě? Podmínka sem, podmínka tam, hlavně jak to kompilátor nacpe do FLASHky a dělá to, co od toho čekáš.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 16. 07. 2018, 21:51:55
Takze vlastne budeme pouzivat strukturovane programovanie tak, ze poprieme cyklus, vetvenie a sekvenciu.

Ne, to my nepopíráme, právě naopak.

Cize cyklus nie je cyklus, ale len tak ho v polke sekneme breakom, miesto miesta, kde sa ma.

A kde je to "miesto, kde sa ma"? Absolutně triviální příklad. Mám pole, které ve for cyklu procházím po prvcích hledajíc jeden určitý. Když ho najdu na n/4. indexu, má smysl pokračovat dál až do ntého prvku? Nemá. Třeba poznačím index a break, nic špatného na tom není, naopak je žádoucí nepokračovat dál.

A je to vpohode, lebo c-cko a java napriklad obsahuje break vo switchi.(Co je jazykovo specificke a sposobuje to bugy)

Bugy způsobují v naprosté většine případů programátoři. Zajímalo by mě, co je na "breaku vo switchi" špatného.

Trosku preskocime nieco s goto, vsak nic sa nedeje.

Pokud je to s mírou a opravdu oprávněné použití - typicky ošetření chyb v C, tak není problém. Ale to už je vyšší dívčí, o tom řeč nebyla.


A mame 10 returnov z  funkcie, aby smudla hladal, ze ktory to bol.

Ne, máme tolik returnů, kolik dává smysl a zpřehledňuje kód.

Potom odchytime vynimku na poslednom moznom mieste, lebo zvysny kod nie je dolezity a koder si moze dohladavat, preco sa veci nevykonali. Vsak kompilator to vsetko aj tak prelozi na skok.

Tohle už je čirá demagogie, tohle nikdo netvrdil, tak netroll.

If je aj tak skok, dame tam goto.  Ano, je to ono, vlastne mate pravdu, to len ja zle interpretujem.  (To bola ironia).

Bez ironie, opravdu to špatně interpretuješ. Je rozdíl mezi podmíněným a nepodmíněným skokem (a tudíž nejsou ekvivalentní - ani to tu nikdo netvrdil, pokud si pamatuji správně), na výšce se to učí hned v prvním semestru.

Podla mna mate v hlave len nejaky neurcity obraz o strukturovanom programovani. Aby ste boli kludny, nazvem to "Jirsakove strukturovane programovanie", aby sa to neplietlo.

Možná trošku vypustit, uklidnit se a přečíst si, co píše. Má to hlavu a patu, což se o tvých příspěvcích v tomto vlákně většinou říct nedá.
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 16. 07. 2018, 21:52:41
To je problem ten, ze ja nie som fanatik. Ale zrovna main metody byvaju tak jednoduche, ze to ide spravit.

Spravim kontrolu, ci su vstupne parametre ok.

Ak ano spustim korektnu vetvu, inac spustim chybovu vetvu. Ktora informuje pouzivatela podrobnejsie o chybe.

Na konci spravim exit.

A co? Ak to chcete robit inak, robte si to inak.
Jinak řečeno:

Kód: [Vybrat]
int main(args) {
  if(!argValid(arg)) return -1; // Chybne parametry
  progInit(args);  // Inicializace programu
  for(;;) { // Hlavni smycka
    if(isEnd()) break;
    process(args);
  }
  progDeInit();
  return 0;
}
nebo něco podobnýho...
Název: Re:Jak můžu opustit funkci
Přispěvatel: ded.kenedy 16. 07. 2018, 22:06:25
Tak puvodne jsem do teto diskuze nechtel prispivat, protoze je to zbytecne, ale toto jsem si nemohl nechat ujit. Kdyz se ten kod od PetrM prepise bez break a if-return, cte se to od shora dolu jako pohadka.

Kód: [Vybrat]
int main(args) {
  if (argValid(arg)) {
     progInit(args);     // Inicializace programu
     while (!isEnd()) {  // Hlavni smycka
       process(args);
     }
     progDeInit();
     return 0;
  } else {
    return -1; // Chybne parametry
  }
}

Laskavy ctenar si udela obrazek sam, ktery kod mu prijde hezci a srozumitelnejsi.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 22:15:44
A kde je to "miesto, kde sa ma"? Absolutně triviální příklad. Mám pole, které ve for cyklu procházím po prvcích hledajíc jeden určitý. Když ho najdu na n/4. indexu, má smysl pokračovat dál až do ntého prvku? Nemá. Třeba poznačím index a break, nic špatného na tom není, naopak je žádoucí nepokračovat dál.

V podmienke cyklu je to miesto.  Ale v tomto trivialnom priklade, je to hadam aj jedno. Horsie, ak by si niekto ten break nevsimol  a potom by uz mohol len debugovat, preco sa mu nejaky kod nevykonava.

A je to vpohode, lebo c-cko a java napriklad obsahuje break vo switchi.(Co je jazykovo specificke a sposobuje to bugy)

Bugy způsobují v naprosté většine případů programátoři. Zajímalo by mě, co je na "breaku vo switchi" špatného.

Ano pouzil som metonymiu, bugy skutocne sposobuju programatori. Ale switch s break je na to akosi nachylnejsi. Bud je moznost break zabudnut tam napisat, alebo niekto hyperaktivny ho zasa prida na miesto, kde nema byt. (Ked sa povodne malo vykonat viacej case-ov za sebou )

Trosku preskocime nieco s goto, vsak nic sa nedeje.

Pokud je to s mírou a opravdu oprávněné použití - typicky ošetření chyb v C, tak není problém. Ale to už je vyšší dívčí, o tom řeč nebyla.

Ano, to je pravda, je to dobra vec, len goto nie je strukturovane programovanie.  Problemy s goto stali za vznikom strukturovaneho programovania.

A mame 10 returnov z  funkcie, aby smudla hladal, ze ktory to bol.

Ne, máme tolik returnů, kolik dává smysl a zpřehledňuje kód.

Idealne jeden. Fowler vravi inak.

Potom odchytime vynimku na poslednom moznom mieste, lebo zvysny kod nie je dolezity a koder si moze dohladavat, preco sa veci nevykonali. Vsak kompilator to vsetko aj tak prelozi na skok.

Tohle už je čirá demagogie, tohle nikdo netvrdil, tak netroll.

Ok, sorry, to tvrdil Kit, dohladal som si to.


If je aj tak skok, dame tam goto.  Ano, je to ono, vlastne mate pravdu, to len ja zle interpretujem.  (To bola ironia).

Bez ironie, opravdu to špatně interpretuješ. Je rozdíl mezi podmíněným a nepodmíněným skokem (a tudíž nejsou ekvivalentní - ani to tu nikdo netvrdil, pokud si pamatuji správně), na výšce se to učí hned v prvním semestru.

No jirsak pisal, ze vsetko je skok => Balkis argument is invalid.

Podla mna mate v hlave len nejaky neurcity obraz o strukturovanom programovani. Aby ste boli kludny, nazvem to "Jirsakove strukturovane programovanie", aby sa to neplietlo.

Možná trošku vypustit, uklidnit se a přečíst si, co píše. Má to hlavu a patu, což se o tvých příspěvcích v tomto vlákně většinou říct nedá.


Obavam sa, ze nie, ze je na root falosnou autoritou a ludia jeho nazory nepodrobuju kritike. Pokial viem, on bol prvy, ktory sa zacal zo mna vysmievat a nadavat mi.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 16. 07. 2018, 22:16:08
Tak puvodne jsem do teto diskuze nechtel prispivat, protoze je to zbytecne, ale toto jsem si nemohl nechat ujit. Kdyz se ten kod od PetrM prepise bez break a if-return, cte se to od shora dolu jako pohadka.

Kód: [Vybrat]
int main(args) {
  if (argValid(arg)) {
     progInit(args);     // Inicializace programu
     while (!isEnd()) {  // Hlavni smycka
       process(args);
     }
     progDeInit();
     return 0;
  } else {
    return -1; // Chybne parametry
  }
}

Laskavy ctenar si udela obrazek sam, ktery kod mu prijde hezci a srozumitelnejsi.

Nezlob se na mě, ale co se na tom čte jako pohádka?

Kód: [Vybrat]
int main(args) {
  if (!argValid(arg)) {
      return -1;
  }
     
  progInit(args);       // Inicializace programu
  while (!isEnd())  {  // Hlavni smycka
       process(args);
  }

  progDeInit();
  return 0;
}

Šlo by to i jinak, ale if () return ... else return je prasárna. Asi jako if () return true else return false - tohle je prasárna^n, ale jde líp vidět, jak nesmyslné to je.
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 16. 07. 2018, 22:18:12
Tak puvodne jsem do teto diskuze nechtel prispivat, protoze je to zbytecne, ale toto jsem si nemohl nechat ujit. Kdyz se ten kod od PetrM prepise bez break a if-return, cte se to od shora dolu jako pohadka.

Kód: [Vybrat]
int main(args) {
  if (argValid(arg)) {
     progInit(args);     // Inicializace programu
     while (!isEnd()) {  // Hlavni smycka
       process(args);
     }
     progDeInit();
     return 0;
  } else {
    return -1; // Chybne parametry
  }
}

Laskavy ctenar si udela obrazek sam, ktery kod mu prijde hezci a srozumitelnejsi.


Kód: [Vybrat]
Pohádka:
   Byla jednou jedna princezna.
       Pak do království přiletěl drak.
       Dokud(nepřijel Bajaja) {
         drak likvidoval nápadníky
       }
      Bajaja se s ní oženil
    A pokud ta princezna nebyla, Bajaja zůstal na ocet.

No super počtení... Jenom já se nějak nerad na konci vracím k alternativním začátkům, to pak člověk občas ztratí nit...
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 22:18:41
Tak puvodne jsem do teto diskuze nechtel prispivat, protoze je to zbytecne, ale toto jsem si nemohl nechat ujit. Kdyz se ten kod od PetrM prepise bez break a if-return, cte se to od shora dolu jako pohadka.

Kód: [Vybrat]
int main(args) {
  if (argValid(arg)) {
     progInit(args);     // Inicializace programu
     while (!isEnd()) {  // Hlavni smycka
       process(args);
     }
     progDeInit();
     return 0;
  } else {
    return -1; // Chybne parametry
  }
}

Laskavy ctenar si udela obrazek sam, ktery kod mu prijde hezci a srozumitelnejsi.

Este return presunut na koniec, a je to v ramci balkiho hlupej dogmy :)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 16. 07. 2018, 22:29:04
Takze vlastne budeme pouzivat strukturovane programovanie tak, ze poprieme cyklus, vetvenie a sekvenciu.
Ne, to tady nikdo netvrdí.

Cize cyklus nie je cyklus, ale len tak ho v polke sekneme breakom, miesto miesta, kde sa ma.(lebo kod je dlhy, naco by sme vytvarali dalsie procedury)
Když v půlce cyklu zjistíte, že nemá smysl (nebo se dokonce nesmí) zbytek těla cyklu provádět, tak iteraci ukončíte a pokračujete na další. Nechápu, co vám na tom připadá divného. Tím, že celý zbytek cyklu dáte do ifu, na kódu nic nevylepšíte, nanejvýš to bude nepřehledné – a ten cyklus tím „seknete v půlce“ úplně stejně. Tím, že obsah toho ifu dáte do samostatné funkce, si ne vždycky pomůžete. Zaprvé jste tím ifem pořád „seknul cyklus v půlce“, za druhé to může znepřehledňovat kód, za třetí to kód může zpomalovat. Protože volání funkce není zadarmo, zvlášť když k tomu budete potřebovat další data, která se budou muset do funkce zkopírovat. Také může volání funkce zabránit odrolování smyčky optimalizátorem. Nespoléhejte na to, že vám kompilátor funkci pokaždé inlinuje, zvlášť když používáte divné konstrukce svého vlastního programovacího paradigmatu.

A je to vpohode, lebo c-cko a java napriklad obsahuje break vo switchi.(Co je jazykovo specificke a sposobuje to bugy)
Ne, C ani Java neobsahují break ve switchi. C i Java obsahují break, který vyskočí z aktuálně prováděného bloku kódu – přičemž tím blokem může být například cyklus, switch nebo blok s návěštím. Ten break je ale pořád úplně stejný, ve všech třech variantách – break ve switchi není ničím zvláštní. Tváříte se jak mistr světa, chcete ostatní poučovat o strukturovaném programování, ale break je pro vás zjevně obestřen tajemstvím…

Trosku preskocime nieco s goto, vsak nic sa nedeje.
goto sem pořád motáte akorát vy.

A mame 10 returnov z  funkcie, aby smudla hladal, ze ktory to bol.
Proč by to měl hledat? Z venku má funkce dělat jednu věc a jestli je v ní jeden return nebo 10 returnů má být volajícímu jedno. Pokud to pro volajícího jedno není, je ta funkce špatně napsaná.

Potom odchytime vynimku na poslednom moznom mieste, lebo zvysny kod nie je dolezity a koder si moze dohladavat, preco sa veci nevykonali.
To, že se nějaký kód po vyvolání výjimky nezavolal, je správně, je to záměr – třeba když se vám nepodaří alokovat paměť, bylo by špatně do ní zapisovat.

Nemusíte nám dokazovat, že neumíte naprogramovat rozumný kód, to už víme z vašich předchozích komentářů.

Vsak kompilator to vsetko aj tak prelozi na skok.
Jistě. Už jsem vám to psal několikrát, že bez skoků byste toho moc nenaprogramoval.

If je aj tak skok, dame tam goto.
goto tam dáváte jenom vy, nikdo jiný tady o něm nepíše.

Ano, je to ono, vlastne mate pravdu, to len ja zle interpretujem.  (To bola ironia).
No, ono to spíš vypadá, že problém není v interpretaci, ale v tom, že strukturovanému programování prostě vůbec nerozumíte. break je pro vás záhadou, netušíte, co dělá, tak jste si radši zavedl pravidlo „break nepoužívat“. Pak jste někde zaslechl, že se nemá používat ani goto, a teď si kvůli tomu goto a break pletete. A asi jste zrovna objevil, co dělá return, tak jste se hned v diskusi chtěl pochlubit „dobrou“ radou – no a ten break jste k tomu přihodil, protože netušíte, co dělá, tak co kdyby se s ním dalo i vyskočit z funkce.

Podla mna mate v hlave len nejaky neurcity obraz o strukturovanom programovani. Aby ste boli kludny, nazvem to "Jirsakove strukturovane programovanie", aby sa to neplietlo.
O balkiho strukturovaném programování mám zatím opravdu jen velmi neurčitý obraz. Zatím o balkiho strukturovaném programování vím jistě akorát to, že z procedury lze vyskočit returnem i breakem (https://forum.root.cz/index.php?topic=18986.msg274085#msg274085) a že break ve switchi má speciální chování (https://forum.root.cz/index.php?topic=18986.msg274238#msg274238), ale když se použije někde jinde, změní se na goto (https://forum.root.cz/index.php?topic=18986.msg274214#msg274214).

No, myslím, že kašpara už jste ze sebe udělal dostatečně, tak až zase budete mít potřebu někde poučovat, nezapomeňte, že hrozí, že se tam najdou lidé, kteří tomu na rozdíl od vás opravdu aspoň trochu rozumí. Pozdravujte na ignorlistu BonaFluta – myslím, že si s ním budete rozumět.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 16. 07. 2018, 22:37:36
Tak puvodne jsem do teto diskuze nechtel prispivat, protoze je to zbytecne, ale toto jsem si nemohl nechat ujit. Kdyz se ten kod od PetrM prepise bez break a if-return, cte se to od shora dolu jako pohadka.
Mohl byste jmenovat aspoň jednu pohádku, která má takhle blbou strukturu? Všechny pohádky, které znám já, mají jeden oblouk od začátku do konce. Ta vše pohádky by musel vy padat takhle nějak:

Citace: ded.kenediova pohádka
Žili byli v jednom království princ a princezna. Princezna byla krásná … zlá královna … zrcadlo … otrávené jablko … princezna spí … švarný princ ji políbil … princezna se probudila. Byla veliká převeliká svatba,a žili spolu šťastně až do smrti. Zazvonil zvonec, a pohádky je konec. Jo aha, ještě ten princ ze začátku pohádky. Ten žil taky šťastně až do smrti. Pohádky je konec.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 22:38:29
@Jirsak Napisem to takto. Switch bez breaku sa neda v C ani napriklad v jave rozumne pouzivat. Pascalovske "case" ano.

Neviem, ci ste ozaj nechapavy, alebo sa tak len tvarite.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 22:44:55
Tak puvodne jsem do teto diskuze nechtel prispivat, protoze je to zbytecne, ale toto jsem si nemohl nechat ujit. Kdyz se ten kod od PetrM prepise bez break a if-return, cte se to od shora dolu jako pohadka.
Mohl byste jmenovat aspoň jednu pohádku, která má takhle blbou strukturu? Všechny pohádky, které znám já, mají jeden oblouk od začátku do konce. Ta vše pohádky by musel vy padat takhle nějak:

Citace: ded.kenediova pohádka
Žili byli v jednom království princ a princezna. Princezna byla krásná … zlá královna … zrcadlo … otrávené jablko … princezna spí … švarný princ ji políbil … princezna se probudila. Byla veliká převeliká svatba,a žili spolu šťastně až do smrti. Zazvonil zvonec, a pohádky je konec. Jo aha, ještě ten princ ze začátku pohádky. Ten žil taky šťastně až do smrti. Pohádky je konec.

Pan jirsak, vy sa o 10 rokov pozriete na tento flame a budete sa len za hlavu chytat, ze ako ste mohli byt tak strasne ustipacny a k tomu bezdovodne.  (ak budete este vtedy nazive, neviem ako ste stary, ale tipujem tak 65, predpokladam prvy jazyk Fortran)
Název: Re:Jak můžu opustit funkci
Přispěvatel: totalbreak 16. 07. 2018, 22:58:38
@Jirsak Napisem to takto. Switch bez breaku sa neda v C ani napriklad v jave rozumne pouzivat. Pascalovske "case" ano.

Prosímtě balki, přestaň už vymýšlet hovadiny, už jsi nám všem dostatečně ukázal, že jsi jenom obyčejný lepič a cargo cult programátor.
Kód: [Vybrat]
switch (a) {
    case 1:
        return "jsem";
    case 2:
        return "lopata";
}
A teď kvízová otázka, je to tajuplná magická formule, nebo switch bez break? Za správnou odpověď získáváš dva bludišťáky.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 23:05:34
..., že jsi jenom obyčejný lepič a cargo cult programátor.

Ah, toto ma normalne zahrialo pri srdiecku :) Ste mi dali truthersky redpill priamo do tvare :)

Kód: [Vybrat]
switch (a) {
    case 1:
        return "jsem";
    case 2:
        return "lopata";
}
A teď kvízová otázka, je to tajuplná magická formule, nebo switch bez break? Za správnou odpověď získáváš dva bludišťáky.


Neprudte prosim :)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 16. 07. 2018, 23:08:07
Este return presunut na koniec, a je to v ramci balkiho hlupej dogmy :)

Takže celý to bude odsazený. Zbytečně. Super.


@PetrM - for(;;) je taky "smysluplné", je nějaký důvod proč nepoužít while?
Název: Re:Jak můžu opustit funkci
Přispěvatel: totalbreak 16. 07. 2018, 23:10:49
Ah, toto ma normalne zahrialo pri srdiecku :) Ste mi dali truthersky redpill priamo do tvare :)
Neprudte prosim :)

Protiargument? Já vím, došly... Víš, mně nevadí, že tomu nerozumíš. Mně vadí, že tady ty svoje cargo cult bludy hlásáš jako nějakou univerzální pravdu. Jenomže jsi bohužel mimo a celkem hodně pro smích.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 23:14:12
Ah, toto ma normalne zahrialo pri srdiecku :) Ste mi dali truthersky redpill priamo do tvare :)
Neprudte prosim :)

Protiargument? Já vím, došly... Víš, mně nevadí, že tomu nerozumíš. Mně vadí, že tady ty svoje cargo cult bludy hlásáš jako nějakou univerzální pravdu. Jenomže jsi bohužel mimo a celkem hodně pro smích.

Aha, toto mal byt argument?

Prosímtě balki, přestaň už vymýšlet hovadiny, už jsi nám všem dostatečně ukázal, že jsi jenom obyčejný lepič a cargo cult programátor.

Javaman, ty vies aj lepsie trollit, vzchop sa :)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 16. 07. 2018, 23:19:09
Potom odchytime vynimku na poslednom moznom mieste, lebo zvysny kod nie je dolezity a koder si moze dohladavat, preco sa veci nevykonali. Vsak kompilator to vsetko aj tak prelozi na skok.
Tohle už je čirá demagogie, tohle nikdo netvrdil, tak netroll.
Ok, sorry, to tvrdil Kit, dohladal som si to.

To není můj výrok.
Název: Re:Jak můžu opustit funkci
Přispěvatel: totalbreak 16. 07. 2018, 23:19:30
Aha, toto mal byt argument?

Tohle byl argument, na který nemáš odpověď:
Kód: [Vybrat]
switch (a) {
    case 1:
        return "jsem";
    case 2:
        return "lopata";
}
Ale já vím, je to pro tebe magická formule, switche bez breaku v cargo cultu nedávají smysl...
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 23:23:30
A vynimky nie su strukturovane programovanie, to je len goto na iny sposob, to je vam hadam jasne.  Tie je vhodne vcas odchytit (tie predvidatelne) a riadenie programu robit pomocou chybovych hodnot.

Výjimky naopak zachycuji tak pozdě, jak jen to jde. Jejich nespornou výhodou je, že v sobě nesou všechny informace, které potřebuji k jejich zpracování. Používat něco takového ke generování chybových hodnot je podle mne hloupost, neboť se tím velké množství předávaných informací ztratí. Řízení programu podle výjimek nebo stavových kódů je uznávaným antipatternem.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 16. 07. 2018, 23:29:03
@Jirsak Napisem to takto. Switch bez breaku sa neda v C ani napriklad v jave rozumne pouzivat. Pascalovske "case" ano.

Neviem, ci ste ozaj nechapavy, alebo sa tak len tvarite.

Už jsem napsal hodně switchů, ve kterých nebyl ani jediný break. Od jisté doby tak píši všechny.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 23:34:54
@Jirsak Napisem to takto. Switch bez breaku sa neda v C ani napriklad v jave rozumne pouzivat. Pascalovske "case" ano.

Neviem, ci ste ozaj nechapavy, alebo sa tak len tvarite.

Už jsem napsal hodně switchů, ve kterých nebyl ani jediný break. Od jisté doby tak píši všechny.

Bojim sa opytat na dovod.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 16. 07. 2018, 23:35:24
A vynimky nie su strukturovane programovanie, to je len goto na iny sposob, to je vam hadam jasne.  Tie je vhodne vcas odchytit (tie predvidatelne) a riadenie programu robit pomocou chybovych hodnot.

Výjimky naopak zachycuji tak pozdě, jak jen to jde. Jejich nespornou výhodou je, že v sobě nesou všechny informace, které potřebuji k jejich zpracování. Používat něco takového ke generování chybových hodnot je podle mne hloupost, neboť se tím velké množství předávaných informací ztratí. Řízení programu podle výjimek nebo stavových kódů je uznávaným antipatternem.

Tohle jsem psal, ale je to něco jiného, než co jsi mi před chvílí podsunul.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 16. 07. 2018, 23:37:21
@Jirsak Napisem to takto. Switch bez breaku sa neda v C ani napriklad v jave rozumne pouzivat. Pascalovske "case" ano.

Neviem, ci ste ozaj nechapavy, alebo sa tak len tvarite.
Už jsem napsal hodně switchů, ve kterých nebyl ani jediný break. Od jisté doby tak píši všechny.
Bojim sa opytat na dovod.

Důvod je jednoduchý: Chci, aby mé programy byly jednoduše čitelné - break mi tam prostě překážel.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 16. 07. 2018, 23:41:40
A vynimky nie su strukturovane programovanie, to je len goto na iny sposob, to je vam hadam jasne.  Tie je vhodne vcas odchytit (tie predvidatelne) a riadenie programu robit pomocou chybovych hodnot.

Výjimky naopak zachycuji tak pozdě, jak jen to jde. Jejich nespornou výhodou je, že v sobě nesou všechny informace, které potřebuji k jejich zpracování. Používat něco takového ke generování chybových hodnot je podle mne hloupost, neboť se tím velké množství předávaných informací ztratí. Řízení programu podle výjimek nebo stavových kódů je uznávaným antipatternem.

Tohle jsem psal, ale je to něco jiného, než co jsi mi před chvílí podsunul.

Výjimky naopak zachycuji tak pozdě, jak jen to jde. Jejich nespornou výhodou je, že v sobě nesou všechny informace, které potřebuji k jejich zpracování.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 16. 07. 2018, 23:46:15
Tohle jsem psal, ale je to něco jiného, než co jsi mi před chvílí podsunul.
Výjimky naopak zachycuji tak pozdě, jak jen to jde. Jejich nespornou výhodou je, že v sobě nesou všechny informace, které potřebuji k jejich zpracování.

Ano, tohle jsem psal. Ovšem tohle:
Citace
Potom odchytime vynimku na poslednom moznom mieste, lebo zvysny kod nie je dolezity a koder si moze dohladavat, preco sa veci nevykonali. Vsak kompilator to vsetko aj tak prelozi na skok.
jsem nepsal. To sis někde vycucal z prstu.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 17. 07. 2018, 00:33:10
Tohle jsem psal, ale je to něco jiného, než co jsi mi před chvílí podsunul.
Výjimky naopak zachycuji tak pozdě, jak jen to jde. Jejich nespornou výhodou je, že v sobě nesou všechny informace, které potřebuji k jejich zpracování.

Ano, tohle jsem psal. Ovšem tohle:
Citace
Potom odchytime vynimku na poslednom moznom mieste, lebo zvysny kod nie je dolezity a koder si moze dohladavat, preco sa veci nevykonali. Vsak kompilator to vsetko aj tak prelozi na skok.
jsem nepsal. To sis někde vycucal z prstu.

Disclaimer: Nechcem poucovat, ani nikomu nadavat. Ani nic, ani to nemusite citat pan Jirsak.

Ok, teraz budem pre zmenu nonkonformny ja. Nas ucili vynimky odchycovat neskor, na vyssej urovni abstrakcie a vyhadzovat hned, ako je to mozne, donedavna som to praktizoval (a stacilo to).  No v skutocnosti to v niektorych aplikaciach znemoznuje pruzne reagovat, tak ako by bolo treba. Komunikoval som cez modem s jednym obskurnym ebedded zariadenim cez debilny protokol. Riesit vynimky, ktore mohli nastat - neskorsie, na vyssej urovni, by mohlo znamenat, ze sa zariadenie uvedie do stavu, ktory nie je zelany. Taktiez kvoli monitoringu cez zabbix sa v programe nachadzalo kopec boilerplate monitoringoveho kodu, ktory sa nespravne zavolal a systemaci mi potom zaslali excel, kde im nesedeli ciselka.

Ono je to asi dobre "niekde" tak pouzit. Ale nad touto best practice skripem zubami.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 17. 07. 2018, 01:20:45
Ok, teraz budem pre zmenu nonkonformny ja. Nas ucili vynimky odchycovat neskor, na vyssej urovni abstrakcie a vyhadzovat hned, ako je to mozne, donedavna som to praktizoval (a stacilo to).  No v skutocnosti to v niektorych aplikaciach znemoznuje pruzne reagovat, tak ako by bolo treba. Komunikoval som cez modem s jednym obskurnym ebedded zariadenim cez debilny protokol. Riesit vynimky, ktore mohli nastat - neskorsie, na vyssej urovni, by mohlo znamenat, ze sa zariadenie uvedie do stavu, ktory nie je zelany. Taktiez kvoli monitoringu cez zabbix sa v programe nachadzalo kopec boilerplate monitoringoveho kodu, ktory sa nespravne zavolal a systemaci mi potom zaslali excel, kde im nesedeli ciselka.

Ono je to asi dobre "niekde" tak pouzit. Ale nad touto best practice skripem zubami.

Pokud potřebuji jemnější granularitu, tak výjimku podle jejího typu zpracuji už v některé z mezivrstev. Buď ji vyřeším, anebo ji obalím a nechám propadnout. Vše závisí na protokolu mezi vrstvami, jehož součástí jsou i výjimky.
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 17. 07. 2018, 05:02:25
@PetrM - for(;;) je taky "smysluplné", je nějaký důvod proč nepoužít while?

while(1) obsahuje magickou konstantu. A jedno z pravidel (na rozdíl od Balkiho nesmyslu s jedním returnem ve funkci je rozumný) zní, že mimo nuly a dekrementu o 1 v mezích pole nesmí být v kódu nepojmenovaná konstanta. Tak jsem použil verzi bez čísla.

Ono s for se dá dělat hodně kouzel...  ;)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 17. 07. 2018, 06:49:09
@PetrM - for(;;) je taky "smysluplné", je nějaký důvod proč nepoužít while?

while(1) obsahuje magickou konstantu. A jedno z pravidel (na rozdíl od Balkiho nesmyslu s jedním returnem ve funkci je rozumný) zní, že mimo nuly a dekrementu o 1 v mezích pole nesmí být v kódu nepojmenovaná konstanta. Tak jsem použil verzi bez čísla.

Jenže to v tomto případě není ani tak numerická konstanta, jakožto spíš boolean. While (true) je úplně standardní konstrukce, tak by mě zajímalo, v čem je (by mohl být) problém?

Ono s for se dá dělat hodně kouzel...  ;)

To jistě, ale nevidím jediný důvod, proč bych měl psát

Kód: [Vybrat]
for(;;) { // Hlavni smycka
    if(isEnd()) break;
    ...
}

když můžu napsat toto

Kód: [Vybrat]
while(!isEnd()) {
    ...
}

Je to čitelnější, kratší, imho elegantnější.
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 17. 07. 2018, 07:57:01
Jenže to v tomto případě není ani tak numerická konstanta, jakožto spíš boolean. While (true) je úplně standardní konstrukce, tak by mě zajímalo, v čem je (by mohl být) problém?

Problém je třeba v tom, že žádný true není v C definováno. A testovat v C proti true je sebevražda. Proč by to  měl člověk dělat při nekonečné smyčce?

Navíc pokud předpokládáme, že se funkce isExit() zabývá nějak vnitřním stavem hlavní smyčky, je nesmysl to volat hned na vstupu. Pokud nevybleješ průchod smyčkou ještě jednou před ni. Takže pokud chceš opravdu testovat isExit() na okraji smyšky, je vhodnější do-while podle principu DRY.

Každopádně endless loop + break má výhodu v tom, že můžeš testovat kdekoliv - na začátku smyčky zpracuješ události, aktualizuješ stav a můžeš testovat, jestli je to stav pro ukončení. Zbytek logiky smyčky nemusíš při ukončení brát v potaz...

Nevidím důvod, proč psát
Kód: [Vybrat]
  ...
  updateSa();
  while(s != STATE_EXIT) {
    updateSa();
    if(s != STATE_EXIT) {
      ...
    }
  }

když můžu napsat

Kód: [Vybrat]
  for(;;) {
    updateSa();
    if(s == STATE_EXIT) {
       break;
    }
    ... // Neprovede se pri ukonceni
  }

a mít tam jednu podmínku místo dvou (2 stejný podmínky bez optimalizace = 2x zahazování pipeline, rozhození dvoubitovýho prediktoru skoků,...)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 17. 07. 2018, 08:40:58
Jak zapsat nekonečnou smyčku obvykle patří ke konvencím daného jazyka případně projektu. Způsobů je obvykle několik a měl by se používat jen jeden z nich, aby nad tím pokaždé nemusel programátor přemýšlet „jo aha, tohle je také nekonečná smyčka“. V C se pokud vím obvykle používá for (;;), v Javě je konvence nekonečnou smyčku psát jako while (true).
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 17. 07. 2018, 09:18:38
@PetrM - for(;;) je taky "smysluplné", je nějaký důvod proč nepoužít while?

while(1) obsahuje magickou konstantu. A jedno z pravidel (na rozdíl od Balkiho nesmyslu s jedním returnem ve funkci je rozumný) zní, že mimo nuly a dekrementu o 1 v mezích pole nesmí být v kódu nepojmenovaná konstanta. Tak jsem použil verzi bez čísla.

Ono s for se dá dělat hodně kouzel...  ;)

To bolo podla dogmy, ktoru mi pripisujete.
Nekonecne slucky su nesvar. (Dufam, ze to jirsak necita, lebo zasa ta zaplava hovien bude neudrzatelna)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 17. 07. 2018, 09:21:16
Nekonecne slucky su nesvar. (Dufam, ze to jirsak necita, lebo zasa ta zaplava hovien bude neudrzatelna)

V event driven programu je jedna nekonecna smycka tak akorat ;-)

Samozrejme nemusis ji psat rucne, pokud mas k ruce dobry framework.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 17. 07. 2018, 09:26:40
Nekonecne slucky su nesvar. (Dufam, ze to jirsak necita, lebo zasa ta zaplava hovien bude neudrzatelna)

V event driven programu je jedna nekonecna smycka tak akorat ;-)

Samozrejme nemusis ji psat rucne, pokud mas k ruce dobry framework.

Co oci nevidia, to srdce neboli :)    Minimalne je fajn mat moznost taku slucku rozpojit. Vzdy sa tam da dopisat boolean, ked treba.  Ale chapem, ze asi kompilator nekonecnu slucku asi vidi a patricne zoptimalizuje.
Název: Re:Jak můžu opustit funkci
Přispěvatel: dustin 17. 07. 2018, 09:34:05
Citace
Ve škole nás učili...

Lepší je používat vlastní rozum.

Výjimka se chytá tam, kde to dává pro danou konkrétní situaci smysl.
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 17. 07. 2018, 09:47:23
Nekonecne slucky su nesvar.

Jak uděláš thread v RTOSu bez nekonečné smyčky? (jinde než v threadech na RTOSu a v main() jsem ještě nekonečnou smyčku nepoužil)

Jo aha, multitasking a multithreading je nešvar. Špagety v main() rulezzz, ať je z toho Arduino style žumpa bez možnosti reuse a údržby...
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 17. 07. 2018, 09:54:41
Minimalne je fajn mat moznost taku slucku rozpojit. Vzdy sa tam da dopisat boolean, ked treba.  Ale chapem, ze asi kompilator nekonecnu slucku asi vidi a patricne zoptimalizuje.

Ne. Pokud je taková smyčka ve frameworku a změníš ji na "konečnou" jinak, než pomocí DI, tak si to rozbiješ při aktualizacích.

Boolean se dopsat nedá, teda aspoň ne v C. Kompilátor takový základní typ nezná a vždycky je to nebepečný rovnák na ohybák a těžký pasti. Schválně, co udělá tahle ukázka kódu? (Ostatní pls nenapovídat)
Kód: [Vybrat]
while(musiBezet() == true) {
  ...
}
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 17. 07. 2018, 10:02:01
Boolean se dopsat nedá, teda aspoň ne v C. Kompilátor takový základní typ nezná a vždycky je to nebepečný rovnák na ohybák a těžký pasti. Schválně, co udělá tahle ukázka kódu? (Ostatní pls nenapovídat)
Kód: [Vybrat]
while(musiBezet() == true) {
  ...
}

 ::) Autizmus
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 17. 07. 2018, 10:25:58
Boolean se dopsat nedá, teda aspoň ne v C.

Problém je třeba v tom, že žádný true není v C definováno. A testovat v C proti true je sebevražda. Proč by to  měl člověk dělat při nekonečné smyčce?

Ne, v C můžu použít "cokoliv" vyjma 0 a NULL. (případně si definovat makro)
Protože by chtěl, aby byla nekonečná? O.o Mimo to zrovna pokud jde o to "testování", tak to kompilátor "zoptimalizuje", tudíž je úplně jedno jestli píšu while(1), nebo for(;; ).

Navíc pokud předpokládáme, že se funkce isExit() zabývá nějak vnitřním stavem hlavní smyčky, je nesmysl to volat hned na vstupu. Pokud nevybleješ průchod smyčkou ještě jednou před ni. Takže pokud chceš opravdu testovat isExit() na okraji smyšky, je vhodnější do-while podle principu DRY.

To jsi předpokládal ty. Jinak samozřejmě do-while to řeší.

Každopádně endless loop + break má výhodu v tom, že můžeš testovat kdekoliv - na začátku smyčky zpracuješ události, aktualizuješ stav a můžeš testovat, jestli je to stav pro ukončení. Zbytek logiky smyčky nemusíš při ukončení brát v potaz...

Nevidím důvod, proč psát
Kód: [Vybrat]
  ...
  updateSa();
  while(s != STATE_EXIT) {
    updateSa();
    if(s != STATE_EXIT) {
      ...
    }
  }

když můžu napsat

Kód: [Vybrat]
  for(;;) {
    updateSa();
    if(s == STATE_EXIT) {
       break;
    }
    ... // Neprovede se pri ukonceni
  }

a mít tam jednu podmínku místo dvou (2 stejný podmínky bez optimalizace = 2x zahazování pipeline, rozhození dvoubitovýho prediktoru skoků,...)

Ano, to by šlo, v těchto případech to píši stejně (vyjma while(1) místo for(;; ), ale to je jen konvence).
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 17. 07. 2018, 11:17:48
Ne, v C můžu použít "cokoliv" vyjma 0 a NULL. (případně si definovat makro)

Nemůžeš definovat ani makro, ani enum. A to je ten chyták. V C nejde definovat plnohodnotná hodnota TRUE. To tvoje makro bude použitelný maximálně jako předdefinovaná návratová hodnota pro tvoje funkce, nic víc. A stejně se pak nemůžeš spolehnout, že bool f() bude vracet jenom TRUE a FALSE.

Protože by chtěl, aby byla nekonečná? O.o Mimo to zrovna pokud jde o to "testování", tak to kompilátor "zoptimalizuje", tudíž je úplně jedno jestli píšu while(1), nebo for(;; ).

Kompilátoru to jedno je, ale není to jedno těm, kdo ten kód čtou.
for(;;) - nekonečný cyklus
for(i = 1; i < 10; i++) - cyklus od jedné do deseti s krokem 1
for( i= 1; i < 100; i+= 5) - cyklus od 1 do 100 s krokem 5
for(i = 0; i <  sizeof(x) / sizeof(x[0]); i++)  - cyklus procházející statické pole
for(item = root; item != NULL; item = item->next) - cyklus procházející seznam

while(x) - opakování, dokud x != 0
while(1) - opakování, dokud 1 != 0
while(true) - opakování, dokud true != 0 - oh wait, co je to true?

To jsi předpokládal ty. Jinak samozřejmě do-while to řeší.

Tak předpoklad je, že pokud to jde ukončit jinak, než zabitím natvrdo přes kernel, bude tam nějaký příjem zpráv nebo kontrola dat. A z toho se vyhodnotí, kdy končit. A příjem zpráv je přece vždycky součást hlavní smyčky / smyčky ve vlákně. Je fajn, pokud není chyba v parametrech, napřed přijmout zprávy a prubnout jednu iteraci / inicializaci. Nebo inicializovat stavový automat, který má stav EXIT. Situace se může dost lišit a napsat, že while(něco) je univerzální řešení, je na kopanec do zadku zepředu.
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 17. 07. 2018, 11:20:42
Boolean se dopsat nedá, teda aspoň ne v C. Kompilátor takový základní typ nezná a vždycky je to nebepečný rovnák na ohybák a těžký pasti. Schválně, co udělá tahle ukázka kódu? (Ostatní pls nenapovídat)
Kód: [Vybrat]
while(musiBezet() == true) {
  ...
}

 ::) Autizmus

Takže nevíš? Prubni to znovu. Lidi na tvé úrovni to často používají.

Btw, teď jsem viděl od kontraktora

Kód: [Vybrat]
if (x == true) {...} else if (x == false) {...}

Nezabil bys ho za ty dvě chyby?
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 17. 07. 2018, 11:21:43
Nekonecne slucky su nesvar.

Jak uděláš thread v RTOSu bez nekonečné smyčky? (jinde než v threadech na RTOSu a v main() jsem ještě nekonečnou smyčku nepoužil)

Jo aha, multitasking a multithreading je nešvar. Špagety v main() rulezzz, ať je z toho Arduino style žumpa bez možnosti reuse a údržby...

Ak aplikaciu nepotrebujes civilizovane vypnut a ma to bezat "furt", potom je ta nekonecna slucka mozno aj ok. 
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 17. 07. 2018, 11:26:27
Boolean se dopsat nedá, teda aspoň ne v C. Kompilátor takový základní typ nezná a vždycky je to nebepečný rovnák na ohybák a těžký pasti. Schválně, co udělá tahle ukázka kódu? (Ostatní pls nenapovídat)
Kód: [Vybrat]
while(musiBezet() == true) {
  ...
}

 ::) Autizmus

Takže nevíš? Prubni to znovu. Lidi na tvé úrovni to často používají.

Btw, teď jsem viděl od kontraktora

Kód: [Vybrat]
if (x == true) {...} else if (x == false) {...}

Nezabil bys ho za ty dvě chyby?

Noo, čo to robí, keď má x priradenu hodnotu -5 ?  :)   To akože "pravda", "nepravda" a "šicko v porádku tu maš banan"?
Název: Re:Jak můžu opustit funkci
Přispěvatel: DogWithFleas 17. 07. 2018, 11:58:35
Ne, v C můžu použít "cokoliv" vyjma 0 a NULL. (případně si definovat makro)

Nemůžeš definovat ani makro, ani enum. A to je ten chyták. V C nejde definovat plnohodnotná hodnota TRUE. To tvoje makro bude použitelný maximálně jako předdefinovaná návratová hodnota pro tvoje funkce, nic víc. A stejně se pak nemůžeš spolehnout, že bool f() bude vracet jenom TRUE a FALSE.

_Bool.
Ted pro zmenu rozumujes ty.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kiwi 17. 07. 2018, 12:13:59
Boolean se dopsat nedá, teda aspoň ne v C. Kompilátor takový základní typ nezná a vždycky je to nebepečný rovnák na ohybák a těžký pasti. Schválně, co udělá tahle ukázka kódu? (Ostatní pls nenapovídat)
Kód: [Vybrat]
while(musiBezet() == true) {
  ...
}

 ::) Autizmus

Takže nevíš? Prubni to znovu. Lidi na tvé úrovni to často používají.

Btw, teď jsem viděl od kontraktora

Kód: [Vybrat]
if (x == true) {...} else if (x == false) {...}

Nezabil bys ho za ty dvě chyby?
Po pravdě, sice takový kód nesnáším, ale dám se podat. True a false naprosto běžně v C definuji přes makra a nikdy jsem s tím žádný problém neměl. Nějaké tušení, na co asi narážíš, sice mám, ale jestli je to skutečně ono, tak problém bude kapku jinde.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 17. 07. 2018, 12:29:45
Po pravdě, sice takový kód nesnáším, ale dám se podat. True a false naprosto běžně v C definuji přes makra a nikdy jsem s tím žádný problém neměl. Nějaké tušení, na co asi narážíš, sice mám, ale jestli je to skutečně ono, tak problém bude kapku jinde.

A je `x == true` to same jako `x`? ;-)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 17. 07. 2018, 12:34:15
Btw, teď jsem viděl od kontraktora
Kód: [Vybrat]
if (x == true) {...} else if (x == false) {...}
Nezabil bys ho za ty dvě chyby?

Tento zápis představuje třícestné rozbočení. Bez dalšího vysvětlení je obtížné pochopit, o co jde a proto je to špatně.
Název: Re:Jak můžu opustit funkci
Přispěvatel: JSH 17. 07. 2018, 12:42:28
Ne, v C můžu použít "cokoliv" vyjma 0 a NULL. (případně si definovat makro)

Nemůžeš definovat ani makro, ani enum. A to je ten chyták. V C nejde definovat plnohodnotná hodnota TRUE. To tvoje makro bude použitelný maximálně jako předdefinovaná návratová hodnota pro tvoje funkce, nic víc. A stejně se pak nemůžeš spolehnout, že bool f() bude vracet jenom TRUE a FALSE.

_Bool.
Ted pro zmenu rozumujes ty.
No ale o tomhle přesně psal. Ten _Bool tam nikdo nedodefinoval prostředky C. Musel se přidat jako nové klíčové slovo na úrovni překladače. Jinak nebylo možné zaručit, že bude mít opravdu jen dva možné stavy. A těch pastí kolem intu předefinovaného na bool je víc. Že se pak _Bool předefinovává na příčetnější název je jenom kvůli kolizím se starým kódem.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 17. 07. 2018, 12:44:15
Btw, teď jsem viděl od kontraktora
Kód: [Vybrat]
if (x == true) {...} else if (x == false) {...}
Nezabil bys ho za ty dvě chyby?

Tento zápis představuje třícestné rozbočení. Bez dalšího vysvětlení je obtížné pochopit, o co jde a proto je to špatně.

O toto mu asi ide:
1.  v C nie je hodnota pre true definovana, moze byt vsetko okrem 0. To je prvy problem.  Ak pouzivas standardnu libku, alebo si normalny( das true = 1 a false = 0), tak nie je problem.  Alebo si predposraty a das tam if(x != false).
2. ozaj je to trojcestne rozhodovanie.
Název: Re:Jak můžu opustit funkci
Přispěvatel: x14 17. 07. 2018, 12:52:31
Ok, takže znovu: Prosím vás, už nekrmte ty trolly.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 17. 07. 2018, 13:00:32
Ok, takže znovu: Prosím vás, už nekrmte ty trolly.

Bez ohladu, ze je to brutalne offtopic, clovek aspon pochopi niektore motivacie,
ktore vedu k spagetovemu kodu. To nie je krmenie trollov, ale edukacia.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kiwi 17. 07. 2018, 13:03:18
Ale já stále nechápu, proč by "chybový stav" měl být nějak privilegovaný oproti jakémukoli jinému "normálnímu" stavu.
Protože se na něj reaguje úplně jinak, než na normální stav. Pokud je stav normální, pokračuje program normálně v běhu. Pokud je stav chybový, může se program pokusit z něj nějak zotavit a vrátit program do nějakého normálního (předchozího nebo základního) stavu.

Představte si to třeba na bezpečných systémech. Když zabezpečovací systém na soupravě metra detekuje, že došlo k překročení maximální povolené rychlosti, nemůže se to řešit jako ostatní stavy, kde se řeší optimalizace rychlosti vzhledem k profilu tratě, grafikonu, cílovému brzdění atd. – nemůže tam mezi tím vším být schovaná podmínka „jo a pokud je překročená maximální rychlost, asi by bylo fajn začít brzdit“. Ne, ten chybový stav musí mít před vším přednost, všechno ostatní se zahodí a začne se řešit ten chybový stav – maximálním brzděním. A řešení toho chybového stavu skončí až tehdy, když je systém v nějakém jasně definovaném bezpečném stavu. Což by mohl být třeba návrat pod křivku maximální rychlosti, ale třeba v pražském metru je ten bezpečný stav až úplné zastavení soupravy. Teprve když souprava stojí, vrátila se do bezpečného normálního stavu, zruší se řešení chybového stavu a je možné pokračovat normálním způsobem, tj. strojvedoucí může soupravu znovu rozjet.
Ale tohle je přece něco naprosto jiného! Tady se bavíme o výjimkách jakožto syntaktické konstrukci v jazyce. Ne o výjimkách jakožto přerušení hlavního programu hardwarem. Pokud bude na dané platformě přerušovací systém, tak se takovéto výjimečné stavy vyřeší přes něj. Pokud tam nebude, tak opět nezbývá než "ruční" testování jako by to byl "normální" stav. Jakožto celoživotní embedded vývojář už jsem se setkal s oběma možnostmi - různé ASICy žádný přerušovací systém nemají a skutečně v takových případech nezbývá nic jiného než testovat to jako běžnou podmínku - jen je třeba myslet na to, kdy bude testovaná a jak dlouho bude trvat, než se program dostane k obsluze takového stavu. Jak v tomhle pomohou výjimky v jazyku?

Když chci otevřít soubor, který neexistuje - proč bych to měl ošetřovat někde jinde? Když nedostanu požadovanou paměť, když v parseru detekuji syntax error
Třeba proto, abyste tu chybu vůbec ošetřil. Nebo protože jí potřebujete ošetřit na místě, kde ji vůbec nějak ošetřit můžete – což vůbec nemusí být místo, kde vznikla. Výjimky vám nebrání ošetřit chybu hned v místě, kde vznikla – ale nenutí vás k tomu. Pochybuju, že doopravdy ošetřujete možné chyby všude tam, kde teoreticky mohou nastat. Třeba při alokaci paměti.
Fragmenty typu if ((m = malloc(...))) nebo if ((f = fopen(...))) považuju za céčkové idiomy. Existují samozřejmě i chyby v alokaci jiného typu (lokální automatická data), ale to opět principiálně s jazykovými výjimkami nesouvisí. Chyba se nejlépe ošetřuje právě tam, kde vzniká. A pokud to nelze, propaguju ji výše jako chybu na úrovni vrstvy, která se s ní naposledy nedokázala vyrovnat. Ty na hlídání alokací kašleš?

Záleží na typu komunikačního protokolu. Z transportní vrstvy bych měl obdržet celistvou zprávu, bez chyb. Pokud je v ní chyba, je to jasná výjimka. Pokud je chybný datový paket mezi transportní a síťovou vrstvou, je to jen stav, protože může běžně nastat.
Taková chyba principiálně nemůže nestat. Transportní vrstva dodá buď bezchybnou zprávu, nebo nějakou chybu typu timeout při příjmu. Ale co je na tom výjimečného? To je na transportní vrstvě zrovna tak "normální" stav, jako poškozená zpráva na síťové vrstvě.

Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 17. 07. 2018, 13:09:28
Ale já stále nechápu, proč by "chybový stav" měl být nějak privilegovaný oproti jakémukoli jinému "normálnímu" stavu.
Protože se na něj reaguje úplně jinak, než na normální stav. Pokud je stav normální, pokračuje program normálně v běhu. Pokud je stav chybový, může se program pokusit z něj nějak zotavit a vrátit program do nějakého normálního (předchozího nebo základního) stavu.

Představte si to třeba na bezpečných systémech. Když zabezpečovací systém na soupravě metra detekuje, že došlo k překročení maximální povolené rychlosti, nemůže se to řešit jako ostatní stavy, kde se řeší optimalizace rychlosti vzhledem k profilu tratě, grafikonu, cílovému brzdění atd. – nemůže tam mezi tím vším být schovaná podmínka „jo a pokud je překročená maximální rychlost, asi by bylo fajn začít brzdit“. Ne, ten chybový stav musí mít před vším přednost, všechno ostatní se zahodí a začne se řešit ten chybový stav – maximálním brzděním. A řešení toho chybového stavu skončí až tehdy, když je systém v nějakém jasně definovaném bezpečném stavu. Což by mohl být třeba návrat pod křivku maximální rychlosti, ale třeba v pražském metru je ten bezpečný stav až úplné zastavení soupravy. Teprve když souprava stojí, vrátila se do bezpečného normálního stavu, zruší se řešení chybového stavu a je možné pokračovat normálním způsobem, tj. strojvedoucí může soupravu znovu rozjet.
Ale tohle je přece něco naprosto jiného! Tady se bavíme o výjimkách jakožto syntaktické konstrukci v jazyce. Ne o výjimkách jakožto přerušení hlavního programu hardwarem. Pokud bude na dané platformě přerušovací systém, tak se takovéto výjimečné stavy vyřeší přes něj. Pokud tam nebude, tak opět nezbývá než "ruční" testování jako by to byl "normální" stav. Jakožto celoživotní embedded vývojář už jsem se setkal s oběma možnostmi - různé ASICy žádný přerušovací systém nemají a skutečně v takových případech nezbývá nic jiného než testovat to jako běžnou podmínku - jen je třeba myslet na to, kdy bude testovaná a jak dlouho bude trvat, než se program dostane k obsluze takového stavu. Jak v tomhle pomohou výjimky v jazyku?

Pokud resis ASIC bez preruseni, tak vyjimky skutecne asi nejsou ta uroven abstrakce, ktera te zajima...

Pro mainstreamove/aplikacni programovani je to neocenitelny konstrukt.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kiwi 17. 07. 2018, 13:20:07
Po pravdě, sice takový kód nesnáším, ale dám se podat. True a false naprosto běžně v C definuji přes makra a nikdy jsem s tím žádný problém neměl. Nějaké tušení, na co asi narážíš, sice mám, ale jestli je to skutečně ono, tak problém bude kapku jinde.

A je `x == true` to same jako `x`? ;-)
Pokud nevím, jak je definované true, tak se na to dá dost těžko odpovědět.

Btw, teď jsem viděl od kontraktora
Kód: [Vybrat]
if (x == true) {...} else if (x == false) {...}
Nezabil bys ho za ty dvě chyby?

Tento zápis představuje třícestné rozbočení. Bez dalšího vysvětlení je obtížné pochopit, o co jde a proto je to špatně.

O toto mu asi ide:
1.  v C nie je hodnota pre true definovana, moze byt vsetko okrem 0. To je prvy problem.  Ak pouzivas standardnu libku, alebo si normalny( das true = 1 a false = 0), tak nie je problem.  Alebo si predposraty a das tam if(x != false).
2. ozaj je to trojcestne rozhodovanie.

Normální céčkař definuje false jako 0 a true jako negaci false a programuje s vědomím, že false je nula a nenula je true. Testovat na true je nešvar snad v kterémkoli jazyce, ale nemusí jít nutně o chybu. Při použití standardních knihoven to chyba je, ale v konzistentním kódu bez cizího kódu nemusí. Jinak souhlasím s tím, že to obecně není správné takto testovat - jak jsem ostatně napsal hned v prvním postu k tomu.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 17. 07. 2018, 13:35:29
Normální céčkař definuje false jako 0 a true jako negaci false a programuje s vědomím, že false je nula a nenula je true. Testovat na true je nešvar snad v kterémkoli jazyce, ale nemusí jít nutně o chybu. Při použití standardních knihoven to chyba je, ale v konzistentním kódu bez cizího kódu nemusí. Jinak souhlasím s tím, že to obecně není správné takto testovat - jak jsem ostatně napsal hned v prvním postu k tomu.

Ako v ktorom jazyku. V jave mas okrem primitivneho boolean aj objekt Boolean a to je trojhodnotove. Moze nadobudnut hodnotu Boolean.TRUE, Bollean.False a null.  A teraz babo rad.  Co je null?  Chyba? False? True?
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 17. 07. 2018, 13:36:07
Po pravdě, sice takový kód nesnáším, ale dám se podat. True a false naprosto běžně v C definuji přes makra a nikdy jsem s tím žádný problém neměl. Nějaké tušení, na co asi narážíš, sice mám, ale jestli je to skutečně ono, tak problém bude kapku jinde.

A je `x == true` to same jako `x`? ;-)
Pokud nevím, jak je definované true, tak se na to dá dost těžko odpovědět.

Ale muzes... (resp. daleko podstatnejsi je to, jak vznikne x, nez to, jak kdo definoval true)
Název: Re:Jak můžu opustit funkci
Přispěvatel: JSH 17. 07. 2018, 13:37:52
Fragmenty typu if ((m = malloc(...))) nebo if ((f = fopen(...))) považuju za céčkové idiomy. Existují samozřejmě i chyby v alokaci jiného typu (lokální automatická data), ale to opět principiálně s jazykovými výjimkami nesouvisí. Chyba se nejlépe ošetřuje právě tam, kde vzniká. A pokud to nelze, propaguju ji výše jako chybu na úrovni vrstvy, která se s ní naposledy nedokázala vyrovnat. Ty na hlídání alokací kašleš?
Kašlat na kontrolu alokací může být podle platformy i racionální návrhové rozhodnutí.

Na Windowsech a Linuxech s overcommitem se alokace hlídají docela blbě. malloc samotný selže leda tak v případě, že dostane jako parametr úplnou blbost. Jinak OS akorát přidělí virtuální paměť. Fyzická se přiděluje až při pokusu o zápis. A tam může nastat několik možností (podle druhu a nastavení OS):
- Program se uswapuje k smrti.
- Pokus o zápis do úspěšně alokované paměti skončí segfaultem.
- Swaper to natvrdo zabije.

Troufnu si tvrdit, že drtivé většině PC programátorů selhal malloc akorát v případě, kdy blbě spočítali velikost.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 17. 07. 2018, 13:41:29
Ako v ktorom jazyku. V jave mas okrem primitivneho boolean aj objekt Boolean a to je trojhodnotove. Moze nadobudnut hodnotu Boolean.TRUE, Bollean.False a null.  A teraz babo rad.  Co je null?  Chyba? False? True?

To neni zadne babo rad... null neni chyba, True ani False. Je to null. Jeho chovani je celkem dobre definovane, kdyz se dostanes do situace, ze bys ho unboxoval, dostanes NPE.

Kód: [Vybrat]
java> Boolean a = null;
java.lang.Boolean a = null
java> if (a) System.out.println(a);
java.lang.NullPointerException

Asi nema smysl zduraznovat, ze nullable hodnoty jsou problematicke samy o sobe a ze uz nejaky ten patek mame optional, ktery celkem jasne vyjadruje myslenku, ze existuje moznost, ze tam dana vec nebude.
Název: Re:Jak můžu opustit funkci
Přispěvatel: kkt1 17. 07. 2018, 13:59:42
Nevite nekdo jestli uz tu funkci po 200 prispevcich opustil?
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 17. 07. 2018, 14:12:13
Ale tohle je přece něco naprosto jiného! Tady se bavíme o výjimkách jakožto syntaktické konstrukci v jazyce. Ne o výjimkách jakožto přerušení hlavního programu hardwarem.
Nevím, co je naprosto jiného, protože já píšu právě o výjimkách jakožto syntaktické konstrukci v jazyce a odpovídající implementaci v přeloženém kódu.

Fragmenty typu if ((m = malloc(...))) nebo if ((f = fopen(...))) považuju za céčkové idiomy. Existují samozřejmě i chyby v alokaci jiného typu (lokální automatická data), ale to opět principiálně s jazykovými výjimkami nesouvisí.
Ano, jsou to céčkové idiomy, ale to bohužel nezaručuje, že nenajdete kód bez toho ošetření. S jazykovými výjimkami to souvisí tak, že v céčku chybový stav můžete zachytit, když chcete – a když ne, tak chybu typicky hned v následujícím řádku kódu zazdíte. Výjimky jako jazyková konstrukce zajišťují, že nemůžete pouhým opomenutím chybový stav ignorovat – pokud výjimku neošetříte, probublá až někam do hlavní metody a (typicky) ukončí program. Pokud chcete takovou výjimku zazdít, musíte se aspoň trochu snažit.

Chyba se nejlépe ošetřuje právě tam, kde vzniká.
To vůbec není pravda. Místo vzniku výjimky a místo jejího ošetření spolu nijak nesouvisí – někdy to může být to samé místo, někdy je to někde úplně jinde.

Ty na hlídání alokací kašleš?
Ne. A výjimky mi dost usnadňují na něj nekašlat.

Taková chyba principiálně nemůže nestat. Transportní vrstva dodá buď bezchybnou zprávu, nebo nějakou chybu typu timeout při příjmu. Ale co je na tom výjimečného? To je na transportní vrstvě zrovna tak "normální" stav, jako poškozená zpráva na síťové vrstvě.
Výjimky nejsou výjimečné tím, že by k nim docházelo výjimečně málo často, ale tím, že je to výjimka z normálního běhu programu, odchylka od toho, co chci, aby program dělal. K chybám při síťovém transportu může docházet hodně často, ale program je dělaný proto, aby data úspěšně přenášel – neúspěšný přenos je odchylka od tohoto žádaného stavu, proto je to výjimka.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 17. 07. 2018, 14:19:24
Ako v ktorom jazyku. V jave mas okrem primitivneho boolean aj objekt Boolean a to je trojhodnotove. Moze nadobudnut hodnotu Boolean.TRUE, Bollean.False a null.  A teraz babo rad.  Co je null?  Chyba? False? True?

To neni zadne babo rad... null neni chyba, True ani False. Je to null. Jeho chovani je celkem dobre definovane, kdyz se dostanes do situace, ze bys ho unboxoval, dostanes NPE.

Kód: [Vybrat]
java> Boolean a = null;
java.lang.Boolean a = null
java> if (a) System.out.println(a);
java.lang.NullPointerException

Asi nema smysl zduraznovat, ze nullable hodnoty jsou problematicke samy o sobe a ze uz nejaky ten patek mame optional, ktery celkem jasne vyjadruje myslenku, ze existuje moznost, ze tam dana vec nebude.

To je sice pekne, ale predstav si, ze chces podla toho objektoveho Booleana vetvit kod. Das tam

if(!Boolean.FALSE.equals(x) ){

}

No ale to mas prdlajz a nie spravne vyhodnotene, lebo tam moze byt aj null.

Nepomoze ani:
if( x != false ){

}

a taktiez je mozny uz spominany nullpointer

if (x){

}

Optional je len posunutie problemu inam. Lebo to je zasa trojhodnotove - nedefinovane, true, false.

Treba to citat v kontexte prispevku, na ktory som reagoval povodne.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 17. 07. 2018, 14:21:00
Nevite nekdo jestli uz tu funkci po 200 prispevcich opustil?

Funkcia sa uz obesila na luster.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 17. 07. 2018, 14:34:06
To je sice pekne, ale predstav si, ze chces podla toho objektoveho Booleana vetvit kod. Das tam
Kód: [Vybrat]
if(!Boolean.FALSE.equals(x) ){
}
No ale to mas prdlajz a nie spravne vyhodnotene, lebo tam moze byt aj null.

Je mnoho důvodů, proč nepoužívám proměnné typu boolean. Vystačím si s tímto:
Kód: [Vybrat]
if (isX()) {
...
}
Název: Re:Jak můžu opustit funkci
Přispěvatel: . 17. 07. 2018, 15:29:47
Pro mainstreamove/aplikacni programovani je to neocenitelny konstrukt.
A proto nové jazyky jako Rust nebo Go výjimky nemají?
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 17. 07. 2018, 15:46:13
Pro mainstreamove/aplikacni programovani je to neocenitelny konstrukt.
A proto nové jazyky jako Rust nebo Go výjimky nemají?

Go je odpad.
A Rust má docela pěkné řešení ve stylu Left/Right, ale docela by mě zajímalo, jak to bude škálovat, když se člověk pustí do nějakého aplikačního vývoje a ne jen low-level.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 17. 07. 2018, 15:48:19

To je sice pekne, ale predstav si, ze chces podla toho objektoveho Booleana vetvit kod. Das tam
Kód: [Vybrat]
if(!Boolean.FALSE.equals(x) ){
}
No ale to mas prdlajz a nie spravne vyhodnotene, lebo tam moze byt aj null.

Je mnoho důvodů, proč nepoužívám proměnné typu boolean. Vystačím si s tímto:
Kód: [Vybrat]
if (isX()) {
...
}


A když potřebuješ výsledek toho isX() vícekrát? (Ptám se pro kamaráda, co má v tom isX() přístup ke clusteru.)
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 17. 07. 2018, 15:50:08
Taková chyba principiálně nemůže nestat. Transportní vrstva dodá buď bezchybnou zprávu, nebo nějakou chybu typu timeout při příjmu. Ale co je na tom výjimečného? To je na transportní vrstvě zrovna tak "normální" stav, jako poškozená zpráva na síťové vrstvě.
Výjimky nejsou výjimečné tím, že by k nim docházelo výjimečně málo často, ale tím, že je to výjimka z normálního běhu programu, odchylka od toho, co chci, aby program dělal. K chybám při síťovém transportu může docházet hodně často, ale program je dělaný proto, aby data úspěšně přenášel – neúspěšný přenos je odchylka od tohoto žádaného stavu, proto je to výjimka.

Ještě jinak.
Požadovaný stav je, že dojde správný paket a já ho potvrdím.
Chyba je, že dojde poškozený paket a snažím se to řešit (= NACK, aplikace samoopravnýho kódu,...).
Výjimka je, že se v půlce paketu přeruší spojení a ani po timeoutu nenavážu komunikaci s protistranou.

O level výš je chybějící/přebývající blok dat výjimka (přerušení lajny je furt výjimka - jiný stav je to na úrovni PHY/MAC), protože mám mít zajištěný kompletní data. Ale tam můžu mít třeba stav zprávy UNSIGNED/VALID/INVALID a se špatným podpisem se nastaví jako INVALID a nevolá se výjimka (a stav se prostě zobrazí uživateli).
Název: Re:Jak můžu opustit funkci
Přispěvatel: PetrM 17. 07. 2018, 15:51:20
Je mnoho důvodů, proč nepoužívám proměnné typu boolean. Vystačím si s tímto:
Kód: [Vybrat]
if (isX()) {
...
}

Jaký návratový typ má funkce isX()?
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 17. 07. 2018, 15:59:12
Je mnoho důvodů, proč nepoužívám proměnné typu boolean. Vystačím si s tímto:
Kód: [Vybrat]
if (isX()) {
...
}
A když potřebuješ výsledek toho isX() vícekrát? (Ptám se pro kamaráda, co má v tom isX() přístup ke clusteru.)

Potřebuji ho vždy jen jednou.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 17. 07. 2018, 16:05:12
Je mnoho důvodů, proč nepoužívám proměnné typu boolean. Vystačím si s tímto:
Kód: [Vybrat]
if (isX()) {
...
}
A když potřebuješ výsledek toho isX() vícekrát? (Ptám se pro kamaráda, co má v tom isX() přístup ke clusteru.)

Potřebuji ho vždy jen jednou.

Jak napíšeš test, že je splněná nějaká sada podmínek a přitom ještě zaloguješ vysvětlení?
Název: Re:Jak můžu opustit funkci
Přispěvatel: . 17. 07. 2018, 16:32:59
Je zvláštní, že někteří lidé poté co vykonají velkou potřebu ve veřejném prostoru, mají ještě nutkání se v těch hovnech prohrabávat. Budiž.

Někde v polovině tohoto threadu jsem diskutujícím vytýkal, že pomíjejí kontext. Od té doby myslím jen Kiwi zdůraznil, že pokud píše v C, považuje následující za idiomatické. Různé jazyky mají různé pohledy na to, jak je dobré, aby kód vypadal. Většinou se vyplatí tohoto držet. Je komické se bavit o jediném exit pointu funkce v jazycích, které podporují výjimky, protože exit pointem může být jakékoliv volání funkce, které vyhodí výjimku (pokud to v dané funkci explicitně neošetřím, což zase podpírá smysl výjimek).

I když si Dijkstry považuji, nemyslím si že jeho téměř 50 let staré zásady strukturovaného programování nedoznaly za ta léta určitých změn a nelze je brát dogmaticky. Samozřejmě, že je lepší, když má funkce jen jeden exit point, ale abych toto pravidlo dodržel, nebudu kvůli tomu zavádět třeba 5 řídících proměných. Nakonec některé z těch zásad měly neméně slavné oponenty (Wirth, Knuth) a nemyslím, že kdokoliv z nás se komukoliv z nich rozhledem a vědomostmi alespoň přibližuje.

Abychom se dál nehrabali v těch hovnech, bylo by dobré, aby každý podpořil své tvrzení alespoň citátem nějaké uznávané autority. Takže pro začátek:

Nested conditional code often is written by programmers who are taught to have one exit point from a method. I've found that is a too simplistic rule. When I have no further interest in a method, I signal my lack of interest by getting out. Directing the reader to look at an empty else block only gets in the way of comprehension.
Martin Fowler - Refactoring
Název: Re:Jak můžu opustit funkci
Přispěvatel: . 17. 07. 2018, 16:39:38
Pro mainstreamove/aplikacni programovani je to neocenitelny konstrukt.
A proto nové jazyky jako Rust nebo Go výjimky nemají?

Go je odpad.
A Rust má docela pěkné řešení ve stylu Left/Right, ale docela by mě zajímalo, jak to bude škálovat, když se člověk pustí do nějakého aplikačního vývoje a ne jen low-level.
Pokud jsi takhle hotov se vším, nemá smysl diskutovat. Ale u tebe mne to překvapilo. Nepříjemně.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 17. 07. 2018, 16:41:58
Je mnoho důvodů, proč nepoužívám proměnné typu boolean. Vystačím si s tímto:
Kód: [Vybrat]
if (isX()) {
...
}
A když potřebuješ výsledek toho isX() vícekrát? (Ptám se pro kamaráda, co má v tom isX() přístup ke clusteru.)

Potřebuji ho vždy jen jednou.

Jak napíšeš test, že je splněná nějaká sada podmínek a přitom ještě zaloguješ vysvětlení?

Podmínky testuji sekvenčně. Každá zaloguje vysvětlení. Máš nějaký příklad?
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 17. 07. 2018, 16:47:13
Podmínky testuji sekvenčně. Každá zaloguje vysvětlení. Máš nějaký příklad?

Přesněji: Napiš ukázku, jak bys to udělal ty a já to refaktoruji do podoby, jak bych to dělal já.
Název: Re:Jak můžu opustit funkci
Přispěvatel: totalbreak 17. 07. 2018, 17:04:44
Abychom se dál nehrabali v těch hovnech, bylo by dobré, aby každý podpořil své tvrzení alespoň citátem nějaké uznávané autority.

If you need more than 3 levels of indentation, you're screwed anyway, and should fix your program.

The goto statement comes in handy when a function exits from multiple locations and some common work such as cleanup has to be done. If there is no cleanup needed then just return directly.

Linus Torvalds, Linux kernel coding style
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kiwi 17. 07. 2018, 18:20:02
Taková chyba principiálně nemůže nestat. Transportní vrstva dodá buď bezchybnou zprávu, nebo nějakou chybu typu timeout při příjmu. Ale co je na tom výjimečného? To je na transportní vrstvě zrovna tak "normální" stav, jako poškozená zpráva na síťové vrstvě.
Výjimky nejsou výjimečné tím, že by k nim docházelo výjimečně málo často, ale tím, že je to výjimka z normálního běhu programu, odchylka od toho, co chci, aby program dělal. K chybám při síťovém transportu může docházet hodně často, ale program je dělaný proto, aby data úspěšně přenášel – neúspěšný přenos je odchylka od tohoto žádaného stavu, proto je to výjimka.

Ještě jinak.
Požadovaný stav je, že dojde správný paket a já ho potvrdím.
Chyba je, že dojde poškozený paket a snažím se to řešit (= NACK, aplikace samoopravnýho kódu,...).
Výjimka je, že se v půlce paketu přeruší spojení a ani po timeoutu nenavážu komunikaci s protistranou.

O level výš je chybějící/přebývající blok dat výjimka (přerušení lajny je furt výjimka - jiný stav je to na úrovni PHY/MAC), protože mám mít zajištěný kompletní data. Ale tam můžu mít třeba stav zprávy UNSIGNED/VALID/INVALID a se špatným podpisem se nastaví jako INVALID a nevolá se výjimka (a stav se prostě zobrazí uživateli).
"Požadovaný stav"? "Normální běh programu"? WTF?!
Žádný stav přeci není "požadovaný" a celý běh programu je "normální". Když si představím stavový diagram programu, nemám důvod některé uzly malovat nějak jinak. Program prostě reaguje na možné události a "chyba" je jen jednou z možných událostí. Záměrně píšu v uvozovkách, protože to je jen naše označení pro určitý stav. Ale to označení je dost zavádějící - chybou totiž ve skutečnosti je jakékoli neošetření/neuvažování možného stavu. Že mi nedojde paket je úplně stejně "normální" stav, jako že dojde. Pokud mám nabídku z 5 položek označených čísly 1-5, je stisk jakékoli klávesy stejně "normální". Přece není žádnou "chybou" pokud uživatel stiskne L a není důvod takovou situaci obsluhovat nějak zcela odlišně než číslice 1-5. Je to úplně normální situace, protože dotyčná funkce mi může vrátit cokoli, co se dá na klávesnici stisknout, a já s tím musím jako programátor počítat.

Jaký mají výjimky kladný efekt na návrh programu? Co je správného na reagování na určité stavy nějakým úplně jiným kanálem někde v úplně jiné části programu? Postnul jsem dva články, na něž Kit napsal, že autor výjimky použil chybně. A jak je to tedy správně?
Název: Re:Jak můžu opustit funkci
Přispěvatel: LongGone 17. 07. 2018, 18:29:58
Pro mainstreamove/aplikacni programovani je to neocenitelny konstrukt.
A proto nové jazyky jako Rust nebo Go výjimky nemají?
Go je odpad.
Pokud jsi takhle hotov se vším, nemá smysl diskutovat. Ale u tebe mne to překvapilo. Nepříjemně.
Mnoho podprůměrných programátorů na Go nadává, takže by to nemělo překvapovat.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 17. 07. 2018, 18:47:07
Pro mainstreamove/aplikacni programovani je to neocenitelny konstrukt.
A proto nové jazyky jako Rust nebo Go výjimky nemají?

Go je odpad.
A Rust má docela pěkné řešení ve stylu Left/Right, ale docela by mě zajímalo, jak to bude škálovat, když se člověk pustí do nějakého aplikačního vývoje a ne jen low-level.
Pokud jsi takhle hotov se vším, nemá smysl diskutovat. Ale u tebe mne to překvapilo. Nepříjemně.

Spousta veci stoji za dlouhe a peclive zvazeni.

Ale fakt ne Go, kde je zoufale videt, ze autori minuli 30 let vyvoje v programovacich jazycich a pak si rekli, ze to zkusi jeste jednou, tentokrat snad lepe.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 17. 07. 2018, 19:09:10
"Požadovaný stav"? "Normální běh programu"? WTF?!
Žádný stav přeci není "požadovaný" a celý běh programu je "normální". Když si představím stavový diagram programu, nemám důvod některé uzly malovat nějak jinak. Program prostě reaguje a možné události a "chyba" je jen jednou z možných událostí. Záměrně píšu v uvozovkách, protože to je jen naše označení pro určitý stav. Ale to označení je dost zavádějící - chybou totiž ve skutečnosti je jakékoli neošetření/neuvažování možného stavu. Že mi nedojde paket je úplně stejně "normální" stav, jako že dojde. Pokud mám nabídku z 5 položek označených čísly 1-5, je stisk jakékoli klávesy stejně "normální". Přece není žádnou "chybou" pokud uživatel stiskne L a není důvod takovou situaci obsluhovat nějak zcela odlišně než číslice 1-5. Je to úplně normální situace, protože dotyčná funkce mi může vrátit cokoli, co se dá na klávesnici stisknout, a já s tím musím jako programátor počítat.
To je typický pohled programátora s klapkami na očích. Pro všechny ostatní je samozřejmě nějaký běh programu normální, a to takový, kvůli kterému ten program používají. Třeba když si chce uživatel vytisknout PDF dokument, je normální běh PDF prohlížeče takový, že uživateli nakonec z tiskárny vyleze papír s vytištěným dokumentem. Můžete mít v programu ošetřené úplně všechny chyby, ale pokud se uživateli ten dokument vytisknout nepodaří, bude oprávněně nadávat, že ten program je k ničemu.

Jeden extrém jsou programy, které s chybami vůbec nepočítají a neošetřují je. Druhý extrém jste popsal vy, a spočívá v tom, že se někdo soustředí jenom na ošetření chyb a zapomene, že kromě toho by ten program také měl ještě něco rozumného dělat.

Jaký mají výjimky kladný efekt na návrh programu? Co je správného na reagování na určité stavy nějakým úplně jiným kanálem někde v úplně jiné části programu? Postnul jsem dva články, na něž Kit napsal, že autor výjimky použil chybně. A jak je to tedy správně?
Správného je na tom to, že se na každý stav reaguje v té části programu, kde se na něj nějak reagovat dá. Například u toho tisku PDF může dojít k tomu, že v průběhu vykreslování stránky na tiskárnu dojde ke ztrátě spojení s tiskárnou. Vykreslovací kód s tím samozřejmě nic neudělá a ani s tím nic dělat nemá, na druhou stranu velice vhodné místo kde takovou událost řešit je kód pro interakci s uživatelem. Který může uživateli třeba zobrazit zprávu, že tiskárna bohužel přestala komunikovat, a nabídnout možnost vytisknout to na jiné tiskárně.
Název: Re:Jak můžu opustit funkci
Přispěvatel: v 17. 07. 2018, 19:34:26
"Požadovaný stav"? "Normální běh programu"? WTF?!
Žádný stav přeci není "požadovaný" a celý běh programu je "normální". Když si představím stavový diagram programu, nemám důvod některé uzly malovat nějak jinak. Program prostě reaguje a možné události a "chyba" je jen jednou z možných událostí. Záměrně píšu v uvozovkách, protože to je jen naše označení pro určitý stav. Ale to označení je dost zavádějící - chybou totiž ve skutečnosti je jakékoli neošetření/neuvažování možného stavu. Že mi nedojde paket je úplně stejně "normální" stav, jako že dojde. Pokud mám nabídku z 5 položek označených čísly 1-5, je stisk jakékoli klávesy stejně "normální". Přece není žádnou "chybou" pokud uživatel stiskne L a není důvod takovou situaci obsluhovat nějak zcela odlišně než číslice 1-5. Je to úplně normální situace, protože dotyčná funkce mi může vrátit cokoli, co se dá na klávesnici stisknout, a já s tím musím jako programátor počítat.
To je typický pohled programátora s klapkami na očích. Pro všechny ostatní je samozřejmě nějaký běh programu normální, a to takový, kvůli kterému ten program používají. Třeba když si chce uživatel vytisknout PDF dokument, je normální běh PDF prohlížeče takový, že uživateli nakonec z tiskárny vyleze papír s vytištěným dokumentem. Můžete mít v programu ošetřené úplně všechny chyby, ale pokud se uživateli ten dokument vytisknout nepodaří, bude oprávněně nadávat, že ten program je k ničemu.

Jeden extrém jsou programy, které s chybami vůbec nepočítají a neošetřují je. Druhý extrém jste popsal vy, a spočívá v tom, že se někdo soustředí jenom na ošetření chyb a zapomene, že kromě toho by ten program také měl ještě něco rozumného dělat.

Jaký mají výjimky kladný efekt na návrh programu? Co je správného na reagování na určité stavy nějakým úplně jiným kanálem někde v úplně jiné části programu? Postnul jsem dva články, na něž Kit napsal, že autor výjimky použil chybně. A jak je to tedy správně?
Správného je na tom to, že se na každý stav reaguje v té části programu, kde se na něj nějak reagovat dá. Například u toho tisku PDF může dojít k tomu, že v průběhu vykreslování stránky na tiskárnu dojde ke ztrátě spojení s tiskárnou. Vykreslovací kód s tím samozřejmě nic neudělá a ani s tím nic dělat nemá, na druhou stranu velice vhodné místo kde takovou událost řešit je kód pro interakci s uživatelem. Který může uživateli třeba zobrazit zprávu, že tiskárna bohužel přestala komunikovat, a nabídnout možnost vytisknout to na jiné tiskárně.
to musí být skvělý pocit, rozumět úplně všemu
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 17. 07. 2018, 19:35:52
Jaký mají výjimky kladný efekt na návrh programu? Co je správného na reagování na určité stavy nějakým úplně jiným kanálem někde v úplně jiné části programu? Postnul jsem dva články, na něž Kit napsal, že autor výjimky použil chybně. A jak je to tedy správně?

Napsal jsem tohle:
Citace
Koukám, že výjimky v C++ jsou skutečně zlo, zejména když je někdo použije tak hloupým způsobem, jako autor těch článků.
Chceš to rozebrat?
Kód: [Vybrat]
try {
    ...
    int rc = fx ();
    if (rc != 0)
        throw std::exception ("Error!");
    ...
catch (std::exception &e) {
    handle_exception ();
}

Tady jsou hned 2 chyby: Použití std::exception a text "Error!". To značně omezuje strukturování výjimek. Nejdříve bys jí měl udělat potomka:
https://www.tutorialspoint.com/cplusplus/cpp_exceptions_handling.htm (https://www.tutorialspoint.com/cplusplus/cpp_exceptions_handling.htm) dole.
Potom můžeš výjimky rozlišovat dle typu. Dále je dobré do nich umístit místo vzniku, text a kódové označení výjimky - obvykle číslo, ale například databáze používají pětiznakový string.

Pokud tohle neuděláš, tak se můžeš klidně dál hádat, že výjimky jsou k ničemu. V surovém stavu, tedy takovém, v jakém nám je servíruje C++, jsou skutečně zlo. Hodně však pomůže, když místo "Error!" napíšeš co a kde se stalo. I použití dalších standardních výjimek může být užitečné, ale je jich málo.
Název: Re:Jak můžu opustit funkci
Přispěvatel: DogWithFleas 17. 07. 2018, 20:00:45
Chceš to rozebrat?
Kód: [Vybrat]
try {
    ...
    int rc = fx ();
    if (rc != 0)
        throw std::exception ("Error!");
    ...
catch (std::exception &e) {
    handle_exception ();
}

Tady jsou hned 2 chyby: Použití std::exception a text "Error!". To značně omezuje strukturování výjimek. Nejdříve bys jí měl udělat potomka:
https://www.tutorialspoint.com/cplusplus/cpp_exceptions_handling.htm (https://www.tutorialspoint.com/cplusplus/cpp_exceptions_handling.htm) dole.
Potom můžeš výjimky rozlišovat dle typu. Dále je dobré do nich umístit místo vzniku, text a kódové označení výjimky - obvykle číslo, ale například databáze používají pětiznakový string.

No hlavne ten kod toho pitomce z blogu je uplne blbe, "throw std::exception ("Error!");" je blbe a ani se nezkompiluje. Jestli nekdo takhle malo schopnej pouziva C++ a nekdo jeste min schopnej se z toho uci, tak se nedivim, ze se tu na patnacti stranach resi return a switch a nevyhody vyjimek...
https://en.cppreference.com/w/cpp/error/exception/exception (https://en.cppreference.com/w/cpp/error/exception/exception)
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 17. 07. 2018, 20:49:37
Je zvláštní, že někteří lidé poté co vykonají velkou potřebu ve veřejném prostoru, mají ještě nutkání se v těch hovnech prohrabávat. Budiž.

Někde v polovině tohoto threadu jsem diskutujícím vytýkal, že pomíjejí kontext. Od té doby myslím jen Kiwi zdůraznil, že pokud píše v C, považuje následující za idiomatické. Různé jazyky mají různé pohledy na to, jak je dobré, aby kód vypadal. Většinou se vyplatí tohoto držet. Je komické se bavit o jediném exit pointu funkce v jazycích, které podporují výjimky, protože exit pointem může být jakékoliv volání funkce, které vyhodí výjimku (pokud to v dané funkci explicitně neošetřím, což zase podpírá smysl výjimek).

I když si Dijkstry považuji, nemyslím si že jeho téměř 50 let staré zásady strukturovaného programování nedoznaly za ta léta určitých změn a nelze je brát dogmaticky. Samozřejmě, že je lepší, když má funkce jen jeden exit point, ale abych toto pravidlo dodržel, nebudu kvůli tomu zavádět třeba 5 řídících proměných. Nakonec některé z těch zásad měly neméně slavné oponenty (Wirth, Knuth) a nemyslím, že kdokoliv z nás se komukoliv z nich rozhledem a vědomostmi alespoň přibližuje.

Abychom se dál nehrabali v těch hovnech, bylo by dobré, aby každý podpořil své tvrzení alespoň citátem nějaké uznávané autority. Takže pro začátek:

Nested conditional code often is written by programmers who are taught to have one exit point from a method. I've found that is a too simplistic rule. When I have no further interest in a method, I signal my lack of interest by getting out. Directing the reader to look at an empty else block only gets in the way of comprehension.
Martin Fowler - Refactoring

Myly "bodka", v hovnach sa hrabete teraz vy :P  Fowlera povazujem za velmi mudreho, ale v tomto s nim nie celkom suhlasim. Ano vyrastal som na pascale, kde to ani inak neslo robit. V niektorych jazykoch je navratova hodnota proste posledna hodnota spomenuta na konci bloku. Ano, ma to tu nevyhodu, ze clovek pouzije viacej riadiacich hodnot (najma, ked sa chce vyhnut prilisnemu zanoreniu). Ale nuti to cloveka viacej uvazovat o toku riadenia procedury, nez ked ukonci proceduru predcasne a tok riadenia je tak rozsekany. (A teraz uvazovat uz vam to von vyskocilo, ale vy by ste aj tak potrebovali vykonat nieco, uz nemozte, tak tam pridate redundantne volanie atd ...).  Vysrat sa do verejneho priestoru nebolo mojim cielom, bol som vsak zomlety Jirsakom - fanusikom predcasneho vypustenia bez diskusie hned ma zacal urazat autistickymi recami, ze neviem programovat.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 17. 07. 2018, 20:59:33
Ano vyrastal som na pascale, kde to ani inak neslo robit.

Také jsem vyrůstal na Pascalu, ale už jsem z něj vyrostl. Posloužil dobře a je třeba jít dál.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kiwi 17. 07. 2018, 22:08:16
"Požadovaný stav"? "Normální běh programu"? WTF?!
Žádný stav přeci není "požadovaný" a celý běh programu je "normální". Když si představím stavový diagram programu, nemám důvod některé uzly malovat nějak jinak. Program prostě reaguje a možné události a "chyba" je jen jednou z možných událostí. Záměrně píšu v uvozovkách, protože to je jen naše označení pro určitý stav. Ale to označení je dost zavádějící - chybou totiž ve skutečnosti je jakékoli neošetření/neuvažování možného stavu. Že mi nedojde paket je úplně stejně "normální" stav, jako že dojde. Pokud mám nabídku z 5 položek označených čísly 1-5, je stisk jakékoli klávesy stejně "normální". Přece není žádnou "chybou" pokud uživatel stiskne L a není důvod takovou situaci obsluhovat nějak zcela odlišně než číslice 1-5. Je to úplně normální situace, protože dotyčná funkce mi může vrátit cokoli, co se dá na klávesnici stisknout, a já s tím musím jako programátor počítat.
To je typický pohled programátora s klapkami na očích. Pro všechny ostatní je samozřejmě nějaký běh programu normální, a to takový, kvůli kterému ten program používají. Třeba když si chce uživatel vytisknout PDF dokument, je normální běh PDF prohlížeče takový, že uživateli nakonec z tiskárny vyleze papír s vytištěným dokumentem. Můžete mít v programu ošetřené úplně všechny chyby, ale pokud se uživateli ten dokument vytisknout nepodaří, bude oprávněně nadávat, že ten program je k ničemu.

Jeden extrém jsou programy, které s chybami vůbec nepočítají a neošetřují je. Druhý extrém jste popsal vy, a spočívá v tom, že se někdo soustředí jenom na ošetření chyb a zapomene, že kromě toho by ten program také měl ještě něco rozumného dělat.
Kde tvrdím, že se soustřeďuji jenom na ošetření chyb a zapomínám kvůli tomu, že má program taky něco rozumného dělat? Nebo jak jste na to přišel? Protože ošetřuji chyby stejně pečlivě jako kterýkoli jiný stav, mám podle vás klapky na očích? Co to pro boha melete za nesmysly?

Jaký mají výjimky kladný efekt na návrh programu? Co je správného na reagování na určité stavy nějakým úplně jiným kanálem někde v úplně jiné části programu? Postnul jsem dva články, na něž Kit napsal, že autor výjimky použil chybně. A jak je to tedy správně?
Správného je na tom to, že se na každý stav reaguje v té části programu, kde se na něj nějak reagovat dá. Například u toho tisku PDF může dojít k tomu, že v průběhu vykreslování stránky na tiskárnu dojde ke ztrátě spojení s tiskárnou. Vykreslovací kód s tím samozřejmě nic neudělá a ani s tím nic dělat nemá, na druhou stranu velice vhodné místo kde takovou událost řešit je kód pro interakci s uživatelem. Který může uživateli třeba zobrazit zprávu, že tiskárna bohužel přestala komunikovat, a nabídnout možnost vytisknout to na jiné tiskárně.
Vhodné místo, kde řešit takovou událost, je v modulu, který zajišťuje komunikaci s tiskárnou - například formou if error && attempt_cntr-- => retry. Pokud tiskárna nereaguje, generuje chybu volajícímu, tedy asi vykreslujícímu kódu. Ten se podle toho zařídí po svém - např. uklizením svého kontextu a propagováním chyby ze své úrovně - zatímco komunikační úroveň zajistila konzistenci svého kontextu a hlásila nahoru chybu s komunikací, vykreslovací modul zajistí konzistenci na své úrovni a hlásí nahoru chybu při vykreslování písmenka X. Volající modul uklidí svůj kontext a propaguje výš chybu při pokusu vytisknout 5. písmenko 10. řádku 23. stránky. Teprve tady někde se o tom zpraví uživatel a případně se mu nabídne, co s tím dál. Může se třeba rozhodnout, že dokument počínaje 23. stránkou dotiskne na jiné tiskárně jak sám naznačujete, nebo překontrolovat tiskárnu a pokračovat v tisku stránkou, kde došlo k chybě apod. Ale pokud do této úrovně spadne nějaká low level chyba "printer communication error", tak co se s tím dá na této úrovni rozumného udělat, kromě "milý uživateli, tiskárna nekomunikuje, hroutím se k zemi"? Mám tomu rozmět tak, že kdybyste takový pdf-prohlížeč psal vy, tak při nějakém nahodilém zajiskření v konektoru se tisk zhroutí a musel bych běžet k tiskárně, abych zjistil, kam až a jestli vůbec se něco vytisklo, abych to pak mohl ručně poslat někam jinam nebo to zkusit znova, tipuji, že nejlépe celé od začátku? Děkuji pěkně, to teda píšete opravdu "velmi kvalitní a robustní" software.

Soustředíte se na nepodstatné detaily a ne na to podstatné, co chtěl ten autor říci, tj. že reakce na chybu je přes výjimky izolována od místa jejího vzniku, což tady někteří neustále vyzdvihujete jako přednost, ale podle mě je to zcela špatně, protože dochází k narušení a ztrátě kontextu. Kdybych reagoval v místě vzniku chyby, nepotřebuji balit informace o ní do žádného objektu, protože všechny dostupné informace o ní mám v rámci jejího kontextu k dispozici. A naopak - vyhození nějakého objektu - byť odvozeného speciálně pro danou úroveň - nemůže tuto informaci a ten kontext nahradit. Ono je to problematické i u těch hardwarových výjimek, ale tím spíše nechápu, proč bych si podobným mechanismem měl komplikovat práci i tam, kde to vůbec není nutné.

Svým způsobem ti rozumím, chápu, že objekt může nést více informací než nějaký errorcode, že je to konzistentní oproti vracení errocodu (návratovou hodnotou? referencí? globální proměnnou? někdy tak, jindy onak?), ale to řešení přes try-catch-throw se mi vůbec nelíbí a myslím, že je velmi znepřehledňující a komplikující.

Vždycky jsem se snažil oddělovat testy chybových stavů od zbytku kódu - IMHO je to ospravedlnění pro returny uprostřed funkcí - nejprve otestuji základní podmínky a případně skončím s chybovým kódem. Dále algoritmus pokračuje už s vědomím, že některé situace v daném bodě nastat nemohou - hodnoty jsou smysluplné, prostředky jsou alokované atp. Ale pořád je ještě spousta situací, kdy se testují podmínky v rámci samotného algoritmu - a tam mi try-catche jeho zápis neuvěřitelně zatemňují a komplikují.

Při ignorování/zapomenutí ošetření chyb z bezprostředně nižší úrovně vnímám výjimky spíš jako debugovací nástroj, ale rozhodně nesdílím názor, který tu opět několikrát padl, že se na to v podstatě díky výjimkám můžu vykašlat a chytit ji někde o 3 úrovně výš. Takto programovat je podle mě prasečina. Důsledné používání principu reinterpretace a případné propagace reinterpretované chyby se mi osvědčil do takové míry, že výjimky vnímám takto negativně.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Filip Jirsák 17. 07. 2018, 22:45:30
Kde tvrdím, že se soustřeďuji jenom na ošetření chyb a zapomínám kvůli tomu, že má program taky něco rozumného dělat? Nebo jak jste na to přišel?
Netvrdíte to nikde, vy to přímo děláte – tady v komentářích. Přišel jsem na to tak, že jsem četl váš komentář.

Vhodné místo, kde řešit takovou událost, je v modulu, který zajišťuje komunikaci s tiskárnou - například formou if error && attempt_cntr-- => retry. Pokud tiskárna nereaguje, generuje chybu volajícímu, tedy asi vykreslujícímu kódu. Ten se podle toho zařídí po svém - např. uklizením svého kontextu a propagováním chyby ze své úrovně - zatímco komunikační úroveň zajistila konzistenci svého kontextu a hlásila nahoru chybu s komunikací, vykreslovací modul zajistí konzistenci na své úrovni a hlásí nahoru chybu při vykreslování písmenka X. Volající modul uklidí svůj kontext a propaguje výš chybu při pokusu vytisknout 5. písmenko 10. řádku 23. stránky. Teprve tady někde se o tom zpraví uživatel a případně se mu nabídne, co s tím dál. Může se třeba rozhodnout, že dokument počínaje 23. stránkou dotiskne na jiné tiskárně jak sám naznačujete, nebo překontrolovat tiskárnu a pokračovat v tisku stránkou, kde došlo k chybě apod. Ale pokud do této úrovně spadne nějaká low level chyba "printer communication error", tak co se s tím dá na této úrovni rozumného udělat, kromě "milý uživateli, tiskárna nekomunikuje, hroutím se k zemi"?
Dobře jste popsal, jak fungují výjimky. Přičemž „volající modul uklidí svůj kontext a propaguje výš chybu“ je jedna z podstatných vlastností výjimek – ten volající modul nemusí o chybě vědět vůbec nic, jenom ví, že došlo k nějaké chybě, tak že má  po sobě uklidit a propagovat chybu dál. Případně doplní k chybě další informace, pokud nějaké má. Další z výhod je, že až do toho místa vyřešení chyby doputuje ta původní low-level výjimka, takže je možné uživateli zobrazit detaily toho, co se stalo. Když to budete řešit návratovým typem, o tyhle detailní informace přijdete, budete tam mít tak maximálně „Chyba -1 – něco je špatně s tiskárnou“. A i to bude dobrý výsledek, protože to znamená, že vykreslovací modul počítal s tím, že bude vykreslovat na tiskárnu, tak pro to měl vyhrazený chybový kód.

Mám tomu rozmět tak, že kdybyste takový pdf-prohlížeč psal vy, tak při nějakém nahodilém zajiskření v konektoru se tisk zhroutí a musel bych běžet k tiskárně, abych zjistil, kam až a jestli vůbec se něco vytisklo, abych to pak mohl ručně poslat někam jinam nebo to zkusit znova, tipuji, že nejlépe celé od začátku? Děkuji pěkně, to teda píšete opravdu "velmi kvalitní a robustní" software.
Máte bujnou fantazii, já jsem nic takového nepsal. Příště zkuste nehodnotit ostatní podle vašich vlastních hloupých nápadů.

Soustředíte se na nepodstatné detaily a ne na to podstatné, co chtěl ten autor říci, tj. že reakce na chybu je přes výjimky izolována od místa jejího vzniku, což tady někteří neustále vyzdvihujete jako přednost, ale podle mě je to zcela špatně, protože dochází k narušení a ztrátě kontextu.
Ke ztrátě kontextu dojde jedině tehdy, pokud ten, kdo vyhazuje výjimku, kontextové informace do výjimky nezabalí. To, že reakce na výjimku je izolovaná od místa jejího vzniku, je správně – vychází to z principu jedné odpovědnosti, kdy každá ucelená část kódu (např. funkce) má dělat jen jednu věc. Pokud ten kód řeší například tisk, je už jeho zodpovědností ten tisk a neměl by řešit další věci, jako např. vypořádání se s výjimkou.
 
Kdybych reagoval v místě vzniku chyby, nepotřebuji balit informace o ní do žádného objektu, protože všechny dostupné informace o ní mám v rámci jejího kontextu k dispozici. A naopak - vyhození nějakého objektu - byť odvozeného speciálně pro danou úroveň - nemůže tuto informaci a ten kontext nahradit.
V místě vzniku té výjimky nemusíte mít informace ani prostředky potřebné k vyřešení té výjimky. Zabalit informace o kontextu výjimky do objektu je sice pracné, ale pokud chcete na výjimku reagovat pořádně, nic jiného vám nezbývá. Ostatně když to porovnáte s vaším postupem – přibalit ty informace do návratového typu, musíte tam ty informace přibalovat také, a ještě navíc o to musíte rozšířit ten návratový typ.

to řešení přes try-catch-throw se mi vůbec nelíbí a myslím, že je velmi znepřehledňující a komplikující.
To je možné, ale pořád je to milionkrát lepší, než když musím myslet na to, že tahle funkce sice podle logiky věci může vracet jen nezáporná čísla, ale někdo se rozhodl, že záporná v tom případě zneužije k hlášení chyb. Takže nejprve musím zjišťovat, zda vlastně funkce skončila úspěšně nebo neúspěšně, a pak musím paralelně vedle sebe řešit obě varianty. A navíc mám k zakódování informací o chybě k dispozici půlku integeru, to opravdu není mnoho.

Ale pořád je ještě spousta situací, kdy se testují podmínky v rámci samotného algoritmu - a tam mi try-catche jeho zápis neuvěřitelně zatemňují a komplikují.
Asi bych potřeboval vidět konkrétní příklad, takhle netuším, co přesně vám připadá zatemňující a komplikující.

Při ignorování/zapomenutí ošetření chyb z bezprostředně nižší úrovně vnímám výjimky spíš jako debugovací nástroj, ale rozhodně nesdílím názor, který tu opět několikrát padl, že se na to v podstatě díky výjimkám můžu vykašlat a chytit ji někde o 3 úrovně výš. Takto programovat je podle mě prasečina. Důsledné používání principu reinterpretace a případné propagace reinterpretované chyby se mi osvědčil do takové míry, že výjimky vnímám takto negativně.
Rozhodně by to nemělo být, že se na výjimku vykašlu – to, že jí budu beze změny propagovat dál, má být vždy vědomé rozhodnutí. Kvůli tomu třeba Java zavedla ty nenáviděné kontrolované výjimky – aby se jimi programátor musel zabývat. Programátoři to bohužel zvládají obejít i tak. Problém je v tom, že výjimka by se neměla reinterpretovat, spíš by se k ní měly nabalovat další informace – tj. jedna instance výjimky by postupně měla implementovat další rozhraní. S tím mají staticky typované jazyky problém.
Název: Re:Jak můžu opustit funkci
Přispěvatel: n 17. 07. 2018, 23:22:22
Nechybí ti tam náhodou releaseMem() ve větvi if(!hwInit()) ?

Koukám, že chybí, chyba při kopírování. Normálně je odeslání chyby zabaleno v makru, tady jsem to ručně rozepsal...

BTW: Ten mutex, thread a queue není třeba uklízet?

Jo, ten se uklidí. Při initu jsou handle NULL. Funkce releaseMem testuje ty pointery a pokud je některý pointer NULL, uvolní ho. Takže bez ohledu na místo chyby se paměť uvolní...

Zlate C++(11+), tohle vsechno resi RAII(i kdyz ta zkratka je zavadejici), mutexy, dealokace(uvolnovani jakychkoli prostredku) v destruktoru, ktery je automaticky volany pri vypadnuti ze scopu. V podstate v novejsim(11+) C++ pri rozumnem programovani o memory leaky(a NEJEN - o jakekoli resource leaky) zakopnete jen velmi vyjimecne.
Jinak samozrejme souhlasim (dnes necekane i s)Kitem a PetrM. Tohle je klasika:
Kód: [Vybrat]
1) checknout chybne vstupy - pripadne vyhodit chybu
2) specialni hodnoty - vyhodit specialni vysledek
3) klasicke zpracovani, behem nehoz pokud natrefime na chybu, tak ji vyhodime co nejdriv.
....
oproti Balkiho(jak psal Kiwi):
Kód: [Vybrat]
1) checkneme chyby
      ...nekolikrat zanorene 2) checkenem specialni hodnoty
         ...nekolikrat zanorene... 3) delame vypocet.
      ... nekolikrat zanorene totalne neprehledne zacneme resit elsy na specialni vstupy
    ...a tady idealne dalsi polozapomenute elsy na chyby
     

To je "prehledne" az to boli... to vede k ruznym Xkrat zanorenym ifum, nebo podminkam typu:
Kód: [Vybrat]
while (neni chybaA && neni chybaB .... && neni chybaXY) {
...
(a "idealne" vevnitr vnorene cykly s o jednou podminkou min)

.. nebo jeste lepsi:
Kód: [Vybrat]
while (nenastala_jakakoli_blize_nespecifikovana_chyba_o_ktere_vim_prd) {
...
}
.. anebo nejlepsi:
Kód: [Vybrat]
while (neni chybaA) {
  if (v poradku - delej_neco_co_nema_samoosobe_vyznam_ale_oddel_to_do_funkce_jmenem_wtf)
    if (v poradku - wtf_fce_2)
        ....
}
 
Název: Re:Jak můžu opustit funkci
Přispěvatel: DogWithFleas 17. 07. 2018, 23:25:19
Soustředíte se na nepodstatné detaily a ne na to podstatné, co chtěl ten autor říci, tj. že reakce na chybu je přes výjimky izolována od místa jejího vzniku, což tady někteří neustále vyzdvihujete jako přednost, ale podle mě je to zcela špatně, protože dochází k narušení a ztrátě kontextu. Kdybych reagoval v místě vzniku chyby, nepotřebuji balit informace o ní do žádného objektu, protože všechny dostupné informace o ní mám v rámci jejího kontextu k dispozici. A naopak - vyhození nějakého objektu - byť odvozeného speciálně pro danou úroveň - nemůže tuto informaci a ten kontext nahradit. Ono je to problematické i u těch hardwarových výjimek, ale tím spíše nechápu, proč bych si podobným mechanismem měl komplikovat práci i tam, kde to vůbec není nutné.
A co kdyz nemas zadny vliv na misto vzniku, co kdyz tu knihovnu psal nekdo uplne jiny? Ma ti ji propagovat pres vsechny ty returny? Co kdyz to ani neni mozne (protoze treba vraci int v celem jeho rozsahu)? Budes kazdy return z kazde funkce resit pres if? Citelnost utrpi.

Treba ve tvem kontextu (embedded) jsou vyjimky na skodu, ale to preci neznamena, ze jsou na skodu obecne.
Název: Re:Jak můžu opustit funkci
Přispěvatel: n 17. 07. 2018, 23:30:19
Ok, vy si kodte taky softver, co vam nespracuje vstup na vystup, lebo vam sa nepaci. Ked sa vstup ale uctuje, tak sa nemoze vyparit. Musi sa oznacit patricne spracovat, opravit a oznacit ako chybny pre dalsie pouzitie. Ono, ked sa spracuva kvantum dat realtime a ide zo modulu A do modulu B cez ine moduly, tak sa asi zakaznik spyta, ze kam mu nieco zmizlo, nie?

Účetnictví není moc realtime, tam se prodlevy do několika sekund snesou. Pokud se něco nepovede, je potřeba vyhodit a zalogovat výjimku. V C to moc nejde a tak se na to vymýšlí různé berličky, i když jsou vcelku zbytečné.

To nie je uctovnictvo.

Viděl jsem jednu skutečně realtime aplikaci v C, která ze země řídí přistání letadel pomocí radarů a dalších senzorů. Pokud nejde o život, jde o ho*no. Před touto aplikací však mám respekt.
Aplikace tohoto typu((kde zalezi na zivotech, nebo hodne velkych prachach) se vetsinou pisou v omezenem C, kde se prostredky nealokuji za behu, ale na zacatku a jsou presne spocitane jeste pred zacatkem behu, takze k leakum nedochazi;  prekladace i cely behovy system je certifikovany, testovaci systemy jsou certifikovane, kazdy prd je certifikovany... jako nechtel bych se do toho sveta vratit, ale neco do sebe to ma...
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 18. 07. 2018, 00:07:44
Viděl jsem jednu skutečně realtime aplikaci v C, která ze země řídí přistání letadel pomocí radarů a dalších senzorů. Pokud nejde o život, jde o ho*no. Před touto aplikací však mám respekt.
Aplikace tohoto typu((kde zalezi na zivotech, nebo hodne velkych prachach) se vetsinou pisou v omezenem C, kde se prostredky nealokuji za behu, ale na zacatku a jsou presne spocitane jeste pred zacatkem behu, takze k leakum nedochazi;  prekladace i cely behovy system je certifikovany, testovaci systemy jsou certifikovane, kazdy prd je certifikovany... jako nechtel bych se do toho sveta vratit, ale neco do sebe to ma...

To souhlasí. Proto jsem vzpomínal Fortran, který tyto certifikace má a je pro podobné účely mnohem výhodnější. Je v něm docela dost užitečných vychytávek, které C/C++ nemá a zřejmě je ani mít nebude.
Název: Re:Jak můžu opustit funkci
Přispěvatel: n 18. 07. 2018, 00:27:27
Viděl jsem jednu skutečně realtime aplikaci v C, která ze země řídí přistání letadel pomocí radarů a dalších senzorů. Pokud nejde o život, jde o ho*no. Před touto aplikací však mám respekt.
Aplikace tohoto typu((kde zalezi na zivotech, nebo hodne velkych prachach) se vetsinou pisou v omezenem C, kde se prostredky nealokuji za behu, ale na zacatku a jsou presne spocitane jeste pred zacatkem behu, takze k leakum nedochazi;  prekladace i cely behovy system je certifikovany, testovaci systemy jsou certifikovane, kazdy prd je certifikovany... jako nechtel bych se do toho sveta vratit, ale neco do sebe to ma...

To souhlasí. Proto jsem vzpomínal Fortran, který tyto certifikace má a je pro podobné účely mnohem výhodnější. Je v něm docela dost užitečných vychytávek, které C/C++ nemá a zřejmě je ani mít nebude.

S Fortranem mam prilis male zkusenosti, takze si nedovolim vubec nejake toto porovnavat, ci dokonce hodnotit. Chtel jsem tim jenom rict, ze C/C++ je relativne velmi presne specifikovany jazyk(samozrejme neni bezchybny - zvlaste vzhledem ke kouli na noze vyplyvajici z dodrzovane zpetne kompatibility s davnymi(dnes uz prokazetelne spatnymi) rozhodnutimi v minulosti), kde omezena mnozina jazyka muze garantovat presne a dobre odhadnutelne/"predikovatelne"(to snad umi kazdy jazyk, ale ne vzdy je jednoduche domyslet dusledky) chovani v realnem svete.
Název: Re:Jak můžu opustit funkci
Přispěvatel: . 18. 07. 2018, 02:13:56
Pro mainstreamove/aplikacni programovani je to neocenitelny konstrukt.
A proto nové jazyky jako Rust nebo Go výjimky nemají?

Go je odpad.
A Rust má docela pěkné řešení ve stylu Left/Right, ale docela by mě zajímalo, jak to bude škálovat, když se člověk pustí do nějakého aplikačního vývoje a ne jen low-level.
Pokud jsi takhle hotov se vším, nemá smysl diskutovat. Ale u tebe mne to překvapilo. Nepříjemně.

Spousta veci stoji za dlouhe a peclive zvazeni.

Ale fakt ne Go, kde je zoufale videt, ze autori minuli 30 let vyvoje v programovacich jazycich a pak si rekli, ze to zkusi jeste jednou, tentokrat snad lepe.
Moudří lidé často používají slova jako zpravidla, obvykle a většinou, protože ví, jak problematické je vynášení kategorických soudů. To jen pro hlupáky jsou všichni hloupí.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 18. 07. 2018, 06:22:15
Moudří lidé často používají slova jako zpravidla, obvykle a většinou, protože ví, jak problematické je vynášení kategorických soudů. To jen pro hlupáky jsou všichni hloupí.

Moudří lidé takové slova nepoužívají, protože je to zbytečná slovní vata. Moudrý poslucháč chápe, že něco v určitém kontextu prostě neplatí.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 18. 07. 2018, 06:27:03
Moudří lidé často používají slova jako zpravidla, obvykle a většinou, protože ví, jak problematické je vynášení kategorických soudů. To jen pro hlupáky jsou všichni hloupí.

Moudří lidé takové slova nepoužívají, protože je to zbytečná slovní vata. Moudrý poslucháč chápe, že něco v určitém kontextu prostě neplatí.

Teda čo sa týka urážok jazyka go, je kontext niekde v zadeki. Osobne ten jazyk nepoznám, ale asi budú mať dôvod, prečo rôzne vychytávky odignorovali.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 18. 07. 2018, 07:34:46
Pro mainstreamove/aplikacni programovani je to neocenitelny konstrukt.
A proto nové jazyky jako Rust nebo Go výjimky nemají?

Go je odpad.
A Rust má docela pěkné řešení ve stylu Left/Right, ale docela by mě zajímalo, jak to bude škálovat, když se člověk pustí do nějakého aplikačního vývoje a ne jen low-level.
Pokud jsi takhle hotov se vším, nemá smysl diskutovat. Ale u tebe mne to překvapilo. Nepříjemně.

Spousta veci stoji za dlouhe a peclive zvazeni.

Ale fakt ne Go, kde je zoufale videt, ze autori minuli 30 let vyvoje v programovacich jazycich a pak si rekli, ze to zkusi jeste jednou, tentokrat snad lepe.
Moudří lidé často používají slova jako zpravidla, obvykle a většinou, protože ví, jak problematické je vynášení kategorických soudů. To jen pro hlupáky jsou všichni hloupí.

A proto take pisi, ze "Spousta veci stoji za dlouhe a peclive zvazeni."

Ale na druhou stranu... clovek nemuze meditovat nad kazdym nesmyslem, to by pak nedelal nic jineho.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 18. 07. 2018, 07:42:54
Podmínky testuji sekvenčně. Každá zaloguje vysvětlení. Máš nějaký příklad?

Přesněji: Napiš ukázku, jak bys to udělal ty a já to refaktoruji do podoby, jak bych to dělal já.

Zhruba neco takoveho:

Kód: [Vybrat]
val readyA = isReadyAForDay(d)
val readyB = isReadyBForDay(d)
val readyAlternativeA = isReadyAlternativeForDay(d)
...

val ready = (readyA & readyB) | (readyAlternativeA & something)

log.debug("Operace Robert Dabel day=${d} is ready=${ready} (readyA=${readyA}, readyB=${readyB}, readyAlternativeA=${readyAlternativeA}) ")

Posunout logovani dovnitr jednotlivych isReadyX _neni_ alternativa.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 18. 07. 2018, 07:46:21
[/code]
oproti Balkiho(jak psal Kiwi):
Kód: [Vybrat]
1) checkneme chyby
      ...nekolikrat zanorene 2) checkenem specialni hodnoty
         ...nekolikrat zanorene... 3) delame vypocet.
      ... nekolikrat zanorene totalne neprehledne zacneme resit elsy na specialni vstupy
    ...a tady idealne dalsi polozapomenute elsy na chyby
     

No lebo ste to museli presne takto retardovane napisat, aj ked sa to da bez predcasneho vypustenia a krajsie. Ze to neviete, neznamena, ze musite takto znevazovat druhych.
Název: Re:Jak můžu opustit funkci
Přispěvatel: LambdaBender 18. 07. 2018, 08:00:29
Moudří lidé často používají slova jako zpravidla, obvykle a většinou, protože ví, jak problematické je vynášení kategorických soudů. To jen pro hlupáky jsou všichni hloupí.
Moudří lidé takové slova nepoužívají, protože je to zbytečná slovní vata. Moudrý poslucháč chápe, že něco v určitém kontextu prostě neplatí.
Teda čo sa týka urážok jazyka go [...] asi budú mať dôvod, prečo rôzne vychytávky odignorovali.
Go navrhly špičky v oboru s hromadou zkušeností a zcela jistě je jim upřímně u pr..le, že nějaký pologramotný PHP šmudla jejich jazyk uráží.
Název: Re:Jak můžu opustit funkci
Přispěvatel: balki 18. 07. 2018, 08:07:58
Moudří lidé často používají slova jako zpravidla, obvykle a většinou, protože ví, jak problematické je vynášení kategorických soudů. To jen pro hlupáky jsou všichni hloupí.
Moudří lidé takové slova nepoužívají, protože je to zbytečná slovní vata. Moudrý poslucháč chápe, že něco v určitém kontextu prostě neplatí.
Teda čo sa týka urážok jazyka go [...] asi budú mať dôvod, prečo rôzne vychytávky odignorovali.
Go navrhly špičky v oboru s hromadou zkušeností a zcela jistě je jim upřímně u pr..le, že nějaký pologramotný PHP šmudla jejich jazyk uráží.

Ja by som povedal, ze to zajtra zabalia, lebo na root.cz ich ohovarali vo flejme :) Najma ken thompson, ked roky pocuval urazky na unix. Ale toto to je moc! :)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 18. 07. 2018, 08:11:34
Go navrhly špičky v oboru s hromadou zkušeností a zcela jistě je jim upřímně u pr..le, že nějaký pologramotný PHP šmudla jejich jazyk uráží.

Pokud mi pamet slouzi, tak ho nenavrhoval nikdo, kdo pred tim navrhl jiny dobry jazyk..
Zasluhy trebas pro navrh Unixu jmaji nekteri z nich nepopiratelne, ale ze je nekdo schopny navrhnut OS z nej nedela dobreho navrhare jazyka.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Géomètre 18. 07. 2018, 08:23:16
Go navrhly špičky v oboru s hromadou zkušeností
Pokud mi pamet slouzi, tak ho nenavrhoval nikdo, kdo pred tim navrhl jiny dobry jazyk..
Zasluhy trebas pro navrh Unixu jmaji nekteri z nich nepopiratelne, ale ze je nekdo schopny navrhnut OS z nej nedela dobreho navrhare jazyka.
A co je teda na Go špatně? Jen pro zajímavost, nechci ho hájit ani vychvalovat, ale pár věcí jsem v něm psal a na žádné zásadní problémy jsem nenarazil. Na rozdíl od jiných megasupernových slepenců...
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 18. 07. 2018, 08:47:37
Go navrhly špičky v oboru s hromadou zkušeností
Pokud mi pamet slouzi, tak ho nenavrhoval nikdo, kdo pred tim navrhl jiny dobry jazyk..
Zasluhy trebas pro navrh Unixu jmaji nekteri z nich nepopiratelne, ale ze je nekdo schopny navrhnut OS z nej nedela dobreho navrhare jazyka.
A co je teda na Go špatně? Jen pro zajímavost, nechci ho hájit ani vychvalovat, ale pár věcí jsem v něm psal a na žádné zásadní problémy jsem nenarazil. Na rozdíl od jiných megasupernových slepenců...

Např. nemůžeš napsat typově bezpečnostné kolekce.
Název: Re:Jak můžu opustit funkci
Přispěvatel: dustin 18. 07. 2018, 08:59:22
a tam mi try-catche jeho zápis neuvěřitelně zatemňují a komplikují.

Pokud je část algoritmu obalena chycením výjimky (předpokládám, že je chytána na správné úrovni), zřejmě ta část provádí nějakou ucelenou operaci, kterou lze nějak vhodně popisně pojmenovat. Ideální název pro metodu. Kǒd s try/catch už dělá něco jiného - řeší případný chybový stav - zaslouží si tedy umístit do metody s jiným názvem.

Samozřejmě když se try/catch nasype do jedné metody s vlastním výkonným kódem, začne se to zatemňovat. Ale to neplatí jen pro try/catch. Když tu čtu až o 3-4 úrovních zanoření, nechtěl bych se v takovém klubku hadů každý den vrtat...
Název: Re:Jak můžu opustit funkci
Přispěvatel: Géomètre 18. 07. 2018, 09:36:49
Go navrhly špičky v oboru s hromadou zkušeností
Pokud mi pamet slouzi, tak ho nenavrhoval nikdo, kdo pred tim navrhl jiny dobry jazyk..
Zasluhy trebas pro navrh Unixu jmaji nekteri z nich nepopiratelne, ale ze je nekdo schopny navrhnut OS z nej nedela dobreho navrhare jazyka.
A co je teda na Go špatně? Jen pro zajímavost, nechci ho hájit ani vychvalovat, ale pár věcí jsem v něm psal a na žádné zásadní problémy jsem nenarazil. Na rozdíl od jiných megasupernových slepenců...
Např. nemůžeš napsat typově bezpečnostné kolekce.
Ty už má Go zabudované. Je-li tohle jediná závada, je to oproti jiným jazykům docela pohoda.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 18. 07. 2018, 10:19:18
Go navrhly špičky v oboru s hromadou zkušeností
Pokud mi pamet slouzi, tak ho nenavrhoval nikdo, kdo pred tim navrhl jiny dobry jazyk..
Zasluhy trebas pro navrh Unixu jmaji nekteri z nich nepopiratelne, ale ze je nekdo schopny navrhnut OS z nej nedela dobreho navrhare jazyka.
A co je teda na Go špatně? Jen pro zajímavost, nechci ho hájit ani vychvalovat, ale pár věcí jsem v něm psal a na žádné zásadní problémy jsem nenarazil. Na rozdíl od jiných megasupernových slepenců...
Např. nemůžeš napsat typově bezpečnostné kolekce.
Ty už má Go zabudované. Je-li tohle jediná závada, je to oproti jiným jazykům docela pohoda.

Coz je presne tend duvod, proc je to spatne.

Ze designer zakladni knihovny muze delat veci, co programatori nemohou je typicky language-smell. (Viz napr. + pro Stringy v Jave)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 18. 07. 2018, 13:03:53
A co je teda na Go špatně? Jen pro zajímavost, nechci ho hájit ani vychvalovat, ale pár věcí jsem v něm psal a na žádné zásadní problémy jsem nenarazil. Na rozdíl od jiných megasupernových slepenců...
Např. nemůžeš napsat typově bezpečnostné kolekce.

FUD jako obvykle. Jazyk Go generika prostě nepotřebuje a někteří lidé se s tím nedokáží smířit.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 18. 07. 2018, 13:30:59
A co je teda na Go špatně? Jen pro zajímavost, nechci ho hájit ani vychvalovat, ale pár věcí jsem v něm psal a na žádné zásadní problémy jsem nenarazil. Na rozdíl od jiných megasupernových slepenců...
Např. nemůžeš napsat typově bezpečnostné kolekce.

FUD jako obvykle. Jazyk Go generika prostě nepotřebuje a někteří lidé se s tím nedokáží smířit.

Pricemz to, ze je nepotrebuje nerikaji ani jeho autori... s tim, ze je stejne neumeli dobre naprogramovat, tak to mozna zkusi nekdy v budoucnu:

https://golang.org/doc/faq#generics
Název: Re:Jak můžu opustit funkci
Přispěvatel: totalbreak 18. 07. 2018, 13:58:01
FUD jako obvykle. Jazyk Go generika prostě nepotřebuje a někteří lidé se s tím nedokáží smířit.

Jistě že nepotřebuje, nepřítomnost generik v Go jde vyřešit velice snadno a elegantně: https://www.reddit.com/r/rust/comments/5penft/parallelizing_enjarify_in_go_and_rust/

Ještě někdo bude tvrdit, že to není dobře navržený jazyk?
Název: Re:Jak můžu opustit funkci
Přispěvatel: gll 18. 07. 2018, 14:20:35
FUD jako obvykle. Jazyk Go generika prostě nepotřebuje a někteří lidé se s tím nedokáží smířit.

Jistě že nepotřebuje, nepřítomnost generik v Go jde vyřešit velice snadno a elegantně: https://www.reddit.com/r/rust/comments/5penft/parallelizing_enjarify_in_go_and_rust/

Ještě někdo bude tvrdit, že to není dobře navržený jazyk?

příspěvek úplně mimo. Žádný ImmutableTreeList v odkazované stránce není. Proto nemám rád reddit. Místo diskuze jen sebeutvrzování. Na prvním místě většinou příspěvek hatující konkurenční technologii.
Název: Re:Jak můžu opustit funkci
Přispěvatel: totalbreak 18. 07. 2018, 14:52:59
příspěvek úplně mimo. Žádný ImmutableTreeList v odkazované stránce není. Proto nemám rád reddit. Místo diskuze jen sebeutvrzování. Na prvním místě většinou příspěvek hatující konkurenční technologii.

To nevadí, že jsi to nepochopil, zkus to znovu a lépe. Najdi si ve slovníku pojem ironie a podívej se, jaký je rozdíl mezi znaky <> a ᐸᐳ. Autor ImmutableTreeListᐸElementTᐳ problém vyřešil, generika si do go dodělal, je to flexibilní a dobře navržený jazyk ;).
Název: Re:Jak můžu opustit funkci
Přispěvatel: gll 18. 07. 2018, 15:07:32
příspěvek úplně mimo. Žádný ImmutableTreeList v odkazované stránce není. Proto nemám rád reddit. Místo diskuze jen sebeutvrzování. Na prvním místě většinou příspěvek hatující konkurenční technologii.

To nevadí, že jsi to nepochopil, zkus to znovu a lépe. Najdi si ve slovníku pojem ironie a podívej se, jaký je rozdíl mezi znaky <> a ᐸᐳ. Autor ImmutableTreeListᐸElementTᐳ problém vyřešil, generika si do go dodělal, je to flexibilní a dobře navržený jazyk ;).

pochopil, ale nesouvisí s diskutovaným postem. Jedná se o tzv. low effort komentáře. Ten první nahrává druhému. Můžete je postnout pod cokoliv v daném subredditu a nasbírat na tom karmu. Nemusíte se zdržovat čtením odkazu. Lidem, kteří četli odkaz a přišli o něm diskutovt to může vadit, ale těch je bohužel menšina.
Název: Re:Jak můžu opustit funkci
Přispěvatel: totalbreak 18. 07. 2018, 15:17:33
pochopil, ale nesouvisí s diskutovaným postem. Jedná se o tzv. low effort komentáře. Ten první nahrává druhému. Můžete je postnout pod cokoliv v daném subredditu a nasbírat na tom karmu. Nemusíte se zdržovat čtením odkazu. Lidem, kteří četli odkaz a přišli o něm diskutovt to může vadit, ale těch je bohužel menšina.

Komentáře na redditu neřeším. Přijde ti jinak normální dodělávat do jazyka generika s využitím obskurních znaků kanadské abecedy a textového preprocesoru? Může to mít dva důvody. Autor ImmutableTreeListᐸElementTᐳ generika ve skutečnosti vůbec nepotřebuje a takhle prasí úplně zbytečně. Nebo ten jazyk nebude zase tak úplně ideálně navržený...
Název: Re:Jak můžu opustit funkci
Přispěvatel: dustin 18. 07. 2018, 15:22:19
Přijde ti jinak normální dodělávat do jazyka generika s využitím obskurních znaků kanadské abecedy a textového preprocesoru?

Tak váhám, zda jsi to opravdu myslel ironicky...
Název: Re:Jak můžu opustit funkci
Přispěvatel: gll 18. 07. 2018, 15:27:29
pochopil, ale nesouvisí s diskutovaným postem. Jedná se o tzv. low effort komentáře. Ten první nahrává druhému. Můžete je postnout pod cokoliv v daném subredditu a nasbírat na tom karmu. Nemusíte se zdržovat čtením odkazu. Lidem, kteří četli odkaz a přišli o něm diskutovt to může vadit, ale těch je bohužel menšina.

Komentáře na redditu neřeším. Přijde ti jinak normální dodělávat do jazyka generika s využitím obskurních znaků kanadské abecedy a textového preprocesoru? Může to mít dva důvody. Autor ImmutableTreeListᐸElementTᐳ generika ve skutečnosti vůbec nepotřebuje a takhle prasí úplně zbytečně. Nebo ten jazyk nebude zase tak úplně ideálně navržený...

normální to není a také to nikdo nedělá. Je to jen vtip.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 18. 07. 2018, 15:46:21
pochopil, ale nesouvisí s diskutovaným postem. Jedná se o tzv. low effort komentáře. Ten první nahrává druhému. Můžete je postnout pod cokoliv v daném subredditu a nasbírat na tom karmu. Nemusíte se zdržovat čtením odkazu. Lidem, kteří četli odkaz a přišli o něm diskutovt to může vadit, ale těch je bohužel menšina.

Komentáře na redditu neřeším. Přijde ti jinak normální dodělávat do jazyka generika s využitím obskurních znaků kanadské abecedy a textového preprocesoru? Může to mít dva důvody. Autor ImmutableTreeListᐸElementTᐳ generika ve skutečnosti vůbec nepotřebuje a takhle prasí úplně zbytečně. Nebo ten jazyk nebude zase tak úplně ideálně navržený...

normální to není a také to nikdo nedělá. Je to jen vtip.

Takze programatori v Go radeji nepisi vlastni datove struktury a pokud je pisi, tak je bud  nemohou pouzit bezpecne nebo nemohou pouzit univerzalne?
Název: Re:Jak můžu opustit funkci
Přispěvatel: gll 18. 07. 2018, 15:54:48
Takze programatori v Go radeji nepisi vlastni datove struktury a pokud je pisi, tak je bud  nemohou pouzit bezpecne nebo nemohou pouzit univerzalne?

Preprocesory existují, ale pochybuji, že někdo používá indiánskou abecedu. Já se Go nezastávám, jen mi přijde hloupé sbírat body kritikou Go na /r/rust. Kritikou založenou na výmyslu.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 18. 07. 2018, 16:18:52
Takze programatori v Go radeji nepisi vlastni datove struktury a pokud je pisi, tak je bud  nemohou pouzit bezpecne nebo nemohou pouzit univerzalne?

Preprocesory existují, ale pochybuji, že někdo používá indiánskou abecedu. Já se Go nezastávám, jen mi přijde hloupé sbírat body kritikou Go na /r/rust. Kritikou založenou na výmyslu.

Aha, takze hlavni problem je v te pouzite abecede? :-O
Název: Re:Jak můžu opustit funkci
Přispěvatel: Géomètre 18. 07. 2018, 16:30:13
Takze programatori v Go radeji nepisi vlastni datove struktury a pokud je pisi, tak je bud  nemohou pouzit bezpecne nebo nemohou pouzit univerzalne?
Preprocesory existují, ale pochybuji, že někdo používá indiánskou abecedu. Já se Go nezastávám, jen mi přijde hloupé sbírat body kritikou Go na /r/rust. Kritikou založenou na výmyslu.
Navíc vzhledem k tomu, co se v Go typicky píše, stačí ta generika, která jazyk má.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 19. 07. 2018, 12:00:32
Přesněji: Napiš ukázku, jak bys to udělal ty a já to refaktoruji do podoby, jak bych to dělal já.

Zhruba neco takoveho:

Kód: [Vybrat]
val readyA = isReadyAForDay(d)
val readyB = isReadyBForDay(d)
val readyAlternativeA = isReadyAlternativeForDay(d)
...

val ready = (readyA & readyB) | (readyAlternativeA & something)

log.debug("Operace Robert Dabel day=${d} is ready=${ready} (readyA=${readyA}, readyB=${readyB}, readyAlternativeA=${readyAlternativeA}) ")

Posunout logovani dovnitr jednotlivych isReadyX _neni_ alternativa.

Trochu cekam, Kide, zda predvedes nejaky refaktoring nebo refucktoring. At od tebe taky vidime nejaky kod ;-)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 19. 07. 2018, 12:54:38
Přesněji: Napiš ukázku, jak bys to udělal ty a já to refaktoruji do podoby, jak bych to dělal já.

Zhruba neco takoveho:

Kód: [Vybrat]
val readyA = isReadyAForDay(d)
val readyB = isReadyBForDay(d)
val readyAlternativeA = isReadyAlternativeForDay(d)
...

val ready = (readyA & readyB) | (readyAlternativeA & something)

log.debug("Operace Robert Dabel day=${d} is ready=${ready} (readyA=${readyA}, readyB=${readyB}, readyAlternativeA=${readyAlternativeA}) ")

Posunout logovani dovnitr jednotlivych isReadyX _neni_ alternativa.

Trochu cekam, Kide, zda predvedes nejaky refaktoring nebo refucktoring. At od tebe taky vidime nejaky kod ;-)

Tohle se mi Ontro úplně ztratilo v historii. Není na tom co refaktorovat, protože všechny požadované hodnoty jsou boolean. Snad jen hlášení do logu, protože konstanty true a false bych v nich číst nechtěl.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 19. 07. 2018, 13:08:33
Přesněji: Napiš ukázku, jak bys to udělal ty a já to refaktoruji do podoby, jak bych to dělal já.

Zhruba neco takoveho:

Kód: [Vybrat]
val readyA = isReadyAForDay(d)
val readyB = isReadyBForDay(d)
val readyAlternativeA = isReadyAlternativeForDay(d)
...

val ready = (readyA & readyB) | (readyAlternativeA & something)

log.debug("Operace Robert Dabel day=${d} is ready=${ready} (readyA=${readyA}, readyB=${readyB}, readyAlternativeA=${readyAlternativeA}) ")

Posunout logovani dovnitr jednotlivych isReadyX _neni_ alternativa.

Trochu cekam, Kide, zda predvedes nejaky refaktoring nebo refucktoring. At od tebe taky vidime nejaky kod ;-)

Tohle se mi Ontro úplně ztratilo v historii. Není na tom co refaktorovat, protože všechny požadované hodnoty jsou boolean. Snad jen hlášení do logu, protože konstanty true a false bych v nich číst nechtěl.

Takže boolovské proměnné zas tak fuj nejsou?
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 19. 07. 2018, 13:45:00
Tohle se mi Ontro úplně ztratilo v historii. Není na tom co refaktorovat, protože všechny požadované hodnoty jsou boolean. Snad jen hlášení do logu, protože konstanty true a false bych v nich číst nechtěl.
Takže boolovské proměnné zas tak fuj nejsou?

Bylo by ti snad milejší, kdybych tuhle kriplovinu refaktoroval za každou cenu jenom proto, abych si nahonil ego?
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 19. 07. 2018, 14:09:17
Tohle se mi Ontro úplně ztratilo v historii. Není na tom co refaktorovat, protože všechny požadované hodnoty jsou boolean. Snad jen hlášení do logu, protože konstanty true a false bych v nich číst nechtěl.
Takže boolovské proměnné zas tak fuj nejsou?

Bylo by ti snad milejší, kdybych tuhle kriplovinu refaktoroval za každou cenu jenom proto, abych si nahonil ego?

Ne, pochopitelne ne. Protoze ocividne nema smysl dotlacit kod do stavu, kde opdovida nejakemu nesmyslnemu pozadavku jen PROTOZE PROTO.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 19. 07. 2018, 14:25:27
Tohle se mi Ontro úplně ztratilo v historii. Není na tom co refaktorovat, protože všechny požadované hodnoty jsou boolean. Snad jen hlášení do logu, protože konstanty true a false bych v nich číst nechtěl.
Takže boolovské proměnné zas tak fuj nejsou?
Bylo by ti snad milejší, kdybych tuhle kriplovinu refaktoroval za každou cenu jenom proto, abych si nahonil ego?
Ne, pochopitelne ne. Protoze ocividne nema smysl dotlacit kod do stavu, kde opdovida nejakemu nesmyslnemu pozadavku jen PROTOZE PROTO.

Šlo mi o to, že booleovské proměnné bývají nadužívány a jejich odstranění zpravidla zkrátí a zpřehlední kód.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 19. 07. 2018, 14:53:15
Tohle se mi Ontro úplně ztratilo v historii. Není na tom co refaktorovat, protože všechny požadované hodnoty jsou boolean. Snad jen hlášení do logu, protože konstanty true a false bych v nich číst nechtěl.
Takže boolovské proměnné zas tak fuj nejsou?
Bylo by ti snad milejší, kdybych tuhle kriplovinu refaktoroval za každou cenu jenom proto, abych si nahonil ego?
Ne, pochopitelne ne. Protoze ocividne nema smysl dotlacit kod do stavu, kde opdovida nejakemu nesmyslnemu pozadavku jen PROTOZE PROTO.

Šlo mi o to, že booleovské proměnné bývají nadužívány a jejich odstranění zpravidla zkrátí a zpřehlední kód.

Tak to jsi původně řekl dost nešťastně...

Každopádně tím se moc neliší od ostatních proměnných.
Název: Re:Jak můžu opustit funkci
Přispěvatel: BoneFlute 19. 07. 2018, 20:06:01
Je mnoho důvodů, proč nepoužívám proměnné typu boolean. Vystačím si s tímto:
Kód: [Vybrat]
if (isX()) {
...
}
Tohle je pěkná ukázka, k čemu jsou bool hodnoty dobré. Dají se totiž parádně skládat:
Kód: [Vybrat]
offset = identifierToken(chunk)
    ?: shebangToken(chunk)
    ?: assignToken(chunk)
    ?: bracketToken(chunk)
    ?: symbolToken(chunk)
    ?: 0
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 19. 07. 2018, 20:24:49
Tohle je pěkná ukázka, k čemu jsou bool hodnoty dobré. Dají se totiž parádně skládat:
Kód: [Vybrat]
offset = identifierToken(chunk)
    ?: shebangToken(chunk)
    ?: assignToken(chunk)
    ?: bracketToken(chunk)
    ?: symbolToken(chunk)
    ?: 0

Jsi přesvědčen, že je to čitelné? Upřímně si nejsem jist, co to ve skutečnosti dělá a určitě bych se takové konstrukci vyhnul. Má to snad být něco jako coalesce?
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 19. 07. 2018, 21:10:08
Tohle je pěkná ukázka, k čemu jsou bool hodnoty dobré. Dají se totiž parádně skládat:
Kód: [Vybrat]
offset = identifierToken(chunk)
    ?: shebangToken(chunk)
    ?: assignToken(chunk)
    ?: bracketToken(chunk)
    ?: symbolToken(chunk)
    ?: 0

Jsi přesvědčen, že je to čitelné? Upřímně si nejsem jist, co to ve skutečnosti dělá a určitě bych se takové konstrukci vyhnul. Má to snad být něco jako coalesce?

Ocividne.
Ale s nejakou variaci na Maybe/Optional by to urcite bylo zjevnejsi (nemluve o tom, ze pise "bool hodnoty", ale ve skutecnosti zneuziva to, ze nejaky jiny typ se muze pouzit v podmince nebo se implicitne konvertuje na bool). Na druhou stranu jeste to mohl "vylepsit" pouzitim disjunkce se zkracenym vyhodnocovanim :-/
Název: Re:Jak můžu opustit funkci
Přispěvatel: BoneFlute 19. 07. 2018, 21:17:18
Ale s nejakou variaci na Maybe/Optional by to urcite bylo zjevnejsi (nemluve o tom, ze pise "bool hodnoty", ale ve skutecnosti zneuziva to, ze nejaky jiny typ se muze pouzit v podmince nebo se implicitne konvertuje na bool). Na druhou stranu jeste to mohl "vylepsit" pouzitim disjunkce se zkracenym vyhodnocovanim :-/

V reálu to mám trochu jinak, protože jsem chtěl vracet více hodnot, ale uvedl jsem to jako demonstrační příklad té kompozice.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 19. 07. 2018, 21:20:21
Ale s nejakou variaci na Maybe/Optional by to urcite bylo zjevnejsi (nemluve o tom, ze pise "bool hodnoty", ale ve skutecnosti zneuziva to, ze nejaky jiny typ se muze pouzit v podmince nebo se implicitne konvertuje na bool). Na druhou stranu jeste to mohl "vylepsit" pouzitim disjunkce se zkracenym vyhodnocovanim :-/

V reálu to mám trochu jinak, protože jsem chtěl vracet více hodnot, ale uvedl jsem to jako demonstrační příklad té kompozice.

Ale hlavne ti unika, ze moznost kompozice neni nic specifickeho pro boolean (nebo v tomhle pripade asi spis "boolean").
Název: Re:Jak můžu opustit funkci
Přispěvatel: BoneFlute 19. 07. 2018, 21:37:59
Ale hlavne ti unika, ze moznost kompozice neni nic specifickeho pro boolean (nebo v tomhle pripade asi spis "boolean").

Rád bych tě upozornil na tendenci vyvozovat závěry z nedostatečných údajů :-)

Neřekl jsem, že je to specifické pro boolean, řekl jsem, že boolean to krásně umí. Díky její vlastnosti pouze dvou stavů je to pěkně přímočaré. Dozajista to jde jinak, věřím, že i lépe, určitě to není všechno, ale to je mi celkem jedno. Poperte se s tím, jak chcete :-)
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 19. 07. 2018, 21:42:13
Neřekl jsem, že je to specifické pro boolean, řekl jsem, že boolean to krásně umí. Díky její vlastnosti pouze dvou stavů je to pěkně přímočaré. Dozajista to jde jinak, věřím, že i lépe, určitě to není všechno, ale to je mi celkem jedno. Poperte se s tím, jak chcete :-)

Nepleteš si náhodou boolean s intem?
Název: Re:Jak můžu opustit funkci
Přispěvatel: BoneFlute 19. 07. 2018, 21:44:13
Nepleteš si náhodou boolean s intem?
Nepletu. Vím na co narážíš. Je to přesně to, co chci říct.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Kit 19. 07. 2018, 21:50:02
Nepleteš si náhodou boolean s intem?
Nepletu. Vím na co narážíš. Je to přesně to, co chci říct.

Aha, takže pleteš. Ostatně v C je to úplně normální.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ondra Satai Nekola 19. 07. 2018, 21:51:14
Ale hlavne ti unika, ze moznost kompozice neni nic specifickeho pro boolean (nebo v tomhle pripade asi spis "boolean").

Rád bych tě upozornil na tendenci vyvozovat závěry z nedostatečných údajů :-)

Neřekl jsem, že je to specifické pro boolean, řekl jsem, že boolean to krásně umí. Díky její vlastnosti pouze dvou stavů je to pěkně přímočaré. Dozajista to jde jinak, věřím, že i lépe, určitě to není všechno, ale to je mi celkem jedno. Poperte se s tím, jak chcete :-)

Ale no tak, dva stavy vubec neprinaseji vyhodu. I ten pitomy optional jich ma nekonecno.

Zaslechl jsi nekdy m-slovo? (Ne ze by na to, co predvadis, nestacilo f-slovo.)
Název: Re:Jak můžu opustit funkci
Přispěvatel: BoneFlute 19. 07. 2018, 21:51:56
Aha, takže pleteš. Ostatně v C je to úplně normální.
Tvá sebejistota je odzbrojující.
Název: Re:Jak můžu opustit funkci
Přispěvatel: BoneFlute 19. 07. 2018, 21:57:34
Ale no tak, dva stavy vubec neprinaseji vyhodu. I ten pitomy optional jich ma nekonecno.
Domnívám se, že Optional má jinej rozměr. To není to samé. Dva stavy jsou zajímavé a šikovné. Jestli to nazveš výhodou, může být. Podle mě je to ale pouze šikovné a zajímavé.

Zaslechl jsi nekdy m-slovo? (Ne ze by na to, co predvadis, nestacilo f-slovo.)
Nejsem si jist, o čem mluvíš.
Název: Re:Jak můžu opustit funkci
Přispěvatel: LambdaBender 20. 07. 2018, 00:36:04
Zaslechl jsi nekdy m-slovo? (Ne ze by na to, co predvadis, nestacilo f-slovo.)
Nejsem si jist, o čem mluvíš.
"f-slovo" bude něco s fuck.
Název: Re:Jak můžu opustit funkci
Přispěvatel: . 20. 07. 2018, 09:40:57
Pokud by si chtěl někdo přečíst (místo sebestředného honění si ega několika zdejších jedinců) velice zajímavý a do detailu jdoucí článek o vývoji GC toho jazyka, co jinak patří do odpadu, tak ho najde zde: https://blog.golang.org/ismmkeynote (https://blog.golang.org/ismmkeynote).
Název: Re:Jak můžu opustit funkci
Přispěvatel: pionyr 20. 07. 2018, 12:41:51
Davej si do kapsy krabicku s vypalenyma sirkama, Jaromíre.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Ffff 20. 07. 2018, 14:37:33
To je kravina. Sirka je tak mala, ze by se ta krabicka vznitila hned a nebo vubec. Ale ve filmu ok, vtipne.
Název: Re:Jak můžu opustit funkci
Přispěvatel: LambdaBender 20. 07. 2018, 15:05:26
Pokud by si chtěl někdo přečíst (místo sebestředného honění si ega několika zdejších jedinců) velice zajímavý a do detailu jdoucí článek o vývoji GC toho jazyka, co jinak patří do odpadu, tak ho najde zde: https://blog.golang.org/ismmkeynote (https://blog.golang.org/ismmkeynote).
Hezky tam vysvětlují, proč je generační kopírující GC na dvě věci. Jen jazyk nesmí navrhovat trotl, pak jsou různé epicykly nad GC nutné.
Název: Re:Jak můžu opustit funkci
Přispěvatel: BoneFlute 20. 07. 2018, 19:02:38
Pokud by si chtěl někdo přečíst (místo sebestředného honění si ega několika zdejších jedinců) velice zajímavý a do detailu jdoucí článek o vývoji GC toho jazyka, co jinak patří do odpadu, tak ho najde zde: https://blog.golang.org/ismmkeynote (https://blog.golang.org/ismmkeynote).
Hezky tam vysvětlují, proč je generační kopírující GC na dvě věci. Jen jazyk nesmí navrhovat trotl, pak jsou různé epicykly nad GC nutné.
Nechtěl by si něco vypíchnout? Jaká vlastnost jazyka způsobuje problémy?
Název: Re:Jak můžu opustit funkci
Přispěvatel: LambdaBender 20. 07. 2018, 19:28:56
Pokud by si chtěl někdo přečíst (místo sebestředného honění si ega několika zdejších jedinců) velice zajímavý a do detailu jdoucí článek o vývoji GC toho jazyka, co jinak patří do odpadu, tak ho najde zde: https://blog.golang.org/ismmkeynote (https://blog.golang.org/ismmkeynote).
Hezky tam vysvětlují, proč je generační kopírující GC na dvě věci. Jen jazyk nesmí navrhovat trotl, pak jsou různé epicykly nad GC nutné.
Jaká vlastnost jazyka způsobuje problémy?
Vlastnost ne, spíš implementace. Namátkou: 1) GC podle generací je kontraproduktivní, protože krátce žijící objekty můžou žít (a chcípnout) na zásobníku. 2) Kopírování objektů kvůli kompaktifikaci je zbytečná námaha (a ztráta času), když se použije nějaký kvalitní alokovací algoritmus, který nezpůsobuje fragmentaci. Go alokuje na haldě rozumně (nedochází k fragmentaci) a má dostatečně kvalitní escape analýzu, takže objekty se v naprosté většině alokují buď na zásobníku (takže se nemusí pracně tracovat a uklízet), nebo žijí na haldě dlouho. Jak říkám, to není primárně o jazyku, ale jen a pouze o vhodné implementaci runtimu. Podobně sofistikovaně funguje i překladač Rustu a Swiftu, jen používají jiné metody.

P.S. Když nějaký pseudovývojář tvrdí, že Go je odpad, má vždy na mysli syntax (kde jde v lepším případě o subjektivní pocit, většinou ovšem o nekompetenci), aniž by znal detaily implementace. Stupidní kiksy v syntaxi má např. i Haskell, ačkoliv jinak je navržený s matematickou přesností a jeho "vnitřnostem" rozumí ještě méně lopatoidů.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Cikáda 20. 07. 2018, 20:24:56
Stupidní kiksy v syntaxi má např. i Haskell, ačkoliv jinak je navržený s matematickou přesností a jeho "vnitřnostem" rozumí ještě méně lopatoidů.

Nějaký příklad? Opravdu mě to zajímá :)
Název: Re:Jak můžu opustit funkci
Přispěvatel: LambdaBender 20. 07. 2018, 20:51:24
Stupidní kiksy v syntaxi má např. i Haskell, ačkoliv jinak je navržený s matematickou přesností a jeho "vnitřnostem" rozumí ještě méně lopatoidů.
Nějaký příklad? Opravdu mě to zajímá :)
Uvedu jeden příklad, ten nejzávažnější, v praxi to bývá pro někoho show stopper: Identita funkcí se řídí porovnáním "function letter", přitom by je nezabilo napsat překladač tak, aby si konkrétní typ odvodil sám, pokud to jde (a když to nejde, umožnit vývojáři určit explicitně, o co mu jde). Jinak by také bylo hezké umožnit definici typů přes charakteristické morfismy, ale to už není jen o syntaxi, to by bylo spíš obohacení typového systému. Typové kvantifikátory vynechám, to se snad už zapracovává.
Název: Re:Jak můžu opustit funkci
Přispěvatel: Puff 30. 09. 2018, 18:03:59
booleovské proměnné bývají nadužívány a jejich odstranění zpravidla zkrátí a zpřehlední kód.
  :o