Jak můžu opustit funkci

ded.kenedy

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


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

ded.kenedy

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

Re:Jak můžu opustit funkci
« Odpověď #153 kdy: 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?
« Poslední změna: 16. 07. 2018, 20:00:07 od Cikáda »

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


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

balki

Re:Jak můžu opustit funkci
« Odpověď #156 kdy: 16. 07. 2018, 20:52:48 »
Jirsaku, dogma ste si z toho vytvorili vy.

balki

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

PetrM

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

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

PetrM

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

ded.kenedy

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

balki

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

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

PetrM

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