Portál AbcLinuxu, 10. května 2025 19:19

Dotaz: Objasnění podmínky

8.2.2013 16:27 Jakub
Objasnění podmínky
Přečteno: 783×
Odpovědět | Admin
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:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

8.2.2013 16:43 Kit
Rozbalit Rozbalit vše Re: Objasnění podmínky
Odpovědět | | Sbalit | Link | Blokovat | Admin
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
Odpovědět | | Sbalit | Link | Blokovat | Admin
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
Odpovědět | | Sbalit | Link | Blokovat | Admin
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
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ž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
Odpovědět | | Sbalit | Link | Blokovat | Admin
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, (c) 1999-2007 Stickfish s.r.o.