abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 04:22 | Bezpečnostní upozornění

    Intel vydal 34 upozornění na bezpečnostní chyby ve svých produktech. Současně vydal verzi 20250211 mikrokódů pro své procesory řešící 5 bezpečnostních chyb.

    Ladislav Hagara | Komentářů: 0
    dnes 03:11 | Nová verze

    Byla vydána nová verze 1.24 programovacího jazyka Go (Wikipedie). Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 19:44 | Komunita

    Jiří Eischmann upozorňuje, že GNOME nemá české překladatele: "Posledních minimálně 15 let byly překlady GNOME do češtiny ve výborném stavu. U každého vydání jsem jen hlásil, že je vše přeložené, poslední roky to platilo i pro drtivou většinu dokumentace. Poslední rok se to ale začalo zadrhávat. Přispěvatelé, kteří to dlouhé roky táhli, odešli a není nikdo, kdo by to po nich převzal. Proto jsme se rozhodli jít s pravdou ven: GNOME momentálně nemá české překladatele a pokud se toho neujme někdo nový, překlady začnou postupně upadat."

    Ladislav Hagara | Komentářů: 9
    včera 19:22 | Nová verze

    Otevřený zvukový bezztrátový kodek FLAC (Free Lossless Audio Codec, Wikipedie) byl vydán v nové verzi 1.5.0. Hlavní novinkou je podpora vícevláknového kódování. V prosinci loňského roku byl FLAC formálně specifikován v RFC 9639.

    Ladislav Hagara | Komentářů: 3
    včera 15:11 | IT novinky

    Evropská unie hodlá iniciovat investice do rozvoje umělé inteligence v hodnotě 200 miliard eur, v přepočtu zhruba pět bilionů korun. V projevu na summitu o umělé inteligenci v Paříži to v úterý řekla předsedkyně Evropské komise Ursula von der Leyenová. Umělá inteligence podle ní může přispět mimo jiné ke zvýšení konkurenceschopnosti.

    Ladislav Hagara | Komentářů: 14
    včera 13:00 | Nová verze

    Desktopové prostředí KDE Plasma bylo vydáno ve verzi 6.3 (Mastodon). Přehled novinek i s videi a se snímky obrazovky v oficiálním oznámení. Podrobný přehled v seznamu změn.

    Ladislav Hagara | Komentářů: 2
    včera 04:11 | Komunita

    Lennart Poettering se na Mastodonu rozepsal o novince v systemd, na které pracuje: systemd bude umět nabootovat z obrazu disku staženého pomocí HTTP v rámci initrd.

    Ladislav Hagara | Komentářů: 14
    10.2. 21:44 | Nová verze

    Open source platforma Home Assistant (Demo, GitHub, Wikipedie) pro monitorování a řízení inteligentní domácnosti byla vydána ve verzi 2025.2. Nově lze zálohovat také na Google Drive a Microsoft OneDrive.

    Ladislav Hagara | Komentářů: 0
    10.2. 18:22 | Komunita

    V kinech aktuálně běží animovaný film Kočičí odysea, v originálu Flow, (Wikipedie) vytvořený v Blenderu. Film získal řadu ocenění a má dvě nominace na Oscary 2025. Na ČSFD má 80 %. Režisérem je Gints Zilbalodis. Rozhovor s režisérem na stránkách Blenderu.

    Ladislav Hagara | Komentářů: 12
    10.2. 17:33 | Nová verze

    Oficiálně byla vydána (Mastodon, 𝕏) třetí RC verze GIMPu 3.0. Přehled novinek v oznámení o vydání. Podrobně v souboru NEWS na GitLabu. GIMP je nově k dispozici také ve formátu AppImage.

    Ladislav Hagara | Komentářů: 29
    Rozcestník

    Dotaz: Objasnění podmínky

    8.2.2013 16:27 Jakub
    Objasnění podmínky
    Přečteno: 778×
    Jak je myělena tato podmínka v php manuálu? zde

    V manuálu je napsáno
    if(!ob_start("ob_gzhandler")) ob_start();
    mám to brát jako že to autor myslel takto?
    if(!ob_start("ob_gzhandler"))
    {
       ob_start();
    }else{
       ob_start("ob_gzhandler");
    }
    Že již při testováni ob_start("ob_gzhandler") se ta funkce zavolá proto nepoužil else? Díky

    Řešení dotazu:


    Odpovědi

    8.2.2013 16:43 Kit
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    To else tam máš navíc. Ten druhý příklad by nefungoval správně.

    ob_start() je funkce, která jako výsledek obsahuje hodnotu, zda se povedla či ne. Tuto hodnotu můžeš testovat.
    8.2.2013 17:03 mike
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Je to mysleno tako, pouzij konkretni implementaci a pokud to neprojde, pouzij implicitni. Elegantnejsi je to takto:
    ob_start("ob_gzhandler") || ob_start();
    
    8.2.2013 18:31 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Fujtajbl.
    xkucf03 avatar 9.2.2013 17:07 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    V čem je to ošklivější než tohle?
    if(!ob_start("ob_gzhandler")) ob_start();
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    9.2.2013 18:13 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky

    Člověku, který je ve svém kódu zvyklý takové obraty rutinně používat, to tak možná nepřijde, ale pro ostatní to výrazně snižuje čitelnost a srozumitelnost kódu.

    Jinak většina přísnějších coding styles by nepovolila ani tu alternativu, kterou jste uvedl (a muselo by se to rozdělit na dva řádky).

    xkucf03 avatar 9.2.2013 18:16 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    No, já bych nenapsal asi ani jedno (leda v nějakém pomocném skriptu), ale když už, tak z těchto dvou možností mi přijde hezčí ta s ||.
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    9.2.2013 18:20 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Mně ne. IMHO je lepší, když je na podmíněném příkazu na první pohled vidět, že je to podmíněný příkaz. Když se má člověk zorientovat v cizím kódu, který nikdy předtím neviděl, takové drobnosti hrají velkou roli.
    pavlix avatar 10.2.2013 21:28 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    ale když už, tak z těchto dvou možností mi přijde hezčí ta s ||.
    +1
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    12.2.2013 09:40 kei.101
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Tak to záleží taky na jazyku. V céčku by to neprošlo, v shellu bych to tak použil taky.. PHP je paskvil ;]
    12.2.2013 23:08 Sten
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    PHP hlavně vychází z Perlu a tohle je jedna ze zachovaných perliček :-)

    Ale jinak se přimlouvám za to v takových konstrukcích používat slovní or.
    10.2.2013 17:48 mike
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Ja si naopak myslim, ze to zlepsuje citelnost kodu, je to uplne prirozene:
    do_somethig() or do_something_else()
    
    nebo
    try  
        do_something() 
    except  
        do_something_else() 
    
    
    kdyz uz podminku tak
    if is_supported_feature() 
        do_something()
    else
        do_something_else() 
    
    v podminenem vyrazu proste cekam predikat
    xkucf03 avatar 10.2.2013 18:22 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    V zásadě souhlas, taky to tak cítím.

    Na druhou stranu u toho || zase musím vědět, jak funguje AND/OR v daném jazyce (zda se vyhodnocují všechny výrazy, nebo jen ty nezbytně nutné), zatímco IF se chová snad všude stejně. Ale to by člověk jednak vědět měl, když v daném jazyce píše a jednak většinou to bude vyhodnocovat jen ty nutné výrazy (ovšem takový Erlang má and/or, ale i andalso/orelse).
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    pavlix avatar 10.2.2013 21:30 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Ve světě jazyků vycházejících nepřímo z céčka je zkrácené vyhodnocování dost oblíbené. Takže si myslím, že není problém toto po čtenáři kódu chtít.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    xkucf03 avatar 10.2.2013 18:26 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    P.S. dávat do podmínky výraz, který něco dělá/mění (místo aby jen zjišťoval) mi přijde fakt prasárna. Oproti tomu je udělejNěco() || udělejNěcoJiného() krásně čitelné a na první pohled srozumitelné. Ještě lepší jsou ty výjimky, ale když už nejsou k dispozici, tak bych si alespoň výsledek první akce přiřadil do proměnné (s rozumným názvem) a tu vyhodnotil v podmínce na samostatném řádku.
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    10.2.2013 19:22 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Co na to říct? Snad jen že jsem moc rád, že většina projektů, do kterých přispívám a s jejichž kódem musím pracovat, na to má opačný názor než vy dva.
    xkucf03 avatar 10.2.2013 19:29 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Objasnění podmínky

    OMG, to je zase flame :-) Už na začátku jsem psal, že se mi moc nelíbí ani jedno. Moje pořadí:

    1. Používat výjimky
    2. Uložit si návratovou hodnotu do proměnné a vyhodnotit ji na samostatném řádku
    3. Použít konstrukci s ||
    4. Dát do podmínky výraz, který něco mění, místo aby jen zjišťoval stav

    V případě nějakých skriptů nebo jazyků, kde je zvykem tak psát, bych 3 posunul na druhé – možná i první, pokud nejsou podporované výjimky – místo. Možnost 4 mi přijde ze všech nejošklivější a nejméně čitelná.

    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    10.2.2013 20:30 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    No a já zase zneužití side-effectu zkráceného vyhodnocování operátoru || k zamaskování podmíněného příkazu v situaci, kdy se výsledek operace nakonec vlastně ani nepoužije, považuji za čuňárnu, která dalece předčí nevýhody všechny ostatních variant. To je obrat, který jsem ochoten tolerovat v shellu, a i tam jen v nejjednodušších případech; v jazyce typu C podle mne nemá co dělat. A jak už jsem řekl, jsem moc rád, že coding style většiny rozumných projektů na to nahlíží stejně.
    pavlix avatar 10.2.2013 21:32 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Snad jen že jsem moc rád, že většina projektů, do kterých přispívám a s jejichž kódem musím pracovat, na to má opačný názor než vy dva.
    Ve Frantově případě už opravdu jen trolluješ, vzhledem k tomu, že opačný názor k jeho je v podstatě použít libovolnou z možností, které se mu nelíbí.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    10.2.2013 22:46 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Ne, viz odpověď z 20:30. Pro mne je tento způsob použití || neospravedlnitelná prasárna, pro něj je to naprosto přirozená konstrukce. Pro mne je naprosto v pořádku použít funkci s vedlejším efektem v podmínce, pro něj je to neospravedlnitelná prasárna. Takže v tom se prostě shodnout nemůžeme.
    pavlix avatar 10.2.2013 22:54 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Zbytečný flame. Pokud byste pracovali na stejném projektu, tak se bez problémů shodnete. V tomto případě i se mnou.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    pavlix avatar 10.2.2013 22:56 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    A naopak v networkmanageru, což je skutečný projekt, se nacházely takové prasárny, že se jim žádná z uvedených možností nevyrovná. Naštěstí nejsem tak útlocitný, abych kvůli tomu odmítl s tím kódem pracovat (a naopak jsem příliš útlocitný než abych ho nechal být).
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    xkucf03 avatar 10.2.2013 23:13 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    pro něj je to naprosto přirozená konstrukce
    Většinou píšu v Javě a tam to nepoužívám. Občas v Perlu nebo Bashi ano a tam mi to přijde jako lepší varianta.
    …použít funkci s vedlejším efektem v podmínce, pro něj je to neospravedlnitelná prasárna.
    Abych to trochu zmírnil: nepovažuji to za úplné tabu, ale přijde mi to horší než použití ||.

    Když kouknu letmo na zdroják, tak vidím posloupnost příkazů a bloky, které se provádějí jen někdy, za určitých okolností – ale že se v závorce za IFem bude ukrývat i nějaký výkonný kód a ne jen vyhodnocení těch okolností, považuji za trochu zákeřné – je potřeba číst pozorněji a není to takové rychlé „kouknu a vidím“ – což zrovna u toho || funguje (pokud někdo nepíše kilometr dlouhé řádky, ale to je zase jiná kapitola).

    Chápu, jak to myslíš, a i že je to trochu zneužití téhle konstrukce… Ale když se podívám na výsledek, je to pro mne čitelnější než if + negace + pár závorek (a to jsem jinak docela fanda do závorek a píšu je rád).

    Že se výsledná hodnota nikam nepřiřadí nebo nepoužije taky není takový hřích – celkem často se volají nějaké metody/funkce, které něco vrací a výsledek nepotřebuješ, tak s ním dál nepracuješ.
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    Jendа avatar 10.2.2013 23:12 Jendа | skóre: 78 | blog: Jenda | JO70FB
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    P.S. dávat do podmínky výraz, který něco dělá/mění (místo aby jen zjišťoval) mi přijde fakt prasárna
    if not decrypt(file, candidate):
            do_some_cracking()
    
    if not kytička = tsql.fetchone():
            log("Strange, gardener solved job I did not submit!", LOG_ERR)
            return
    zasaď(kytička)
    
    Přesvědčuj, ještě to můžu změnit! :)
    11.2.2013 09:59 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Přidám se bo se přiznám, že si to právě ani neumím jinak představit (bez měnícího kódu v if), vždyť to už hraničí i s klasickým
    if((fw=fopen("xy", "wb") != NULL){
      if((fwrite( buff, sizeof(char), n, fw)) != n){
        //write error
      }
      if(fclose(fw) != 0){
        //write/close error
      }
    }else{
      //open error
    }
    
    ten kód je, tedy podle mě, čitelný a hezký.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    11.2.2013 10:18 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky

    Také si myslím, že umělé ukládání návratové hodnoty do proměnné, pokud se pak k ničemu jinému nepoužije, přehlednosti nijak neprospívá, spíš naopak. Něco jiného už je samozřejmě situace, kdy hodnotu tak jako tak musím uložit, např.

      if ((buffer = malloc(n * sizeof(int))) == NULL) {
        ...
      }
      ...
    

    Tam bych se naopak přiklonil k rozdělení.

    11.2.2013 11:34 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    No a já právě ne ;), jak jsem uvedl výše
    if((fw=fopen("xy", "wb") != NULL){
    
    tak i
    if((buffer = malloc(n * sizeof(int))) != NULL){
    
    mi přijde dobré v případě, že v bloku na základě té podmínky pracuji s danou návratovou hodnotou. Proto jsem to vyhodnocení úspěšnosti alokace otočil. Ale i následující mi přijde jako OK:
    if((buffer = malloc(n * sizeof(int))) == NULL){
      //error & exit
    }
    
    A naopak u všech to cítím tak, že když se to vyhodí z podmínky tak to zhoršuje čitelnost, ale hlavně zvyšuje riziko vložení kódu „mezi“.
    A ve specifických případech (v jazycích takto fungujících), lze v jedné podmínce provést dva příkazy, přičemž druhý se neprovádí v případě neúspěchu druhého, a když se to použije rozumně, tak to, jak jinak než podle mě ;-), zvyšuje čitelnost a odolnost kódu (samozřejmě jen tehdy pokud nerozlišujeme co zklame).
    Neco jako (na lock() jsem se v příkladu vykašlal…):
    while(!allDataProcessed()){
      if(((buffer = getBuffer()) != NULL) //get a free buffer
       &&(readData(&buffer))){            //read data into the buffer
        //process buffer…
        releaseBuffer(&buffer);
      }else{
        pthread_cond_wait(&cond, &mut);   //wait for release a buffer or reading thread
      }
    }
    
    Ale věřím, že spoustě lidí se to nelíbí…
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    xkucf03 avatar 11.2.2013 20:01 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    lze v jedné podmínce provést dva příkazy, přičemž druhý se neprovádí v případě…
    Takže k tomu IFu přidáš ještě konstrukci typu:
    ob_start("ob_gzhandler") || ob_start();
    :-)
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    11.2.2013 22:29 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Sice to z dálky vypadá, že to pasuje na tu větu, ale zblízka: „¡Ne!, toto mi přijde dost divné a nečitelné“ ;-)
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    xkucf03 avatar 12.2.2013 00:32 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    A přitom tam používáš stejného jevu – tzn. že OR/AND vyhodnocuje druhý výraz jen někdy, v závislosti na prvním.

    Pro mne je
    aaa() || bbb();
    čitelné, ale když se to začne ztrácet v IFu a negacích, už je to horší – je těžší tam na první pohled vidět ty metody, které něco dělají/mění…
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    12.2.2013 08:18 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Když se ten „jev“ takto definuje, tak ano. Hlavně k vůli té „nezranitelnosti“, ale v té kombinaci s OR a takovéhoto použití mi přijde zbytečně brainfuck-ové.
    Já tam cítím velký rozdíl… ;-)
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    11.2.2013 11:29 Franta
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Kód je hnusný, resp. je to dané jazykem. Pro ošetření výjimečných stavů mají sloužit výjimky, zatímco pro větvení byznys logiky mají sloužit IFy. Pak je na první pohled vidět, co je chyba a co alternativní větev normálního běhu. Je to asi jako když někdo v SQL pomíchá podmínky pro filtrování (patří do WHERE) s podmínkami pro spojování tabulek (patří do USING/ON za JOIN). Ano, funguje oboje, ale jedno se čte líp.
    11.2.2013 11:45 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Kód je krásný.
    A výjimku jsou super, ale jsem rád, že je spousta fcí nešíří, protože někdy (v C++) může být na zbláznění s nimi správně zacházet, protože ty „výjimečné“ stavy mohou být součástí logiky a někdy není možné to udělat jinak, než zachytit výjimku jako součást logiky a to je pak ten správný humus ;-)
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    11.2.2013 11:29 mike
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    neni toto citelnejsi a hezci?
    try 
        fw = fopen()
        fwrite(fw)
        fclose(fw)
    except 
        print error
    
    nebo toto
    ( 
      fw = fopen() and
      fwrite(fw) and
      fclose(fw)
    ) or (
      die()
    )
    
    samozrejme se nebavime o C, ktery tyto konstrukce neumi.
    11.2.2013 11:41 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Předpokládáme, že tyto fce vyhazují výjimky - OK.
    První příklad je špatně, druhý pokud die() je die, tak jen nedokonalý.
    A to protože ani jeden příklad nezavře soubor v přídě vyhození výjimky u fwrite(), a „print error“ naznačuje že soubor zůstane otevřený kdoví do kdy.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    11.2.2013 11:58 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky

    Myslel jsem, že svůj názor na použití logických operátorů coby maskovaných podmíněných příkazů jsem už sdělil dostatečně zřetelně… Co se výjimek týká, tak pokud je jazyk má, je to fajn, ale ani v tom případě se nehodí vždy. Třeba když budu chtít pomocí výjimek přepsat kód typu

    int __init ip6_route_init(void)
    {
            int ret;
    
            ret = -ENOMEM;
            ip6_dst_ops_template.kmem_cachep =
                    kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0,
                                      SLAB_HWCACHE_ALIGN, NULL);
            if (!ip6_dst_ops_template.kmem_cachep)
                    goto out;
    
            ret = dst_entries_init(&ip6_dst_blackhole_ops);
            if (ret)
                    goto out_kmem_cache;
    
            ret = register_pernet_subsys(&ipv6_inetpeer_ops);
            if (ret)
                    goto out_dst_entries;
    
            ret = register_pernet_subsys(&ip6_route_net_ops);
            if (ret)
                    goto out_register_inetpeer;
    ...
            ret = fib6_init();
            if (ret)
                    goto out_register_subsys;
    
            ret = xfrm6_init();
            if (ret)
                    goto out_fib6_init;
    
            ret = fib6_rules_init();
            if (ret)
                    goto xfrm6_init;
    
            ret = register_pernet_subsys(&ip6_route_net_late_ops);
            if (ret)
                    goto fib6_rules_init;
    
            ret = -ENOBUFS;
            if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL, NULL) ||
                __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL, NULL) ||
                __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL, NULL))
                    goto out_register_late_subsys;
    
            ret = register_netdevice_notifier(&ip6_route_dev_notifier);
            if (ret)
                    goto out_register_late_subsys;
    
    ...
    

    tak mi výjimky kód spíš znepřehlední.

    11.2.2013 12:08 Franta
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Použití proměnné ret mi přijde lepší, než nacpat výkonný kód do závorek za IF. A to GOTO je vlastně taková emulace výjimek :-)
    11.2.2013 12:17 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Použití proměnné ret mi přijde lepší, než nacpat výkonný kód do závorek za IF.

    Kdybych tu funkci zkopíroval celou, bylo by vidět, že ukládání návratové hodnoty do proměnné ret není samoúčelné, protože uložená hodnota se v případě chyby použije jako návratová hodnota ip6_route_init(). Což se promítá i do téhle části:

            ret = -ENOBUFS;
            if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL, NULL) ||
                __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL, NULL) ||
                __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL, NULL))
                    goto out_register_late_subsys;
    

    která mimochodem dělá přesně to, co se vám nelíbí.

    A to GOTO je vlastně taková emulace výjimek

    Jenže v tomto případě by právě výjimky z hlediska přehlednosti nadělaly víc škody než užitku.

    11.2.2013 12:31 Franta
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Což se promítá i do téhle části:÷
    Zrovna tady by se proměnná hodila – smyslem proměnné totiž není jen to, že v IFu nebude výkonný kód, ale i to, že si nějakým výstižným názvem pojmenuji výsledek logické operace složené z několika AND/OR – aby to člověk nemusel luštit vždy znovu a znovu a zkoumat, proč tam jsou zrovna takový ORy a ANDy a co tím chtěl původní autor říct.
    Jenže v tomto případě by právě výjimky z hlediska přehlednosti nadělaly víc škody než užitku.
    Neznám kontext, může být.
    pavlix avatar 11.2.2013 13:02 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    aby to člověk nemusel luštit vždy znovu a znovu a zkoumat, proč tam jsou zrovna takový ORy a ANDy a co tím chtěl původní autor říct.
    Hlavně se obsah proměnné hezky zkoumá v debuggeru, takže pokud se nejedná o něco, o čem se předpokládá, že to nebudu nikdy potřebovat debugovat, tak to není špatný nápad. Optimalizovaná verze se stejně bez místa v paměti pro nepotřebnou lokální proměnnou obejde.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    11.2.2013 13:12 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Pokud si člověk může dopřát ten luxus krokovat program přeložený s -O0, tak ano.
    pavlix avatar 11.2.2013 13:19 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Thank you Captain Obvious.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    11.2.2013 14:10 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Neznám kontext, může být.

    Kontext je jednoduchý. Je třeba provést sérii asi tak deseti inicializací ve správném pořadí s tím, že pokud některá selže, všechno, co se dosud povedlo, se zase musí (v opačném pořadí) vrátit zpět. V C++ by se to nejspíš řešilo přes nějakou umělou třídu a pomocné třídy pro jednotlivé kroky inicializace, ale to zase zanáší nežádoucí overhead.

    11.2.2013 14:42 Franta
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Dá se to napsat zhruba takhle:
    public void nějakáMetoda() {
    	try {
    		vytvořitSpojení();
    		připravitSQLDotaz();
    		vykonatSQLDotaz();
    	} catch (Exception e) {
    		zavřít(spojení, dotaz, výsledkováSada);
    	}
    }
    
    public static void zavřít(Connection spojení, Statement dotaz, ResultSet výsledkováSada) {
    	if (výsledkováSada != null) {
    		try {
    			výsledkováSada.close();
    		} catch (Exception e) {
    			// nedá se už nic dělat, jen zalogujeme
    		}
    	}
    
    	if (dotaz != null) {
    		try {
    			dotaz.close();
    		} catch (Exception e) {
    			// nedá se už nic dělat, jen zalogujeme
    		}
    	}
    
    	if (spojení != null) {
    		try {
    			spojení.close();
    		} catch (Exception e) {
    			// nedá se už nic dělat, jen zalogujeme
    		}
    	}
    }
    11.2.2013 14:56 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    „Nedá mná.“
    Ano, lze to tak napsat, ale to je tak všechno co na tom vidím, asi jsem jiný…
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    11.2.2013 15:00 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    To sice dá, ale bude s tím mnohem víc práce (budete muset vytvářet umělé datové struktury pro předání informací potřebných pro úklid) a výsledek nakonec o nic přehlednější nebude.
    11.2.2013 15:17 Franta
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Tomu se říká znovupoužitelnost – taková uklízecí metoda je v celém programu jen jednou, případně je už v použitém frameworku a člověk ji ani nemusí psát. A hlavně se ta byznys logika neztrácí mezi haldami pomocného, uklízecího a výjimky ošetřujícího kódu.
    11.2.2013 15:29 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    V tom příkladu, který jste uvedl, se to svým způsobem dá považovat za znovupoužitelné. V tom, který jsem uvedl já, byste tu úklidovou funkci použil přesně na dvou místech.
    xkucf03 avatar 11.2.2013 20:12 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    A hlavně se ta byznys logika neztrácí mezi haldami pomocného, uklízecího a výjimky ošetřujícího kódu.
    Ztrácení užitečného kódu způsobují někdy i „korporátní“ konvence pro logování a jednotkové testování…
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    11.2.2013 12:21 mike
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    je pravda, ze takovemuto paskvilu (paskvil z pohledu prehlednosti, ne efektivity), by ani vyjimky nepomohly. Proc nepouzit peknou tabulku?
    -----------------------------------------------------------------
    STATE | ACTION        | OK      | ERROR - 1 | ERROR - 2 | ......
    -----------------------------------------------------------------
    init  | do_init()     | inited  | init      | final
    inited| do_someting() | next    | init      | init    
    final | exit()        | null    | null 
    
    11.2.2013 12:29 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Protože by to bylo zoufale neefektivní a ve výsledku by to přehlednosti nijak neprospělo.
    11.2.2013 12:54 mike
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    opravdu neefektivni a neprehledne:
    while state != 'final'
        retval = execute(table[state][action])
        state  = table[state][retval]
    
    11.2.2013 12:56 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    A to je snad všechno?
    11.2.2013 13:19 mike
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Je to s podivam, ale ano, takto jednoduchy algoritmus vykonava vyse znazorneny stavovy automat
    11.2.2013 14:05 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Jenže ty tři řádky jsou samy o sobě k ničemu. Chybí vám k nim definice té celkem rozsáhlé tabulky přechodových stavů (která navíc bude zabírat paměť) a wrappery nad jednotlivé volané funkce (u kterých jste navíc velkoryse zanedbal otázku předání potřebných parametrů). Jenže kdybyste tohle všechno nevynechal, už by to vaše řešení vůbec nevypadalo tak sexy a bylo by ještě více patrné, jak je neefektivní.
    11.2.2013 16:08 mike
    Rozbalit Rozbalit vše Re: Objasnění podmínky

    definice tabulky: obycejne pole, list, dict, map ... - pametova narocnost pro desitky stavu je nulova

    predavani parametru: trivialni - list, dict, map ...

    wrappery nemusi bejt potreba, pripadne se muzou generovat automaticky.

    Ihned utnu namitku, ze v C a v kernelu si nemuzeme dovolit nejake listy a mapy. Na par radku se da napsat generator, ktery tento automat prevede do C-kovyho kodu, i se vsema vyhodama, ktere nasleduji.

    Co je ale obrovskej prinos? Verifikace a validace. Ten kod kernelu, co jste poslal, je vicimene nemozne poradne otestovat (ale co uz, mame tisice testeru, tak je nam to fuk :) ).

    Definici stavoveho automatu muzeme krasne validovat oproti zadani. Jenoduchy provadeci kod automautu se poradne otestuje jednou a pak uz to mame zadarmo. Jednotlive akce pujdou krasne unit testovat.

    11.2.2013 16:18 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky

    definice tabulky: obycejne pole, list, dict, map ... - pametova narocnost pro desitky stavu je nulova

    predavani parametru: trivialni - list, dict, map ...

    wrappery nemusi bejt potreba, pripadne se muzou generovat automaticky

    Zkuste si to pro ten konkrétní příklad. Uvidíte, že náročnost není ani zdaleka "nulová", že kódu bude ve výsledku podstatně víc než je ho teď a že se v něm bude podstatně hůř orientovat.

    xkucf03 avatar 11.2.2013 20:17 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Na par radku se da napsat generator, ktery tento automat prevede do C-kovyho kodu, i se vsema vyhodama, ktere nasleduji.
    S tím souhlasím a myslím, že by to pomohlo mnoha programům – efektivita programu tím netrpí (generuje se ještě před kompilací), chybovost (překlepy atd.) je omezena, jsou lépe oddělena data od logiky, snáze se přidají nová data…
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    Goheeca avatar 11.2.2013 21:03 Goheeca | skóre: 7
    Rozbalit Rozbalit vše Re: Objasnění podmínky

    Ihned utnu namitku, ze v C a v kernelu si nemuzeme dovolit nejake listy a mapy. Na par radku se da napsat generator, ktery tento automat prevede do C-kovyho kodu, i se vsema vyhodama, ktere nasleduji.

    To tak trochu zavání 10. pravidlem, resp. zde nastává problém nutné znalosti generátoru k pochopení zdrojového kódu.
    11.2.2013 15:21 Logik
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Ještě tu nikdo nezmínil Pythoní with. To se s tím vyrovnává vcelku hezky.
    14.2.2013 00:17 ::: | skóre: 14 | blog: e_lama
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    souhlas, tahle verze je citelnejsi, protoze je to zapsany presne tim zpusobem jakym nad tim normalni clovek bude premyslet "udelej prvni nebo druhy".

    Samozrejme to ocekava aspon elementarni znalost jazyka a pak zacatecnikum kteri se prave dozvedeli o zkracenym vyhodnocovani to muze pripadat "Fujtajbl"...
    14.2.2013 07:51 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    zacatecnikum kteri se prave dozvedeli o zkracenym vyhodnocovani to muze pripadat "Fujtajbl"...

    Jsou takovéhle urážky nutné, zvlášť když dobře víte, jak moc jsou mimo mísu?

    pavlix avatar 14.2.2013 15:10 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Aspoň mě někdo pomstil za tehdejší narážky, které byly úplně na stejné úrovni :). Jasně, už mlčím…
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    Tarmaq avatar 8.2.2013 17:25 Tarmaq | skóre: 39
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Je to tam prece u toho prikladu vysvetlene:
    ob_start("ob_gzhandler") returns FALSE if browser doesn't support gzip, so then is called normal ob_start();
    Tzn. browser podporuje gzip, nastartuje se output buffering s callbackem ob_gzhandler. Pokud nepodporuje, spusti se standardni output buffering.
    if (foo()) bar();
    je zkraceny zapis tohoto:
    if (foo()) {
      bar();
    }
    
    vhodny pokud v podminenem bloku je jen jeden prikaz; Jinak taky preferuju zapis, ktery ukazal mike
    Don't panic!
    8.2.2013 18:32 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Že již při testováni ob_start("ob_gzhandler") se ta funkce zavolá proto nepoužil else?

    Samozřejmě. Jak byste chtěl zjistit návratovou hodnotu funkce, aniž byste ji zavolal?

    12.2.2013 09:43 kei.101
    Rozbalit Rozbalit vše Re: Objasnění podmínky
    Myslím, že pochopitelnější přepis by byl tento:
    ok = ob_start("ob_gzhandler");
    
    if (!ok) {
        ob_start();
    }
    

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.