Programmering

Java går

Det er en gammel programmeringsvits som går omtrent slik: En programmerer i sinne sier til den andre programmereren: "Gå til helvete!" Den andre programmereren svarer i åpenbar frastøtelse, "Ugh, du brukte å gå!" Poenget med denne nerdete humoren er at bruk av "goto" for mange programmerere er omtrent det verste lovbrudd man kan begå.

Det er flere grunner til at goto holdes i så lav aktelse blant programvareutviklere. Edsger W. Dijkstras papir A Case Against the GO TO-uttalelsen er en relativt tidlig avhandling om ondskapen ved GOTO-misbruk. I den artikkelen sier Dijkstra, "[jeg ble] overbevist om at gå til uttalelse bør avskaffes fra alle programmeringsspråk på" høyere nivå. " Dijkstras Go To-uttalelse som ansett som skadelig bokstav kastet ikke bare goto-påstanden, men startet også en populær datavitenskapstrend med å bruke uttrykket "ansett som skadelig" (selv om disse to ordene tilsynelatende ble brukt utenfor programmering før det).

Mange programmerere siden Dijkstra har blitt bitt av noen av vedlikeholdsproblemene knyttet til bruk av goto-utsagn på visse språk. Andre programmerere har hørt disse historiene eller har fått "Du skal ikke bruke goto" banket så mye inn i dem at de ikke trenger å oppleve ulempene fra første hånd til å tro at de ikke skal bruke GOTO.

Selv om goto-uttalelsen ser ut til å ha et generelt dårlig rykte, er det ikke uten sine tilhengere. Frank Rubin skrev et svar på Dijkstra's Gå til uttalelse som ansett som skadelig (Mars 1968) kalt GOTO Ansett som skadelig 'Ansett som skadelig (mars 1987). I det brevet skrev Rubin om Dijkstras brev som hadde en innvirkning på programmerere så dramatiske at "forestillingen om at GOT0 er skadelig blir akseptert nesten universelt, uten tvil eller tvil." Om denne observasjonen skrev Rubin: "Dette har forårsaket uberegnelig skade på programmeringsfeltet, som har mistet et effektivt verktøy. Det er som slaktere som forbyder kniver fordi arbeidere noen ganger kutter seg selv." Merk at Dijkstra svarte på Rubins brev med On a Somewhat Disappointing Correspondance. Cunningham & Cunningham Wiki-siden Go To sier dette om goto-uttalelsen: "Lærlingen bruker den uten å tenke. Svenn unngår den uten å tenke. Mesteren bruker den ettertenksomt."

Det er mange andre ressurser som dekker fordeler og ulemper ved å bruke goto-uttalelsen. Jeg har ikke tenkt å gjenopprette den debatten her enn den korte presentasjonen av den tidlige historien om den kontroversen som allerede er dekket. Jeg har hørt noen Java-utviklere som sier at Java ikke har en goto-uttalelse, og det er det jeg vil diskutere i resten av dette blogginnlegget.

Java reserverer "goto" som et reservert nøkkelord. Det er imidlertid et ubrukt nøkkelord. Hva dette betyr er at selv om nøkkelordet faktisk ikke gjør noe produktivt, er det også et ord som ikke kan brukes i kode for navn på variabler eller andre konstruksjoner. Følgende kode vil for eksempel ikke kompilere:

pakke dustin. eksempler; / ** * Klasse som demonstrerer Java's goto-lignende funksjonalitet. * / offentlig klasse JavaGotoFunctionality {/ ** * Hoved kjørbar funksjon. * * @param argumenter Kommandolinje argumenter: ingen forventet. * / public static void main (final String [] argumenter) {final String goto = "Gå til sengs!"; }} 

Hvis jeg prøver å kompilere den koden, ser jeg en feil som den som vises i neste skjermbilde.

Feilmeldingen "forventet" med en peker i mellomrommet før "goto" gir en erfaren Java-utvikler nok av en anelse til raskt å innse at det er noe galt med å bruke "goto." Imidlertid kan det hende det ikke er like åpenbart for noen som er nye i Java.

Jeg bruker vanligvis ikke goto-konstruksjonen, men jeg anerkjenner også at det er situasjoner der bruken gir kode som er mer lesbar og bruker mindre sprø arbeid enn å ikke bruke den. I Java har dette også blitt realisert, og det gis støtte for noen av de vanligste situasjonene der en goto-uttalelse ville være mest nyttig og sannsynligvis ville være å foretrekke fremfor alternativer. De mest åpenbare eksemplene på dette er merket gå i stykker og merket Fortsette uttalelser. Disse er diskutert og demonstrert i delen Java Tutorials Branching Statements.

Evnen til å merke et bestemt utsagn og deretter ha gå i stykker eller Fortsette gjelder denne uttalelsen snarere enn den mest umiddelbare uttalelsen (som umerket gå i stykker eller Fortsette gjør) er spesielt nyttig i tilfeller der nestede sløyfer ellers vil kreve mer kode og mer kompleks kode for å oppnå det samme. Jeg har funnet ut at jeg ofte kan redesigne datastrukturer og koder for å unngå slike situasjoner, men dette er ikke alltid praktisk.

En annen god ressurs knyttet til bruk av goto-lignende funksjonalitet i Java er 13. juni 2000 JDC Tech Tip Goto Statements og Java Programming. Som dette tipset påpeker, kan etikettene faktisk brukes til hvilken som helst blokk og er ikke begrenset til gå i stykker og Fortsette. Imidlertid er det min erfaring at nødvendigheten av denne tilnærmingen utenfor gå i stykker og Fortsette er langt mindre vanlig.

En viktig observasjon om etiketter er at kodeutførelse ikke bokstavelig talt går tilbake til den etiketten når bryte noen etikett blir henrettet. I stedet går utførelsesflyten til uttalelsen umiddelbart etter merket uttalelse. For eksempel hvis jeg hadde en ytre til loop kalt "dustin:", så vil en pause til det faktisk gå til den første kjørbare uttalelsen etter slutten av den merket til Løkke. Med andre ord fungerer det mer som en "gå til uttalelsen etter merket uttalelse" -kommandoen.

Jeg gir ingen eksempler på bruk av disse merket gå i stykker eller merket Fortsette uttalelser her fordi det er mange gode eksempler som er lett å finne på nettet. Spesielt inkluderer de to ressursene som jeg allerede har nevnt (Java Tutorials Branching Statements and Goto Statements and Java Programming Tech Tip) enkle illustrative eksempler.

Jo mer jeg jobber i programvareutviklingsindustrien, jo mer overbevist blir jeg om at det er få absolutter i programvareutvikling, og at ekstremistiske posisjoner nesten alltid vil være gale på et eller annet tidspunkt. Jeg viker meg generelt ikke fra bruk av goto eller goto-lignende kode, men det er tider når det er den beste koden for jobben. Selv om Java ikke har direkte goto-støtte, gir den goto-lignende støtte som dekker de fleste av mine relativt sjeldne behov for slik støtte.

Denne historien, "Java's goto" ble opprinnelig utgitt av JavaWorld.

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