Programavimas

„Java“ dingo

Yra senas programuotojo pokštas, kuris pasakoja maždaug taip: Vienas programuotojas supykęs sako antram programuotojui: „Eik į pragarą!“ Antrasis programuotojas atsako akivaizdžiai atstumdamas: „Ugh, tu naudojai goto!“ Šio nerangaus humoro esmė ta, kad daugeliui programuotojų „goto“ naudojimas yra tik pats blogiausias nusikaltimas, kurį galima padaryti.

Yra kelios priežastys, dėl kurių programinės įrangos kūrėjai goto vertina taip menkai. Edsgerio W. Dijkstros dokumentas „A Case Against the GO TO Statement“ yra gana ankstyvas traktatas apie piktnaudžiavimą GOTO. Tame straipsnyje Dijkstra teigia: „[Aš įsitikinau], kad pareiškimas„ eiti į pareiškimą “turėtų būti panaikintas iš visų„ aukštesnio lygio “programavimo kalbų“. Dijkstros „Go to Statement“ laikomas žalingu laišku ne tik pagražino goto pareiškimą, bet ir pradėjo populiarią informatikos tendenciją vartoti frazę „laikoma kenksminga“ (nors šie du žodžiai anksčiau buvo naudojami ne programavimo metu).

Nuo „Dijkstra“ daugeliui programuotojų įkando tam tikros priežiūros problemos, susijusios su „goto“ teiginių naudojimu tam tikromis kalbomis. Kiti programuotojai yra girdėję šias istorijas arba „taip, kad nenaudosite goto“ buvo taip daužomi, kad nereikia pajusti jos trūkumų, norint manyti, jog jie neturėtų naudotis „GOTO“.

Nors atrodo, kad goto pareiškimas apskritai turi blogą reputaciją, jis nėra be savo šalininkų. Frankas Rubinas parašė atsakymą į Dijkstros Eikite į teiginį, kuris laikomas žalingu (1968 m. Kovo mėn.) Pavadino GOTO laikoma kenksminga „Laikoma kenksminga“ (1987 m. Kovo mėn.). Tame laiške Rubinas rašė apie tai, kad Dijkstros laiškas paveikė programuotojus taip dramatiškai, kad „nuomonė, kad GOT0 yra kenksminga, priimta beveik visuotinai, be jokių abejonių ir abejonių“. Apie šį pastebėjimą Rubinas rašė: "Tai padarė neapskaičiuojamą žalą programavimo sričiai, kuri prarado veiksmingą įrankį. Tai panašu į mėsininkus, draudžiančius peilius, nes darbuotojai kartais susipjausto". Atkreipkite dėmesį, kad Dijkstra į Rubino laišką atsakė „Apie šiek tiek nuviliančią korespondenciją“. „Cunningham & Cunningham Wiki“ puslapyje „Go To“ apie goto teiginį sakoma taip: „Pameistrys naudojasi negalvodamas. Kelionininkas vengia negalvodamas. Meistras naudojasi apgalvotai“.

Yra daugybė kitų šaltinių, kurie pateikia „goto“ teiginio naudojimo privalumus ir trūkumus. Neketinu čia pakartoti tų diskusijų, išskyrus trumpą ankstyvosios jau aptartos diskusijos istorijos pristatymą. Girdėjau kai kuriuos „Java“ kūrėjus, teigiančius, kad „Java“ neturi „goto“ teiginio ir tai noriu aptarti likusioje šio tinklaraščio dalyje.

„Java“ rezervuoja „goto“ kaip rezervuotą raktinį žodį. Tačiau tai nenaudojamas raktinis žodis. Tai reiškia, kad nors raktinis žodis iš tikrųjų nedaro nieko produktyvaus, jis taip pat nėra žodis, kurio negalima naudoti kintamųjų ar kitų konstrukcijų pavadinimų koduose. Pvz., Šis kodas nebus kompiliuojamas:

pakuotė dustin.pavyzdžiai; / ** * klasė, demonstruojanti „Java“ panašų į „goto“ funkcionalumą. * / public class JavaGotoFunctionality {/ ** * Pagrindinė vykdomoji funkcija. * * @param argumentai Komandinės eilutės argumentai: niekas nesitikėjo. * / public static void main (final String [] argumentai) {final String goto = "Eik miegoti!"; }} 

