Autor | Zpráva | ||
---|---|---|---|
blizzboz Profil |
#1 · Zasláno: 4. 4. 2010, 13:15:14 · Upravil/a: blizzboz
príkaz Goto je jazyková konštrukcia ktorá sa neodporúča používať ale sú prípady keď jeho použite sprehľadňuje kód... v PHP je bohužiaľ dostupný až od verzie 5.3
ako ho mám nahradiť v tomto prípade? if (empty($_FILES["file"])) goto errorMessage; //tento riadok funguje len v PHP 5.3 $upload = new HttpUploadedFile($_FILES["file"]); if (!$upload->isImage()) { errorMessage: //tento riadok funguje len v PHP 5.3 MessageBox::show('Zvolený súbor nie je obrázok.'); return; } tak aby bol kód rovnako prehľadný... |
||
Nox Profil |
#2 · Zasláno: 4. 4. 2010, 13:40:19
a co třeba throw new Exception?
|
||
blizzboz Profil |
#3 · Zasláno: 4. 4. 2010, 14:43:29
Nox:
dobrý nápad, dík za radu už som to vyriešil cez výnimky: class ImageTypeException extends Exception { public function __construct() { parent::__construct('Tento typ súboru galéria nepodporuje.'); } } ... try { if (empty($_FILES["file"])) throw new ImageTypeException(); $upload = new HttpUploadedFile($_FILES["file"]); if (!$upload->isImage()) throw new ImageTypeException(); } catch (Exception $e) { MessageBox::show($e->getMessage()); return; } ... |
||
AM_ Profil |
#4 · Zasláno: 4. 4. 2010, 14:51:32
blizzboz:
„sú prípady keď jeho použite sprehľadňuje kód...“ a také jsou případy, kdy si autor myslí, že to zpřehledňuje kód, protože neví, jak se to navrhuje správně, a těch je bohužel víc. Já programuji nějakých 8 let a ještě nikdy mi skoky nechyběly, ani v PHP, ani jinde, člověk by se jim měl opravdu vyhýbat. Leda snad při vyskočení ze zanořeného cyklu. |
||
blizzboz Profil |
#5 · Zasláno: 4. 4. 2010, 15:01:25
AM:
ja programujem už 13 rokov a už som narazil na situácie kedy príkaz goto naozaj sprehľadnil alebo zefektívnil kód. goto neni zlá jazyková konštrukcia keď ju programátor používa z rozumom, skoro všetky moderné jazyky príkaz Goto obsahujú. |
||
DoubleThink Profil * |
#6 · Zasláno: 4. 4. 2010, 17:15:24
blizzboz:
„už som narazil na situácie kedy príkaz goto naozaj sprehľadnil alebo zefektívnil kód“ Jak už bylo řečeno - při správném zapouzdření nemůže vzniknout situace, kdy by bylo goto potřeba. A ani víceúrovňového breaku - na tohle jsou opravdu určeny výjimky. |
||
blizzboz Profil |
#7 · Zasláno: 4. 4. 2010, 21:40:29 · Upravil/a: blizzboz
DoubleThink:
príkaz goto niekedy radikálne zrýchli aplikáciu(a to neplatí len pre PHP ale pre všetky jazyky) už len obyčajné volanie funkcie / metódy je náročnejšie na čas a pamäť(vidno to hlavne pri práci s veľkým množstvom dát napr. spracovanie grafiky, zvuku, videa atď.) - každé volanie funkcie sprevádza zbytočná réžia vpodobe volania funkcie, manipuláciami s parametrami a návratovými hodnotami, skús si niekedy pozrieť debugger ako vyzerá tebou napísany skompilovaný a kód po preložní v assembleri a koľko zbytočných inštrukcií sprevádza volanie funkcie. a keď sme už pri tom PHP kóde ktorý som tu predtým vložil tak ten s príkazom Goto okrem toho že je rýchlejší je aj kratší a prehľadnejší, príkaz goto som nepoužil len preto že ho nepodporuje PHP 5.2 a čo má príkaz goto so zapúzdrením? Zapúzdrenie sa týka členov tried. skoky na návestia sú možné len v rámci jednej metódy / funkcie a zapúzdrenie nemá absolútne nič s návestiami. |
||
DoubleThink Profil * |
#8 · Zasláno: 4. 4. 2010, 21:52:06 · Upravil/a: DoubleThink
blizzboz:
„príkaz goto niekedy radikálne zrýchli aplikáciu“ Neměřitelně. To je správné slovo. Hrát si u PHP na nějaký management paměti procesních (tedy nikoliv resource) prostředků je k smíchu. „Zapúzdrenie sa týka členov tried“ Neříkej. Goto boří hierarchii programu, dělá neuvěřitelný bordel v jeho procesních úrovních a šíleně jej znepřehledňuje. A vůbec nejde o délku zápisu mimochodem - jde o logickou strukturu. Myslím, že u objektových jazyků (a PHP si na objektový jazyk zkouší hrát), goto nemá co pohledávat. Tvůj program v [#1] je principiálně špatný - výjimečnou situaci (soubor není obrázek) řeší výjimka (ne/zachycená nějakou vyšší úrovní). Neexistuje omluva pro jiný postup. Prostě neexistuje. |
||
Nox Profil |
#9 · Zasláno: 4. 4. 2010, 23:44:20 · Upravil/a: Nox
souhlas s DoubleThinkem
I kdyby to bylo efektivnější, řešit něco takového v PHP je nesmysl, už jen jediná menší třída sežere tolik zdrojů že wtf (stovky kB)... dnes už se stejně klade většinou větší důraz na robustní a kvalitní řešení než aby to šlapalo co maximálně nejrychleji Jestli to je tedy efektivní, tak zapomeň taky na všechny objekty a spousty dalších vychytávek....protože jejich použitím mnohanásobně zabiješ efekt toho goto Z hlediska přehlednosti poskytují výjimky stejnou, spíše lepší službu Pokud goto tak leda v assembleru....kde je to ale docela jasné. No....snad leda ještě nějaký malý brutálně optimalizovaný C program nebo něco, kde by rychlost byla kritérium č. 1...to ale není pro PHP |
||
Joker Profil |
#10 · Zasláno: 5. 4. 2010, 00:44:41
Poznámka mimo:
„v PHP je bohužiaľ dostupný až od verzie 5.3“ PHP zavedlo GOTO?! Eh, s prominutím, vývojáři PHP teda mají talent na vymýšlení kravin. Když už PHP 5.3 konečně zavrhlo magic_quotes, pro změnu zase zavede GOTO. Jako by PHP nemělo jiné problémy. blizzboz: „tak aby bol kód rovnako prehľadný“ Nic ve zlém, ale mně ta uvedená konstrukce vůbec nepřijde přehledná, resp. podle mě nevzniká chaos jen proto, že to je jen 8 řádek kódu. Mít blok IF s nějakou podmínkou a odjinud do něj skákat s úplně jinou podmínkou mi vůbec nepřijde jako dobrý nápad, naopak spíš jako důvod, proč by příkaz GOTO neměl v programovacích jazycích být. „goto neni zlá jazyková konštrukcia keď ju programátor používa z rozumom“ Na "goto s rozumem" Jsou jiné příkazy jako break, continue nebo try-throw-catch. Čili příkaz goto zbývá vesměs na ty nerozumné scénáře. Mimochodem, pokud by šlo o "kratší" kód (nikoliv "lepší logickou strukturu"), dá se to napsat i takhle: if (empty($_FILES["file"]) || !($upload = new HttpUploadedFile($_FILES["file"]) || !$upload->isImage()){ MessageBox::show('Zvolený súbor nie je obrázok.'); return; } |
||
Mastodont Profil |
#11 · Zasláno: 5. 4. 2010, 08:56:12
u objektových jazyků (a PHP si na objektový jazyk zkouší hrát), goto nemá co pohledávat
PHP ale není čistě objektový jazyk. Neexistuje omluva pro jiný postup. Prostě neexistuje Nikdy neříkej nikdy. Debata o zavedení goto probíhala kolem roku 2004 a kladný výsledek říká, že nějaké výhody asi budou ... proč k přeskočení určité části používat nějaký if navíc, když to jde bez něj? Osobně goto nepoužívám, ale nevylučuji situaci, kdy se bude hodit. |
||
Amunak Profil |
#12 · Zasláno: 5. 4. 2010, 10:57:31
AM:
„ještě nikdy mi skoky nechyběly, ani v PHP, ani jinde“ Tak to jsi asi nikdy nevytvářel dákvové (bat) soubory :) |
||
Nox Profil |
#13 · Zasláno: 5. 4. 2010, 11:28:36
Joker:
„PHP zavedlo GOTO?! Eh, s prominutím, vývojáři PHP teda mají talent na vymýšlení kravin.“ Goto v PHP byl vtip, kdoví jestli to je fakt skutečně implementovaný http://cz.php.net/manual/en/control-structures.goto.php v manuálové stránce je dokonce komiks který to paroduje |
||
blizzboz Profil |
#14 · Zasláno: 6. 4. 2010, 20:35:58
Joker:
ja príkaz goto používam len výnimočne(možno raz za 2 roky) tam kde má nejaké opodstatnenie keď som začínal s programovaním tak bolo používanie skokov úplne bežné každý riadok bol očíslovaný a celé programovanie bolo založené na skokoch na návestia, nevedel som čo sú to procedúry a funkcie poznal som len príkaz GOTO (a podobné príkazy GOSUB, RETURN) dokonca aj cykly sme zo začiatku riešily cez opakujúce sa skoky na návestia v kombinácii s vetvením(IF, CASE, atď) keď som mal v aplikácii niekoľko stoviek skokov tak to naozaj viedlo k neprehľadnému a ťažko udržiavateľnému kúdu, náchylnému k chybám. na príkaze goto ale v princípe neni nič zlé, ak ho programátor používa zmysluplne, môže niekedy sprehľadniť kód a ušetriť pár riadkov alebo ho zrýchliť, veľa problémov má niekoľko riešení a je len na programátorovi ktoré z riešení si vyberie. Nox jasné že goto v PHP 5.3 normálne funguje |
||
AM_ Profil |
#15 · Zasláno: 6. 4. 2010, 23:06:12
Amunak:
„Tak to jsi asi nikdy nevytvářel dákvové (bat) soubory :)“ vytvářel. OK, oprava - v plnohodnotných strukturovaných jazycích mi nechybí. Nevidím důvod, proč by v PHP být neměl, koneckonců PHP je založené právě na jednoduchosti a "přívětivosti pro amatéry", kteří nejsou nuceni psát kulturně. Nicméně já jej používat nebudu a do dnešního dne jsem neviděl program, kde by použití goto bylo opodstatněné, a ani mě nikdy nenapadlo (opomeňme dávné začátky mého programování) jej použít, jakmile člověk jednou začne přemýšlet strukturovaně, už ho prostě ani nenapadne skákat sem a tam. Veskrze existují jen 3 věci, kam skočit: - někam se vrátit - celé to obalíme do smyčky - skočit o kus dál = kus přeskočit = dáme ho do IFu - skočit na konec - break, return, exit ... |
||
Joker Profil |
#16 · Zasláno: 7. 4. 2010, 12:07:19 · Upravil/a: Joker
Mastodont:
„Debata o zavedení goto probíhala kolem roku 2004 a kladný výsledek říká, že nějaké výhody asi budou“ PHP už zavedlo i věci, které nemají žádné výhody a přinášejí spoustu problémů, třeba magic_quotes_gpc. blizzboz: „na príkaze goto ale v princípe neni nič zlé“ Pokud se budeme bavit o jazycích, které pro "rozumné použití skoku" mají jiné příkazy, pak skoro jakékoliv použití goto je špatně. V principu je na GOTO špatné to, že nabourává posloupnost programu a vytváří místa, kde není zřejmé, kudy se tam vlastně program dostane. Problém s GOTO myslím dobře ilustruje (a dovádí do extrému) vtip s opačným příkazem COMEFROM. „ja príkaz goto používam len výnimočne(možno raz za 2 roky) tam kde má nejaké opodstatnenie“ Mno, když vezmu kód v prvním příspěvku: Které paradigma dovoluje skok dovnitř bloku? Strukturované programování zavrhuje skoky celkově (krom podmínek a cyklů), v praxi se považuje za užitečné "nestrukturované" předčasné opuštění bloku (tj. výjimky nebo příkazy typu break nebo continue). Ale skok dovnitř bloku zavrhují snad všichni. „keď som začínal s programovaním tak bolo používanie skokov úplne bežné“ S tím, že skoky jsou špatné, přišlo strukturované programování, hlavně asi slavné Go To Statement Considered Harmful (v roce 1968). Dodatek: A zvyky se mění, například před časem jsem četl na ŽIVĚ článek o Opravdovém hackerovi ...a říkal jsem si, že na dnešní poměry by ten člověk byl dost mizerný programátor. Tehdy bylo podstatné, že ten program byl velice efektivní. Dneska by bylo podstatné, že je naprosto neudržovatelný. AM: „Nevidím důvod, proč by v PHP být neměl, koneckonců PHP je založené právě na jednoduchosti a "přívětivosti pro amatéry"“ Tak právě to, že PHP je založené právě na jednoduchosti a "přívětivosti pro amatéry" je důvod tam nedávat příkaz, který má smysl jen v hodně výjimečných případech při použití někým, kdo opravdu dobře ví co dělá, a amatér si s ním může dost naběhnout (resp. vyrobit program, ve kterém se pak vůbec nikdo nevyzná). |
||
AM_ Profil |
#17 · Zasláno: 7. 4. 2010, 21:32:14
Joker:
„Tak právě to, že PHP je založené právě na jednoduchosti a "přívětivosti pro amatéry" je důvod tam nedávat příkaz, který má smysl jen v hodně výjimečných případech“ Jenže amatér nemusí mít tušení, jak nějakou složitější strukturu sestavit, tak tam prostě plácne goto a funguje to, ačkoli to třeba není přehledné a další rozšiřování aplikace takřka nemožné. Lepší vrabec v hrsti, nežli holub na střeše, fungující nehezký kód bude tomu člověku více platný, než když to nepůjde a on bude muset pár hodin studovat, jak se to dělá čistě. Jsou mezi námi i tací, kteří za život napíší pět jednoduchých webů a pak už PHP nikdy neuvidí, a těm není potřeba nutit striktní pravidla. |
||
Časová prodleva: 14 let
|
0