ugrás a tartalomhoz

A goto vezérlés és a PHP

Hojtsy Gábor · 2004. Júl. 31. (Szo), 10.45
Mint ahogy blogmarkban is jeleztük, Sara Golemon a goto vezérlési lehetőség bevezetését javasolta a PHP 5 kódjába, mégpedig megnevezett kódpontokra való ugrás megoldásaként. A javaslat körül kialakult vitában egyesek szerint meglepően sokan nyilvánították ki pozitív véleményüket a goto bevezetését illetően. Lássuk miről is van szó!

Egy goto vezérlést használó for ciklus így nézne ki PHP 5-ben:

<?php
  $counter = 0;
loop:
  echo ++$counter . "<br/>\n";
  if ($counter < 10) {
    goto 'loop';
  }
?>
A javaslat ellen fellépők leginkább Edsger W. Dijkstra: Go To Statement Considered Harmful című 1968-as írását emlegetik fel, illetve tanulmányaikra hivatkoznak, melyek arra engednek következtetni, hogy a goto használata nem jó ötlet, nehezen kezelhető kódhoz vezet.

A goto pártolói ellenben azt mondják, hogy az eszközt rosszul használók okozhatnak problémát. Gondolhatunk egy csákányra, melyet jó és rossz célokra egyaránt fel lehet használni, és ez az alkalmazón múlik. Maga a rossz felhasználási lehetőség ténye nem jelenti azt, hogy el kell felejteni az eszközt. A goto pozitívumai között említik a hibakezelésnél előnyös természetét, a nyelvi elemzők írásakor elfoglalt fontos szerepét, és gyorsan működő vezérlések megvalósításában vitathatatlan hasznát.

A két oldal között oda-vissza sorolhatnánk az érveket, ehelyett érdemes áttekinteni a két tábor blog bejegyzéseit. Ellenzi: Jeff Moore, John Lim. Támogatja: Wez Furlong, Alan Knowles. A teljes levelezőlista szál az internals lista archívumában is olvasható, még változatosabb véleményekkel.
 
1

hogy is mukodne?

mepet · 2004. Júl. 31. (Szo), 12.53
Szerintem is tuti lenne a goto-t hasznalni a phpben is, mert emlekszem meg arra, amikor a programozas tanarom visszaadta a pascalban megirt muvemet, mert volt benn 1 goto. Bosszubol csak gotokat irnek :D
Komolyabban: nyugodtan bevezethetnek, maximum aki nem akarna, az nem hasznalna :)
Nah a kerdesem: ha tenyleg bevezetnek, akkor ugy mukodne, mit a pascalban, vagyis odaugrana az ertelmezo, ahova kell, es onnantol futna a kod a vegeig, vagy csak az elso "?>"-ig, vagy kezzel kene kijelolni a programresz veget(akkor olyan lenne, mint egy egyszeru fuggveny), vagy meddig es hogyan? :)
2

Lokális goto

Hojtsy Gábor · 2004. Júl. 31. (Szo), 13.34
Ha elolvasod a kommentárokat, abból kiderül, hogy lokálisan használható csak, tehát egy függvényen belül csak a helyben definiált pontokra lehet ugrani. Ezesetben a függvény végéig (vagy más vezérlés irányításának hatásáig [újabb goto, return, stb] menne a futás). A globális térben is lehet a jelenlegi javaslat szerint ugrálni, ezt néhány ember szerint le kellene tiltani.

Tehát a mostani javaslat szerint egy függvényből a másikba vagy globális részről függvénybe nem tudnál ugrani, csak adott környezetben definiált pontokra.
3

megint goto - megint a régi érvekkel

gerzson · 2004. Júl. 31. (Szo), 21.00
Én is inkább támogatom, mint ellenzem, de mindig hiányoltam annak megértését, hogy - újabb példát hozva - a gyógyszereket - bár életmentőek - elpakoljuk a kisgyerekek elől, nehogy rossz kézbe kerüljenek. Igenis megnehezítjük (értsd: reális esély van rá) mások és saját magunk munkájátt, mert vagy el kell zárni a kezdők elől, vagy utána nekünk kell majd a rosszul felépített programjukat javítani. Nem akarok megbántani senkit, de a PHP könnyen tanulható nyelv, és ki tudja, mennyire zavarja ez meg a kezdőket.

Érdekes megfigyelni azt is, h. a támogatók között sokan képzett - nem feltétlenül/elsősorban - PHP-ban programozók (erős C hatást érzek), és kifejezetten speciális felhasználási területeket emlegettek a goto felhasználására.

Tény, hogy a goto ütközik a struktúrált programozási paradigma néhány ismérvével:
  • Nem elég kifejező a neve, ami alatt nem azt kell érteni, h. nem tudjuk mit csinál ("ugrik"), hanem azt, hogy nem tudjuk, miért rakták oda. Ezzel szemben lásd if, while, for, switch.
  • A struktúrált programozás alapja, h. a prg kisebb blokkokra bontható, és minden ilyen blokkba egy helyen lehet belépni, és egy helyen kilépni. S ez nagyon hasznos, mert így sokkal könnyebben nyomon tudjuk követni a működést. A goto-val ez megsérül.
  • Valójában minden goto kiküszöbölhető vezérlési szerkezet alkalmazásával, ennél fogva feleslegesen duzzasztja a nyelvi eszközök halmazát, amiből nehezebb kiválasztani a legcélszerűbbet. (Néha ez nem is annyira triviális, mint ahogy elsőre gondolnánk!) Bár mindez akadémikusan hangzik, gondoljunk az 1. pontra! (és még sok másra)

Ennek ellenére vannak tényleg olyan esetek, ahol a goto természetesebben hat, mint bármelyik más vezérlési szerkezet, vagy nagyságrendekkel hatékonyabb lehet. Főként erről szóltak a támogatók által javasolt felhasználási területek.

Ajánlom mindeki figyelmébe a Programtervezés c. könyvet a Kiskapu-tól, ahol körültekintően összegyüjtötték az érveket pro és kontra. Ha ezt mindenki elolvasná és figyelembe venné, nyugodtan be lehetne építeni a nyelvbe.