Autor Zpráva
blizzboz
Profil
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
a co třeba throw new Exception?
blizzboz
Profil
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
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
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 *
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
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 *
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
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
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;
}
...na pouhé 4 řádky!
Mastodont
Profil
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
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
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
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
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
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
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.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0