Java goto

Има стара шега на програмист, която звучи по следния начин: Един програмист в гняв казва на втория програмист: „Отиди в ада!“ Вторият програмист отговаря с очевидно отблъскване: "Уф, използвахте goto!" Смисълът на този изнервящ хумор е, че за много програмисти използването на „goto“ е почти най-тежкото нарушение, което човек може да извърши.

Няколко са причините, поради които goto се цени на толкова ниско ниво сред разработчиците на софтуер. Докладът на Edsger W. Dijkstra „Дело срещу изявлението GO TO“ е относително ранен трактат за злините на злоупотребата с GOTO. В тази статия, Dijkstra заявява, „[Убедих се], че преминаването към изявление трябва да бъде премахнато от всички езици за програмиране на„ по-високо ниво “. Изявлението на Dijkstra „Преминете към вредно“ не само постави лаптопа на goto, но и започна популярна тенденция в компютърните науки да използва фразата „считана за вредна“ (въпреки че тези две думи очевидно бяха използвани извън програмирането преди това).

Много програмисти след Dijkstra са били ухапани от някои от проблемите за поддържане, свързани с използването на goto изрази на определени езици. Други програмисти са чували тези истории или са им казвали „Не използвай goto“ толкова много, че не е нужно да изпитат недостатъците му от първа ръка, за да повярват, че не трябва да използват GOTO.

Въпреки че изявлението goto изглежда има лоша репутация, то не е без своите привърженици. Франк Рубин написа отговор на изявлението на Дейкстра „ Отиди на място”, считано за вредно(Март 1968 г.) наречен GOTO Счита се за вреден „Счита се за вреден (март 1987 г.). В това писмо Рубин пише за писмото на Дейкстра, което има ефект върху програмистите толкова драматично, че „идеята, че GOT0 е вреден, се приема почти универсално, без съмнение и съмнение“. От това наблюдение Рубин пише: "Това е причинило неизмерима вреда на областта на програмирането, която е загубила ефикасен инструмент. Това е като месарите, които забраняват ножовете, защото работниците понякога се режат." Обърнете внимание, че Дейкстра отговори на писмото на Рубин с „Донякъде разочароваща кореспонденция“. Страницата Cunningham & Cunningham Wiki Go to казва това за изявлението goto: "Чиракът го използва, без да мисли. Калфата го избягва, без да мисли. Майсторът го използва замислено."

Има многобройни други ресурси, които обхващат плюсовете и минусите на използването на goto изявлението. Не възнамерявам да преразглеждам този дебат тук, освен краткото представяне на ранната история на вече обхванатия спор. Чувал съм някои разработчици на Java да заявяват, че Java няма goto изявление и това е, което искам да обсъдя в останалата част от тази публикация в блога.

Java запазва "goto" като запазена ключова дума. Това обаче е неизползвана ключова дума. Това означава, че въпреки че ключовата дума всъщност не прави нищо продуктивно, тя също е дума, която не може да се използва в код за имена на променливи или други конструкции. Например следният код няма да се компилира:

package dustin.examples; /** * Class demonstrating Java's goto-like functionality. */ public class JavaGotoFunctionality { /** * Main executable function. * * @param arguments Command-line arguments: none expected. */ public static void main(final String[] arguments) { final String goto = "Go to bed!"; } } 

Ако се опитам да компилирам този код, виждам грешка като тази, показана на следващата екранна снимка.

Съобщението за грешка „очаквано“ с указател в интервала преди „goto“ дава на опитен разработчик на Java достатъчно подсказка, за да разбере бързо, че има нещо нередно в използването на „goto“. Това обаче може да не е толкова очевидно за някой нов в Java.

По принцип не използвам конструкцията goto, но също така осъзнавам, че има ситуации, при които използването му прави код, който е по-четим и използва по-малко луди заобикалящи мерки, отколкото да не го използвам. В Java това също е осъзнато и се предоставя подкрепа за някои от най-често срещаните ситуации, в които оператор goto би бил най-полезен и вероятно би бил за предпочитане пред алтернативи. Най-очевидните примери за това са етикетираните breakи етикетирани continueизявления. Те се обсъждат и демонстрират в раздела Java Tutorials Branching Statements.

Възможността да се маркира конкретен израз и след това да се приложи breakили да се continueприложи към него, а не към най-непосредственото му изявление (като немаркиран breakили continueправи), е особено полезна в случаите, когато вложени цикли иначе изискват повече код и по-сложен код, за да се постигне същото нещо. Открих, че често мога да препроектирам структурите си на данни и кода, за да избегна подобни ситуации, но това не винаги е практично.

Друг добър ресурс, свързан с използването на goto-подобна функционалност в Java, е 13 юни 2000 г. JDC Tech Tip Goto Statements и Java Programming. Както посочва този съвет, етикетите всъщност могат да се използват за всеки блок и не са ограничени до breakи continue. Моят опит обаче е, че необходимостта от този подход извън breakи continueе много по-рядка.

Едно важно наблюдение относно етикетите е, че изпълнението на кода не се връща буквално към този етикет, когато break somelabelсе изпълнява. Вместо това потокът на изпълнение преминава към изявлението, непосредствено след етикетирания израз. Например, ако имах външен forцикъл, наречен "dustin:", тогава прекъсването на това всъщност щеше да премине към първия изпълним оператор след края на този етикетиран forцикъл. С други думи, той действа по-скоро като команда "отидете на изявлението след етикетирания израз".

Тук не предоставя никакви примери за използване на тези етикетирани breakили етикетирани continueизявления, защото има много добри примери, които лесно се намират онлайн. По-конкретно, двата ресурса, които вече споменах (Java Tutorials Branching Statements и Goto Statements и Java Programming Tech Tip) включват прости илюстративни примери.

Колкото повече работя в индустрията за разработка на софтуер, толкова по-убеден ставам, че има малко абсолюти в разработването на софтуер и че екстремистките позиции почти винаги ще бъдат погрешни в един или друг момент. Като цяло се избягвам да използвам goto или подобен на goto код, но има моменти, когато това е най-добрият код за работата. Въпреки че Java няма директна поддръжка на goto, тя осигурява подобна на goto поддръжка, която отговаря на повечето ми сравнително редки нужди от такава поддръжка.

Тази история „Java goto“ първоначално е публикувана от JavaWorld.