Újra fellángolt a "goto" vita - PHP 5.1
Érdekes, és hosszúra nyúló szálban vitáztak a PHP fejlesztői a napokban azon, kell-e, szabad-e egy ilyen nyelvi elemet beengedni a PHP eszköztárába. Ahogy a címből is kiderült, a régi szép Basic idők goto-járól lenne szó. Az ötlet nem újkeletű, majdnem pont egy éve is hasonló nagy port kavart a PHP fejlesztői listán a téma, ahogy erről akkoriban be is számoltunk.
A bevezetés mellett az szól, hogy nagyon különleges esetekben roppant mód könnyíthet a kód megírásán, és bizonyos problémák rekurzív megoldására is nyújthat kissebb erőforrásigényű alternatívát. Igaz, megoldhatóak ezek a problémák a címkére ugrás lehetősége nélkül is, de jelentősen bonyolultabb, lassabb kód lehet a végeredmény.
Ellenérv kicsit több van: épp elég olyan dolog volt a PHP-ben, ami nagy bonyodalmakhoz vezetett (magic_quotes, register_globals sztorik), talán nem kellene ismét egy ilyet "szülni". Mások szerint, mivel ritkán hasznos, viszont könnyen lehet rosszul használni, ráadásul a használata megkerülhető, nincs rá szükség. És valljuk be, ismerve az egységsugarú PHP kódolókat, vélhetőleg valóban sűrűn találkoznánk a dolog rossz felhasználásával létrehozott kaotikus kódokkal.
Lassan de biztosan csappant meg a teljesen elutasítók tábora, és úgy tűnik, bizonyos megszorításokkal, de elérhető lesz ez a lehetőség a PHP jövőbeni kiadásában. Hogy milyen korlátok közé lesz szorítva? Egyrészt a címkéket csak statikusan lehet majd címezni, azaz nem lesz lehetőség változó által meghatározott helyre ugrani. Továbbá a kódban oda-vissza lépkedni csak hatókörön belül (például egy függvényben) lehet. Foreach ciklusba behuppanni biztos nem lehet majd. Az, hogy a foreach-et elhagyni lehessen-e, már esélyesebb, bár ez is veszélyes lépés ugyanis felszabadítatlan memóriaterületeket hagyhatunk magunk után, amiket csak a szkript futásának végeztével engedne el a Zend motor.
Találkozni olyan véleménnyel is, hogy maga az elnevezés is felesleges, hiszen erre a célra a break utasítás is megfelelne:
Személy szerint eddig is megvoltam a goto használata nélkül, és vélhetőleg továbbra is megleszek. Bár sosem lehet tudni, mikor szembesül az ember egy olyan feladattal, ahol sok erőforrást takaríthat meg egy okosan kialakított "ugrálós" kóddal...
■ A bevezetés mellett az szól, hogy nagyon különleges esetekben roppant mód könnyíthet a kód megírásán, és bizonyos problémák rekurzív megoldására is nyújthat kissebb erőforrásigényű alternatívát. Igaz, megoldhatóak ezek a problémák a címkére ugrás lehetősége nélkül is, de jelentősen bonyolultabb, lassabb kód lehet a végeredmény.
Ellenérv kicsit több van: épp elég olyan dolog volt a PHP-ben, ami nagy bonyodalmakhoz vezetett (magic_quotes, register_globals sztorik), talán nem kellene ismét egy ilyet "szülni". Mások szerint, mivel ritkán hasznos, viszont könnyen lehet rosszul használni, ráadásul a használata megkerülhető, nincs rá szükség. És valljuk be, ismerve az egységsugarú PHP kódolókat, vélhetőleg valóban sűrűn találkoznánk a dolog rossz felhasználásával létrehozott kaotikus kódokkal.
Lassan de biztosan csappant meg a teljesen elutasítók tábora, és úgy tűnik, bizonyos megszorításokkal, de elérhető lesz ez a lehetőség a PHP jövőbeni kiadásában. Hogy milyen korlátok közé lesz szorítva? Egyrészt a címkéket csak statikusan lehet majd címezni, azaz nem lesz lehetőség változó által meghatározott helyre ugrani. Továbbá a kódban oda-vissza lépkedni csak hatókörön belül (például egy függvényben) lehet. Foreach ciklusba behuppanni biztos nem lehet majd. Az, hogy a foreach-et elhagyni lehessen-e, már esélyesebb, bár ez is veszélyes lépés ugyanis felszabadítatlan memóriaterületeket hagyhatunk magunk után, amiket csak a szkript futásának végeztével engedne el a Zend motor.
Találkozni olyan véleménnyel is, hogy maga az elnevezés is felesleges, hiszen erre a célra a break utasítás is megfelelne:
break <címke_neve>;
Személy szerint eddig is megvoltam a goto használata nélkül, és vélhetőleg továbbra is megleszek. Bár sosem lehet tudni, mikor szembesül az ember egy olyan feladattal, ahol sok erőforrást takaríthat meg egy okosan kialakított "ugrálós" kóddal...
eval("goto '$valahova';");
goto $valahova
helyett majd azeval("goto '$valahova';")
lesz használva... jaj nekem, de csúnya ez... :)hatókör
A megszorítás nem arra vontakozna, mint amit írtál, hanem arra, hogy csak az adott hívási kontextuson belül lehtne ugrálni vele. Tehát például nem tudnál egyik függvényből a másikba ugrani, ami ténylegesen átláthatatlan kódot eredményezhetne.
Azt kéne megérteni, hogy a goto nem eredendően rossz, csak rosszul használ(j|t)ák sokan. Ha megnézed, maga a PHP tökéletes analógia, általában az a vélemény, hogy PHP-ban nem lehet biztonságos kódot írni, pedig csak az a baj, hogy boldog-boldogtalan nekiáll oldalakat gyártani benne, mert könnyűnek tűnik az elsajátítása.
Felhő
a hatókör természetes volt eddig is.
Ha kiugranál egy függvényből, akkor kérdéses, hogy a függvényt hívó résszel mi történtjen? Visszatérési érték nincs, az elemzés sem ott tart...
Ha beugranál egy függvénybe, akkor azontúl, hogy a paramétereket nem adtad át, még az sem tiszta, hogy a függvény vége után honnan folytatódjon a program.
Mivel nem ismerem a történetet, csak reménykedni tudok benne, hogy senki nem gondolta a fejlesztők közül komolyan azt, hogy ilyen szintű megszorításokat el lehetne hagyni... a másik megszorítás meg tényleg egy eval fv-nyel megoldható, így nem oszt, nem szoroz.
Természetesen nem eredendően rossz a goto, de teljesen más filozófia tartozik hozzá, mint a manapság használatos programozási módszerekhez. Személy szerint nem bánám, ha előre fejlődne a nyelv és nem hátra...
link?
tybalt
kb.
Pontos thread nincs, mert a PHP 5.1 véglegesítésével kapcsolatos thread kapcsán került elő a téma újfent. Innen talán el tudsz indulni.
Felhő
sikerult ...
tyb
A PHP igenis könnyen
A gond ott kezdődne, hogy az összes kezdő php-s könnyen elkezdhene goto-t használni agyba-főbe, mert látszólag egyszerűbb, azután megmaradna nekik ez a hülye szokás. (Pl. ciklusok helyett goto)
Szerintem nem nagyon kellene goto-t beengedni a php-be. Nagyon régen, mikor basicról nagy nehezen átszoktam a Pascalra, eleinte én is össze-vissza használtam goto-kat. Azután rájöttem, hogy felesleges.
Majd egyszer suliban infó órán semmi dolgom nem akadt, így nekiálltam szórakozni az Office-be épített Visual Basiccel (mivel jobb programozói környezet nem akadt körülöttem). Két nappal később jöttem rá, hogy van a basicben goto. Valahogy nem hiányzott :)
- saxus -
Nemtom, de nekem valahogy a
Egyszer mintha a tanerő mutatott volna olyan eljárást, ami csak goto utasítással oldható meg, de arra is találtam megoldást. Igaz kb 3-szor annyi sorból állt :D
-=RelakS=-
Kivételkezelés
--
Aries
parser, nyelvi elemzők
Mármint a viszonylag lassú kivétekezelés kiváltására. Plusz jól jöhet különbözö parserek, nyelvi elemzők esetén is.
Felhő
"értelmes fejlesztők" és a kivételkezelés :-)
Véleményem szerint az "értelmes fejlesztőknek" a goto megitélésében tökéletsen lényegtelen, hogy szerver oldali webalkalmazást, vagy kliens oldali asztali alkalmazást fejlesztenek... szerintem ez most tényleg releváns...
Ami meg a kivételkezelést illeti... rendkívül sajnálatos, hogy nem ezt javítják, hanem a goto-t erőltetik a fejlesztők. Finally block sincs, újrakezdés sincs. Pedig ezek a fogalmak már régóta ismertek. Na jó, C++ -ban sincsnek, de nem volt kötelező pont ezt lemásolni.
Valóban mindkettő megoldható goto-val, de...
Sok más is van...
Sok egyéb nagy fejlesztés is folyamatban van, mint pl az általános Unicode támogatás, jobb dátumkezelés, stb... Csak hát mi más tüzelné fel a kedélyeket, mint egy goto. :)))
:)
Teljesítmény
o Nem csak a kivételkezeléskor jöhet jól. Az csak egy itteni hozzászólásban hangzott el így. Amúgy nézd meg egy kivétel erőforrás igényét, illetve egy goto-ét. Ez utóbbi lényegesen olcsóbb lehet, ezért emlegetik, hogy speciális helyzetekben lenne csak fontos.
o Például nagyon jól jöhet egy állapotgép leprogramozásakor. Itt szintén igaz, hogy a goto olcsóbb, mint egy függvényhívás, így lényegesen gyorsabb lehet.
Felhő
goto
Spec. esetek?
van.
ciklus {
ciklus {
if (hiba) goto vege.
}
}
}
:vege
Legalábbis egy C++-könyv ezt ajánlotta. Ha nincs break(3), akkor segédváltozókat kellene bevezetni az állapot leírására.
FARKAS Máté
Ha ez fuggveny
--
Ámon Tamás - http://amon.hu
Minek ezen vitatkozni?
Legyen benne, aztán aki használja az használja, aki meg nem, az nem. Mit zavar az engem, hogy más hány goto-val tömi tele a kódját? Ha meg esetleg én használnám, az se zavarna senkit sem. Ennyi erővel a break-kel se lehessen 'kiugrani' ciklusból, mert az is megoldható másképp!
P][G
team munka
plusz ingyenes kódok, libek
Ami nem szimpatikus?
P][G
Jóreggelt,
a goto-nak megvan a helye és mint mindent lehet jól és rosszul is használni. És nem csak a Basic-ben van meg, hanem pl. a Pascalban is. A szakirodalom általában a többszörösen beágyazott ciklusokból való kiugrásra ajánlja, másra nem. A PHP-ból szerintem nem hiányzik, ennek ellenére ha belekerül az nem okoz semmiféle bajt. Aki eddig is elfogadhatatlan stílusban programozott az ezután is úgy fog, nem fogja elrontani a színvonalát. Aki pedig ad a színvonalra az minden eszköznek megtalálja a helyét megfelelő módon.
J.
Szerver oldal vs kliens oldal
A finaly viszont tényleg nem lenne rossz dolog.
- saxus -
Re: Szerver oldal vs kliens oldal
De emiatt sánta a te példád is. Azt mondod, hogy vannak helyek, ahol nem szükséges 0.0 idő alatti lefutás. Naná, hogy nem szükséges. Sokkal fontosabb a szép, átlátható kód. De nehogy itt akarjál goto-t használni!
Szerintem az hiba, hogy a szerver oldalon csak 0.0 idő alatt lefutható kódokat gyártunk. Nekem például nagyon hiányzik, hogy nem tudok párhuzamosan két szálat elindítani, az egyiken a böngészőnek megadom, hogy "türelem..." és néhány másodpercenként újratöltöm az oldalt, addig míg a másik szál ki nem számolt egy hosszú ideig tartó folyamatot.
(természetesen ez is megoldható, mint minden más, de olyan nagy hack kell hozzá, hogy elgondolkozhatunk azon, hogy megéri-e egyáltalán)
0.0 másodperc
Jakob Nielsen Webdesign című könyvében írta, hogy kutatások szerint az emberek 0.1 mp-nél érzik azt, hogy a program program teljesen interaktív. 1 mp alatti idő alatt nem szakad meg a gondolatmenetük. 10 mp már kezdik idegesíteni.
Szóval számoljunk: ott a generálási idő 5 másodperc. Ezután jön rá mondjuk 5 másodperc, letöltési idő, mivel emberünknek lassú netkapcsolata van. És ha mindez nem volt még elég, akkor számoljunk lassú géppel is, ahol 2 másodpercbe is eltelhet egy-egy oldal megjelenítése. És ha ezt minden oldalnál el kellene játszania? Nem hagyná ott az honlapot azonnal? Én igen.
Amúgy egy félreértést szeretnék elosztani: nekem egyáltalán nem hiányzik a goto a php-ben. Még basic-ben sem. :) (5. hozzászólás)
Jakob 10 másodperce...
Addig, míg arról szól az Internet (kifejezetten nagy betűvel), hogy a különböző szerverek nem kommunikálnak egymással, minden oldal csak a csöppnyi adatbázisából él, addig valóban legyen minden 0.0 másodperc alatt készen. De jó lenne, ha kinőne ebből az Internet.
Engem például egyáltalán nem zavar, hogy az bankomnál a belépés 5-10 másodpercig tart. Fogalmam sincs, hogy mi a franc történik közben... De annyit tudok, hogy sokszor ennyi idő alatt jutnék csak el a pénztárig, ha nem az netes bankolást használnám.
Az is jó lenne, ha az online boltok valóban online lennének. Nem fordulhatna elő, hogy megrendelek valamit, majd két nap múlva szólnak a raktárból, hogy bocsánatomat kérik, de a megrendelt áru éppen elfogyott.
Most, ha példának okáért a neten keresek az antikváriumok könyvei között, akkor egy rakás oldalt végig kell nézni. Milyen jó lenne, ha lenne egy központi kereső. Szívesebben várnék 5-10 másodpercet egy-egy kérés után, ahelyett, hogy 5-10 percet azzal szórakozak, hogy az egyes oldalakon külön keresek rá az adott könyvre...
Folytassam a listát?
eredmeny ideje vs reagalas ideje
Ha nem tortenik latszolag semmi, akkor egy kis ido utan elbizonytalanodsz, hogy most megnyomtad-e a gombot, mukodik-e a netkapcsolatd, mukodik-e a szerver, jol irtad-e be a logint stb. Ezert van szukseg az azonali visszacsatolasra!
persze...
de akkor mi bajod Jakobbal?
Jakob
A persze arra vonatkozott, hogy amit leírtál az teljesen logikus.
(amúgy JN-nel az a legnagyobb problémám, hogy renkívül makacs, keményfejű, és nem akar ő sem haladni a korral. Tényleg sok jót mond, de sok fájdalmasan rosszat is... azért hoztam elő a öt éves könyvet, mert az akkori trendek és a maik között szerencsére vannak külömbségek... sajnos nála ez az öt év fejlődése nem látszik meg. Így én most elhittem, hogy az öt évvel ezelőtti böngészők, az öt évvel ezelőtti sebességek mellett a 10 másodperces várakozás semmilyen formályában nem fogadta el. örülök neki, hogy mégis:) )
STOP
-boogie-
goto
Amit viszont zavaronak tartok a break-continue parosban, az az utanuk levo szam.
Elonyosebb lenne szerintem inkabb valahogyan elnevezni a ciklust, es valahogy igy kilepni:
break ciklus_neve;
Bar ez lehet hogy mar egy kicsit eroltetett.
Régi szép BASIC-es
------------------
www.dnslab.hu
www.mamboserver.hu
<Nincs cím>
Emlékeim szerint a Pascal előretörésével hullott ki a fejlesztők emlékezetéből, mondvan idegen a strukrurált programozás elvétől.
Így 20-25 év távlatéból úgy gondolom, hogy túlzott volt ez a nagy "hátat forditás".
toro
Az a baj a gotoval (és
ProClub
proclub##kukac##karinthy.hu
Miről beszélünk?
Írj egy esetet légyszi, ahol ez hiányzik Neked? ;)
2.
Csak függvényen belül lehetne max ugrani vele!!!
Felhő
Az igazi programozók használják a GoTo-t
egész pontosan itt olvastam:
http://www.graf-get.hu/download/humor/igazi.html
Sweetchack
Hiányzik...
Más még, ami hiányzik:
- Namespace! Hogy struktúráljak normálisan egy több száz fájlból álló PHP program-csomagot?
- destruktorok (destroy metódus)
Inkább ezeket csinálnák meg a goto helyett...
ProClub
proclub##kukac##karinthy.hu
Goto?
hiányzik...a doksi ;-)
http://news.php.net/php.internals/17304
Amúgy meg gondos struktúrálással és nevezéktannal simán megoldható, nézd meg a PEAR-t.
Ajánlom nekezd ezt.
Felhő
<Nincs cím>
Felhasználó barát?
Mitől a GOTO-tól egy program felhasználóbarát?
Felhő