Programiranje

Java gre

Obstaja stara šala programerja, ki gre nekako takole: En programer v jezi reče drugemu programerju: "Pojdi v pekel!" Drugi programer v očitni odbojnosti odgovori: "Uf, uporabil si goto!" Bistvo tega nerdnega humorja je, da je za mnoge programerje uporaba "goto" skorajda najhujši prekršek, ki ga lahko storijo.

Obstaja več razlogov, da goto tako zelo ne spoštujejo razvijalci programske opreme. Članek Edsgerja W. Dijkstre Primer proti izjavi GO TO je razmeroma zgodnja razprava o zlih zlorab GOTO. V tem članku Dijkstra navaja: "[Prepričan sem], da je treba izjavo o prehodu odpraviti iz vseh programskih jezikov" višje ravni "." Izjava Dijkstra Go to šteje za škodljivo ne samo, da je ošvrknila izjavo goto, ampak je začela tudi priljubljen računalniški trend uporabe stavka "šteje za škodljivega" (čeprav sta bili ti dve besedi pred tem očitno uporabljeni zunaj programiranja).

Številne programerje od Dijkstre naprej grizejo nekateri problemi vzdrževanja, povezani z uporabo stavkov goto v nekaterih jezikih. Drugi programerji so te zgodbe že slišali ali pa so v njih toliko nabijali "Ne uporabljaj goto", da jim ne bi bilo treba izkusiti njegovih pomanjkljivosti, da bi verjeli, da ne bi smeli uporabljati GOTO.

Čeprav se zdi, da ima izjava goto na splošno slab sloves, ni brez podpornikov. Frank Rubin je napisal odgovor na Dijkstrin odgovor Pojdi na izjavo, ki velja za škodljivo (Marec 1968), imenovan GOTO, ki velja za škodljivega, "Šteje se za škodljivega" (marec 1987). Rubin je v tem pismu pisal o Dijkstrinem pismu, ki je tako močno vplival na programerje, da je "pojem, da je GOT0 škodljiv, sprejet skoraj splošno, brez dvoma in dvoma." O tem opažanju je Rubin zapisal: "To je povzročilo neizmerno škodo na področju programiranja, ki je izgubilo učinkovito orodje. To je kot mesarji, ki prepovedujejo nože, ker se delavci včasih porežejo." Upoštevajte, da je Dijkstra na Rubinovo pismo odgovorila z Nekoliko razočarajočo korespondenco. Wiki stran Cunningham & Cunningham Go To pove o izjavi goto: "Vajenec jo uporablja brez razmišljanja. Popotnik se temu izogne ​​brez razmišljanja. Poveljnik jo premišljeno uporablja."

Obstajajo številni drugi viri, ki zajemajo prednosti in slabosti uporabe izjave goto. Tu ne nameravam ponoviti te razprave, razen kratke predstavitve zgodnje zgodovine že zajetih sporov. Slišal sem, da so nekateri razvijalci Jave izjavili, da Java nima izjave goto in o tem želim razpravljati v nadaljevanju tega prispevka v blogu.

Java rezervira "goto" kot rezervirano ključno besedo. Vendar je to neuporabljena ključna beseda. To pomeni, da čeprav ključna beseda dejansko ne naredi nič produktivnega, je tudi beseda, ki je ni mogoče uporabiti v kodi za imena spremenljivk ali drugih konstruktov. Na primer, naslednja koda ne bo prevedena:

paket prah v.primeri; / ** * Predavanje prikazuje Java-jevo funkcijo, podobno goto. * / javni razred JavaGotoFunctionality {/ ** * Glavna izvršljiva funkcija. * * Argumenti @param Argumenti ukazne vrstice: ni pričakovanja. * / public static void main (final String [] argument)) {final String goto = "Pojdi v posteljo!"; }} 

Če poskusim zbrati to kodo, vidim napako, kakršna je prikazana na naslednjem posnetku zaslona.

Sporočilo o napaki "pričakovano" s kazalcem na presledek pred "goto" daje izkušenemu razvijalcu Java dovolj napotka, da hitro ugotovi, da je nekaj narobe z uporabo "goto". Vendar morda nekomu, ki je nov na Javi, ni tako očitno.

Običajno ne uporabljam konstrukcije goto, vendar se tudi zavedam, da obstajajo situacije, v katerih njegova uporaba omogoča kodo, ki je bolj berljiva in uporablja manj noro delo kot ne. V Javi je bilo to tudi realizirano in zagotovljena je podpora nekaterim najpogostejšim situacijam, v katerih bi bil goto stavek najkoristnejši in bi bil verjetno boljši od alternativ. Najbolj očitni primeri tega so označeni odmor in označena nadaljujte izjave. O njih razpravljamo in jih prikazujemo v razdelku Izjave o razvejanju vaj Java.

Sposobnost označiti določeno izjavo in nato imeti odmor ali nadaljujte veljajo za to izjavo in ne za njeno takojšnjo izjavo (kot neoznačena odmor ali nadaljujte does) je še posebej uporaben v primerih, ko bi ugnezdene zanke sicer zahtevale več kode in bolj zapleteno kodo za isto stvar. Ugotovil sem, da lahko pogosto preoblikujem svoje podatkovne strukture in kodo, da se izognem takim situacijam, vendar to ni vedno praktično.

Še en dober vir, povezan z uporabo goto podobnih funkcij v Javi, so izjave goto JDC Tech Tip Goto in programiranje Java. Kot poudarja ta namig, se lahko nalepke dejansko uporabljajo za kateri koli blok in niso omejene na odmor in nadaljujte. Vendar je po mojih izkušnjah nujnost tega pristopa zunaj odmor in nadaljujte je veliko manj pogosta.

Eno pomembnih ugotovitev glede nalepk je, da se izvajanje kode dobesedno ne vrne na to oznako, ko zlomiti nekaj etiket se izvrši. Namesto tega se potek izvršitve preusmeri na stavek, ki takoj sledi označenemu stavku. Na primer, če bi imel zunanjo za zanka, imenovana "dustin:", nato pa prekinitev, ki bi dejansko prešla na prvi izvršljivi stavek po koncu označenega za zanko. Z drugimi besedami, deluje bolj kot ukaz "pojdi na izjavo po označeni izjavi".

Nimam nobenih primerov uporabe teh oznak odmor ali označena nadaljujte izjave tukaj, ker je na spletu veliko dobrih primerov, ki jih je mogoče zlahka najti. Natančneje, dva vira, ki sem jih že omenil (Izjave o razvejanju vaj za Java in Izjave o Goto in Tehnični nasvet za programiranje Java), vsebujeta preprosta ilustrativna primera.

Bolj ko delam v industriji za razvoj programske opreme, bolj sem prepričan, da je v razvoju programske opreme malo absolutnega in da bodo ekstremistična stališča v tej ali drugi točki skoraj vedno napačna. Običajno se izogibam uporabi goto ali goto podobne kode, toda včasih je to najboljša koda za to delo. Čeprav Java nima neposredne podpore goto, ponuja podobno goto podporo, ki ustreza večini mojih razmeroma redkih potreb po takšni podpori.

To zgodbo, "Java's goto", je prvotno objavil JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found