Zcela jiste se jedna o nove se hojne vyskytujici druh, takzvany programator zacatecnik (Homo sapiens neandrtalis computeris) ktery se k nam rozsiruje z mist jako Unicorn nebo Indie. Pozor na ne! Kousou a pouzivaji goto, berou 80 Kc/hodinu a delaji nam ostudu!
Neřekl bych, že goto musí být nutně začátečnické. Pokud se podíváte do zdrojáků kernelu, tak tam jsou skoro v každé 3. funkci. Pochopitelně používat je místo cyklů je fuj.
Hm, a Theo de Raadt je v tomto oboru nějakou autoritou? Člověk, který nařizuje svým vývojářům, co smějí a nesmějí říkat, který je známý svými ublíženými výkřiky bez argumentů, a který, jsa sám argumenty utlučen, začíná fňukat "ale my píšeme OpenSSH, takže se k nám chovejte hezky"?
Viděl jste někdy zdrojáky OpenBSD? Napsat půl operačního systému v céčkovém preprocesoru není zrovna nejlepší příklad přehledného stylu programování.
Bohuzel je to od slova "mytit" jako vypalovat stromy viz treba http://cs.wikipedia.org/wiki/Vyjmenovaná_slova a nebo google ktery po zadani vymytil najde 1920 odkazu a vymitil 1060, coz je podle me nejlepsi slovnik ;)
Nejhorší je, když začne člověk, který by měl raději mlčet a poslouchat, aby něco věděl, mít vtíravou potřebu někomu radit, aniž by o tom sám něco věděl, jako v tomto případě...
Tohle mi něco připomnělo:
Programátor sedí u počítače a programuje. Říká si: "Tak, teď buď můžu přestrukturovat celý program, nebo použiju jedno malé goto." Tak ho použije a v tom hop, hop, hop - přiskákal velociraptor a chramst! - sežral ho.
Nutnost pouzit goto v Cckovem programu svedci o spatnem navrhu celeho programu. Vyjimkou jsou samozrejme casti napsane primo v Assembleru, kde to je nezbytne. Coz se da ale nasemu surfari jiste prominout jsa casti mozku vytezovan vyvazovanim teziste.
Už Ti někdo řekl, že jsi čuně? Nebo jsi dodnes nepochopil, proč je v Cčku pořád ještě goto? (nápověda: právě kvůli takovýmhle případům...) Taky předěláváš do...while jenom na while a switch na jenom if...else if...else, aby to bylo jó všechno "jednodušší"?
On hlavně v 99,9% případů není důvod ten vnitřní cyklus nedat do samostatné funkce. Nebo, jako v tomto případě, by stačilo namísto while (1) v tom vnějším cyklu dát while (!pryc). V opravdu zanedbatelném množství případů je goto užitečné, ale to jsou fakt výjimky. Pascal, který nemá break a continue, se bez goto obejde opravdu těžko, ale to je jiná story.
Nielen že má continue a break ale má aj break n kde n je úroveň z ktorej má vyskočiť. goto som písal akurát tak v hisoft pascale na spectrer pred 20timi rokmi. ;)
Samozřejmě, že to jde i přes for, já jen chtěl ukázat, že použití goto v C není zapotřebí a pro vyskočení ze dvou cyklů lze použít i jiné konstrukce. Goto jsem v C ještě použít nemusel.
Ale všechny tyto konstrukce jsou méně čitelné a obě jsem uvedl už ve svém příspěvku jako horší než goto. Dále je goto velmi užitečné pro postupnou dealokaci prostředků po chybě.
To samozřejmě jde (a na rozdíl od v jiných příspěvcích navrhované stavové proměnné se mi při tom neotvírá kudla v kapse), jen je otázka, jestli je to přehlednější a v daném případě vhodné (pokud to hledání závisí na deseti proměnných a hledá se podle nějakého zvláštního predikátu, pak asi ne - pokud hledáme nulu, pak je to OK). S tím souvisí i ta znovupoužitelnost.
Ono jsou i jiné možnosti, třeba strčit do extra funkce to co následuje za found: a místo goto found volat tu funkci. Ale platí o tom to samé.
Ale hlavně si myslím, že goto (třeba) v tomhle případě čitelnost programu nezhoršuje. A pokud někdo říká že goto je špatné, nikdo ho nesmí používat, ale nedokáže říct proč si to myslí, pak tím ukazuje jen svou omezenost.
A Chuck Moore zase tvrdí, že používat pojmenované lokální proměnné svědčí o špatném návrhu celého programu, že jemu vždycky stačil zásobník. (Na rozdíl od Tebe ovšem ten pán navrhl a vyrobil tucet procesorů a vyvinul pro ně kompletní vývojová prostředí a píše aplikace od začátku šedesátých let.) A teď mi řekni, který z těchhle dvou názorů má větší váhu a proč by ji měl mít.
No jo, ale ve Forthu :-)
V programu ve Forthu jsem v životě nepotřeboval pojmenovanou lokální proměnnou a když, tak jsem to vždycky předělal tak, abych ji nepotřeboval - a program se tím pokaždé zelegantnil.
Pokud z nějakého důvodu nechci či nemohu (u C++) použít automaticky destruovatelné/zavírané proměnné, tak příklad s goto bývá lepší řešení než bez něj. Přestože obvykle překladače přeloží ve výsledku oba kódy +- stejně, ve druhém případě si z lidského pohledu lépe pohlídám že vždy zavřu vše co mám - stačí napsat jednou na konci. Obzvláště když je těch error ukončení velký počet a rutinu stále vyvíjím a hrabu do ní a třeba přidávám další lokální věci co potřebují uzavření/dealokaci.