Jak můžu opustit funkci

daemon

Re:Jak můžu opustit funkci
« Odpověď #30 kdy: 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.


Re:Jak můžu opustit funkci
« Odpověď #31 kdy: 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.

Kit

Re:Jak můžu opustit funkci
« Odpověď #32 kdy: 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.

Re:Jak můžu opustit funkci
« Odpověď #33 kdy: 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.

armabeton

Re:Jak můžu opustit funkci
« Odpověď #34 kdy: 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?


Kit

Re:Jak můžu opustit funkci
« Odpověď #35 kdy: 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.

Kit

Re:Jak můžu opustit funkci
« Odpověď #36 kdy: 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.

balki

Re:Jak můžu opustit funkci
« Odpověď #37 kdy: 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.

balki

Re:Jak můžu opustit funkci
« Odpověď #38 kdy: 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

Re:Jak můžu opustit funkci
« Odpověď #39 kdy: 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ý. :)

balki

Re:Jak můžu opustit funkci
« Odpověď #40 kdy: 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.

Re:Jak můžu opustit funkci
« Odpověď #41 kdy: 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“.

balki

Re:Jak můžu opustit funkci
« Odpověď #42 kdy: 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.

Re:Jak můžu opustit funkci
« Odpověď #43 kdy: 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ů.
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.

armabeton

Re:Jak můžu opustit funkci
« Odpověď #44 kdy: 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?