Jak můžu opustit funkci

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


.

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

ded.kenedy

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





Kit

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

.

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


PetrM

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

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

balki

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

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

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

LambdaBender

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

balki

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

ded.kenedy

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


PetrM

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


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