Jei bandysiu sukompiliuoti tą kodą, matau tokią klaidą, kuri parodyta kitame ekrano momentiniame vaizde.

Klaidos pranešimas „tikimasi“ su žymekliu vietoje prieš „goto“ suteikia patyrusiam „Java“ kūrėjui pakankamai užuominos, kad greitai suprastų, jog naudojant „goto“ kažkas negerai. Tačiau tai gali būti ne taip akivaizdu naujiems „Java“ žmonėms.

Paprastai nenaudoju „goto“ konstrukcijos, bet taip pat pripažįstu, kad yra situacijų, kai jį naudojant yra lengviau įskaitomas kodas, kuriame naudojami mažiau beprotiški sprendimai nei jo nenaudojimas. „Java“ tai taip pat buvo suprasta ir palaikoma kai kuriose dažniausiai pasitaikančiose situacijose, kai „goto“ teiginys būtų naudingiausias ir greičiausiai iš tikrųjų būtų tinkamesnis už alternatyvas. Akivaizdžiausi to pavyzdžiai yra etiketės pertrauka ir paženklinti Tęsti pareiškimus. Jie aptariami ir parodomi „Java“ mokymo programų skyriuje „Šakojimo pareiškimai“.

Galimybė pažymėti konkretų teiginį ir tada turėti pertrauka arba Tęsti taikoma šiam teiginiui, o ne jo tiesioginiam teiginiui (kaip nepažymėtam pertrauka arba Tęsti daro) yra ypač naudinga tais atvejais, kai įdėtoms kilpoms reikalauti daugiau kodo ir sudėtingesnio kodo tam pačiam dalykui atlikti. Pastebėjau, kad dažnai galiu pertvarkyti savo duomenų struktūrą ir kodą, kad išvengčiau tokių situacijų, tačiau tai ne visada yra praktiška.

Kitas geras šaltinis, susijęs su „goto“ tipo funkcijų naudojimu „Java“, yra 2000 m. Birželio 13 d. JDC „Tech Tip Goto“ pareiškimai ir „Java“ programavimas. Kaip pažymima šiame patarime, etiketės iš tikrųjų gali būti naudojamos bet kuriam blokui ir neapsiriboja pertrauka ir Tęsti. Tačiau mano patirtis yra tokio požiūrio būtinybė ne pertrauka ir Tęsti yra kur kas rečiau.

Vienas svarbus pastebėjimas apie etiketes yra tas, kad kodo vykdymas tiesiogine to žodžio prasme negrįžta, kai sulaužyti somelabel yra įvykdytas. Vietoj to vykdymo eiga eina į teiginį iškart po pažymėtu pareiškimu. Pavyzdžiui, jei turėčiau išorinį dėl kilpa, vadinama „dustin:“, tada pertrauka tai iš tikrųjų pereis prie pirmojo vykdomojo sakinio, einančio po to etiketės pabaigos dėl kilpa. Kitaip tariant, jis veikia labiau kaip komanda „eikite į teiginį po etikete pažymėto teiginio“.

Nepateikiu šių etikečių naudojimo pavyzdžių pertrauka arba paženklinti Tęsti teiginių, nes internete yra daugybė gerų pavyzdžių. Konkrečiai, į du jau minėtus išteklius („Java Tutorials Branching Statements“ ir „Goto Statements“ bei „Java Programming Tech Tip“) pateikiami paprasti iliustraciniai pavyzdžiai.

Kuo daugiau dirbu programinės įrangos kūrimo pramonėje, tuo labiau įsitikinu, kad programinės įrangos kūrime yra nedaug absoliučių ir kad ekstremistų pozicijos vienu ar kitu metu beveik visada bus neteisingos. Aš paprastai vengiu naudoti „goto“ ar į „goto“ panašų kodą, tačiau yra atvejų, kai tai yra geriausias šio darbo kodas. Nors „Java“ neturi tiesioginio „goto“ palaikymo, ji teikia panašų į „goto“ palaikymą, kuris tenkina daugumą mano palyginti nedažnų tokios paramos poreikių.

Šią istoriją „Java's goto“ iš pradžių paskelbė „JavaWorld“.

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