A goto egy utasítás számos programozási nyelvben. Az angol go és to szavak kombinációja: azt jelenti, hogy a vezérlés egy másik kódsorra ugrik. Egyszerű formában a goto egy címkére (labelre) vagy sorazonosítóra ugrik, és onnan folytatódik a végrehajtás.
Sok nyelv támogatja a goto utasítást, és sok nyelv nem. A Java-ban a goto egy fenntartott szó, de nem használható. (A fenntartott szó olyan szó, amely a programozási nyelv része, és nem használható másra, például változók elnevezésére.)
Használat és egyszerű példa
Tipikus goto-szerű viselkedés például C-ben címkével és goto-val:
(A tényleges kódrészlet démonstrációként értendő; itt csak a működési elvet magyarázzuk.)
Miért vitatott a használata?
A goto azért vált vitatottá, mert könnyen rontja a kód olvashatóságát és karbantarthatóságát. A programokban lévő sok ugrás "spagettikódot" eredményezhet: a vezérlés nehezen követhető, a logikai hibák felderítése nehezebb, és a refaktorálás kockázatosabbá válik.
A strukturált programelmélet
Az informatikában létezik egy elmélet, amelyet strukturált programtételnek neveznek. Ez az elmélet azt mondja, hogy bármilyen programot meg lehet írni úgy, hogy a dolgokat függvényekkel és módszerekkel (kisebb alprogramokkal) végezzük el, ahelyett, hogy egyetlen nagyon nagy programban és goto utasításokban tennénk. Az elmélet azt bizonyítja, hogy a goto utasítás nem szükséges a programok írásához.
A strukturált programozás alapvető építőelemei a sorozat, a választás (if/else) és az ismétlés (while/for). Ezek kombinálásával a legtöbb algoritmus egyértelműen és biztonságosan megvalósítható anélkül, hogy explicit ugrásokra lenne szükség.
Mikor lehet mégis hasznos a goto?
- Hibakezelés és erőforrás-felszabadítás C-szerű nyelvekben: néha egyszerűbb egy központi cleanup címkére ugrani, mint többszörös if/else szerkezetet írni.
- Kilépés többszörös beágyazott ciklusból: bizonyos esetekben a goto rövidebb és kevésbé feltűnő megoldást adhat, bár sok nyelv kínál más eszközöket (például zászló változókat, kivételezést vagy beépített break/return lehetőségeket).
- Alacsonyszintű, optimalizált kód: ritkán, speciális helyzetekben a goto segíthet teljesítmény-optimalizálásban, de ez olvashatóság és későbbi karbantartás árán történik.
Nyelvi különbségek
- Néhány nyelv (például C) támogatja a goto-t címkékkel.
- Mások (például Java) fenntartják a kulcsszót, de nem engedik a használatát.
- Velük ellentétben magasabb szintű nyelvek és modern nyelvi konstrukciók (kivételek, korai visszatérés, beépített cikluskezelés) gyakran pótolják a goto szükségességét.
Gyakorlati tanácsok
- Általános szabályként törekedj a strukturált megoldásokra: függvények, tiszta vezérlési szerkezetek, jól dokumentált feltételek.
- Ha olyan környezetben dolgozol, ahol a goto elfogadott (például alacsony szintű C rendszerszoftver), akkor tartsd korlátozottan, jól kommentálva és egységes stílusban a használatát.
- Hibakezelésre modernebb alternatívák (például kivételek vagy RAII mintája C++-ban) gyakran jobbak, mert biztonságosabban kezelik az erőforrásokat és a kivételes állapotokat.
Összefoglalás
A goto egyszerű, de erőteljes eszköz: lehetővé teszi a vezérlés tetszőleges sorra történő ugrását. Ugyanakkor a strukturált programelmélet és a gyakorlat azt mutatja, hogy a legtöbb esetben jobb, olvashatóbb és karbantarthatóbb megoldást adnak a strukturált vezérlési szerkezetek és a jól megszervezett alprogramok. Ritka speciális esetekben — például alacsony szintű hibakezelés vagy teljesítménykritikus optimalizáció — a goto még mindig indokolt lehet, de használatát mindig megfontoltan és körültekintően javasolt alkalmazni.