Goto-lause ohjelmoinnissa: määritelmä, käyttö ja kritiikki
Tutustu goto-lauseeseen: määritelmä, käyttö esimerkein ja kriittinen tarkastelu ohjelmoinnissa — tarvitaanko sitä nykykoodissa?
goto on lauseke monissa ohjelmointikielissä. Se on yhdistelmä englanninkielisistä sanoista go ja to. Se on tapa siirtyä toiselle koodiriville. Goto-lause ohjaa suorituksen kulkua hyppäämällä merkittyyn kohtaan ohjelmakoodissa, yleensä etikettinä (label), jonka perään hyppy tehdään.
Monet kielet tukevat goto-lausetta, monet eivät. Javassa goto on varattu sana, mutta sitä ei voi käyttää. (Varattu sana on sana, joka on osa ohjelmointikieltä ja jota ei voi käyttää muihin asioihin, kuten muuttujien nimeämiseen.) Useissa moderneissa kielissä goto on poissuljettu tai sen käyttöä rajoitetaan, mutta matalan tason kielissä ja vanhemmissa ympäristöissä sitä esiintyy yleisemmin.
Tietojenkäsittelytieteessä on olemassa teoria, jota kutsutaan strukturoidun ohjelman teoreemaksi. Tämän teorian mukaan mikä tahansa ohjelma voidaan kirjoittaa siten, että asiat tehdään funktioiden ja metodien (pienempien aliohjelmien) avulla sen sijaan, että ne tehtäisiin yhdessä hyvin suuressa ohjelmassa ja goto-lausekkeissa. Teoria todistaa, että goto-lausetta ei tarvita ohjelmien kirjoittamiseen.
Syntaksi ja esimerkki
Perusmuodossaan goto-hyppy sisältää etikettimerkinnän ja itse hyppykäskyn. Esimerkki C-kielestä:
start: /* jotain koodia */ if (ehto) goto end; /* muuta koodia */ goto start; end: /* lopetus */
Tämä hyppää labeliin start tai end. Joissakin kielissä (esim. C) etiketit ovat funktionen sisäisiä ja niiden näkyvyysrajoitettu; toisissa kielissä on erilaisia rajoituksia tai lauseen syntaksi poikkeaa.
Käyttötapaukset
- Virheenkäsittely ja siivous: C-ohjelmissa gotoa käytetään joskus rivakkaan virheenkäsittelyyn ja resurssien vapauttamiseen yhdestä paikasta (cleanup), kun muuten pitäisi moninkertaistaa koodia.
- Tilakoneet ja suorituspolut: Joissain suoritusajan tilakoneissa tai suorituskykykriittisissä osissa hyppyjä voidaan käyttää tehokkaan tilasiirtymän toteuttamiseen.
- Optimoitu matalan tason koodi: Konekielisiin tai assembly-tyyppisiin tilanteisiin lähentyvässä koodissa kontrollirakenteiden manuaalinen hallinta voi vaatia goto-tyyppisiä hyppyjä.
Rajoituksia ja kielikohtaisuudet
- Jotkut kielet eivät salli goto:ta lainkaan tai sallivat sen vain rajoitetusti (esim. Java pitää goto varattuna sanana, mutta ei käytettävissä).
- Tietyissä käännösohjelmistoissa on laajennuksia, kuten GCC:n "labels as values" -ominaisuus (lasketut goto-hypyt), mutta nämä ovat kieli- tai kääntäjäkohtaisia erikoisuuksia.
- Etikettien näkyvyys ja scope vaihtelevat; väärin käytettynä goto voi johtaa epäselvään ja vaikeasti ylläpidettävään koodiin.
Kritiikki ja haitat
1960-luvulta lähtien monet tutkijat ja ohjelmoijat ovat kritisoineet goto-lauseen laajaa käyttöä. Tunnettu esimerkki on Edsger Dijkstra, joka kirjoitti esseen "Go To Statement Considered Harmful". Keskeisiä kritiikin perusteita:
- Spagettikoodi: Liiallinen hyppely hajottaa koodin loogisen rakenteen ja vaikeuttaa virheenjäljitystä.
- Ylläpidettävyys: Koodin lukeminen, testaaminen ja laajentaminen vaikeutuvat, kun suorituksen kulku ei seuraa selkeitä rakenteita.
- Virheiden havaitseminen: Monimutkaiset hyppyreitit voivat aiheuttaa sivuvaikutuksia, resurssivuotoja ja vaikeasti havaittavia bugeja.
Vaihtoehdot
Usein goto voidaan korvata selkeillä, korkeamman tason kontrollirakenteilla:
- Toistorakenteet: for, while, do-while
- Valintarakenteet: if/else, switch
- Kumoukset: break, continue, return
- Poikkeukset (exceptions) ja selkeät virheenkäsittelymekanismit
- Funktioiden ja metodien käyttö koodin jakamiseen pienempiin, testattaviin osiin
Kun goto on hyväksyttävä
Vaikka goto on usein kielletty tai vältetty, on tilanteita joissa sen käyttö on perusteltua:
- Kun se yksinkertaistaa ja selkeyttää virheenkäsittelyä yhdistämällä siivoustoimenpiteet yhteen paikkaan.
- Kun suorituskyvyllisistä syistä on tarve hienoon kontrolliin, eikä korkeampitason rakenteilla saavuteta riittävää tehokkuutta.
- Pienissä, hyvin dokumentoiduissa ja rajatuissa kohdissa, joissa hyppyjen vaikutus näkyy selvästi ja testaus varmistaa oikean toiminnan.
Hyvät käytännöt
- Rajoita goto:n käyttöä ja dokumentoi selkeästi, miksi sitä käytetään.
- Pidä hyppyjen määrä minimaalisena; vältä monitasoisia hyppyjä, jotka johtavat epäselvään virtaa.
- Harkitse ensin rakenteellisempia vaihtoehtoja: funktiot, silmukat, poikkeukset.
- Kirjoita yksinkertaisia testejä ja varmista, että resurssien vapautus tapahtuu oikein myös hypyissä.
Yhteenvetona: goto on voimakas työkalu, joka mahdollistaa suoran ohjauksen ohjelman suorituksen kululle, mutta sen käyttöön liittyy merkittäviä ylläpidettävyys- ja luettavuusongelmia. Useimmissa tapauksissa on parempi käyttää strukturoituja kontrollirakenteita ja hajauttaa logiikka funktioihin, mutta on tilanteita — erityisesti matalan tason ohjelmoinnissa tai selkeässä virheenkäsittelyssä — joissa goto voi olla perusteltu ja käytännöllinen ratkaisu.
Käytä
Goto-lausetta käytetään yleensä merkinnän kanssa. Label on sana, joka yksilöi paikan koodissa. Goto-lause näyttää koodissa yleensä tältä:
Valitse LABELTässä esimerkissä tietokone hyppäisi paikkaan LABEL.
Usein goto-lause yhdistetään if-lauseeseen. Tällöin tietokone hyppää toiseen kohtaan koodissa vain, jos jokin on totta. Esimerkiksi:
IF condition THEN goto LABELTämä voidaan lukea seuraavasti: "jos jokin ehto on tosi, siirry LABELin sijaintiin".
Eri ohjelmointikielillä on erilaisia rajoituksia goto-lausekkeiden käytölle. Esimerkiksi C-ohjelmointikieli ei salli goto-lauseen hyppäämistä toisen funktion (aliohjelman) sisällä olevaan paikkaan.
Kysymyksiä ja vastauksia
K: Mikä on goto-lausuma?
V: Goto-lause on monissa ohjelmointikielissä tapa siirtyä toiselle koodiriville.
K: Kuinka monet ohjelmointikielet tukevat goto-lausetta?
V: Monet ohjelmointikielet tukevat goto-lausetta.
K: Missä ohjelmointikielessä goto on varattu sana?
V: Javassa goto on varattu sana, mutta sitä ei voi käyttää.
K: Mikä on varattu sana ohjelmointikielissä?
V: Varattu sana on sana, joka on osa ohjelmointikieltä ja jota ei voi käyttää muihin asioihin, kuten muuttujien nimeämiseen.
K: Mikä on tietojenkäsittelytieteen strukturoidun ohjelman lause?
V: Strukturoidun ohjelman lause on tietojenkäsittelytieteen teoria, jonka mukaan mikä tahansa ohjelma voidaan kirjoittaa siten, että asiat tehdään funktioiden ja metodien avulla sen sijaan, että ne tehtäisiin yhdessä hyvin suuressa ohjelmassa ja goto-lausekkeissa.
K: Todistaako strukturoidun ohjelman lause, että goto-lauseita tarvitaan ohjelmien kirjoittamiseen?
V: Ei, strukturoidun ohjelman lause todistaa, että goto-lauseketta ei tarvita ohjelmien kirjoittamiseen.
K: Mitä ovat funktiot ja metodit ohjelmoinnissa?
V: Funktiot ja metodit ovat pienempiä aliohjelmia, joita käytetään ohjelmoinnissa tiettyjen tehtävien suorittamiseen.
Etsiä