abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 17:11 | Nová verze

    Byl vydán Nextcloud Hub 8. Představení novinek tohoto open source cloudového řešení také na YouTube. Vypíchnout lze Nextcloud AI Assistant 2.0.

    Ladislav Hagara | Komentářů: 0
    dnes 13:33 | Nová verze

    Vyšlo Pharo 12.0, programovací jazyk a vývojové prostředí s řadou pokročilých vlastností. Krom tradiční nadílky oprav přináší nový systém správy ladících bodů, nový způsob definice tříd, prostor pro objekty, které nemusí procházet GC a mnoho dalšího.

    Pavel Křivánek | Komentářů: 5
    dnes 04:55 | Zajímavý software

    Microsoft zveřejnil na GitHubu zdrojové kódy MS-DOSu 4.0 pod licencí MIT. Ve stejném repozitáři se nacházejí i před lety zveřejněné zdrojové k kódy MS-DOSu 1.25 a 2.0.

    Ladislav Hagara | Komentářů: 30
    včera 17:33 | Nová verze

    Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.

    Ladislav Hagara | Komentářů: 13
    včera 14:22 | Komunita

    Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.

    Ladislav Hagara | Komentářů: 2
    včera 13:22 | Nová verze

    Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.

    Ladislav Hagara | Komentářů: 0
    včera 12:44 | Nová verze

    Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).

    Ladislav Hagara | Komentářů: 0
    včera 04:55 | Nová verze

    OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.

    Ladislav Hagara | Komentářů: 0
    včera 04:22 | Nová verze

    Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.

    Ladislav Hagara | Komentářů: 0
    včera 04:11 | Nová verze

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (74%)
     (9%)
     (2%)
     (16%)
    Celkem 797 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Dotaz: Objasnění podmínky

    8.2.2013 16:27 Jakub
    Objasnění podmínky
    Přečteno: 774×
    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.