Programování

Java to jde

Existuje starý programátorský vtip, který zní asi takto: Jeden programátor v hněvu říká druhému programátorovi: „Jdi do pekla!“ Druhý programátor odpověděl zjevným odporem: „Ugh, použili jste goto!“ Smyslem tohoto hloupého humoru je, že pro mnoho programátorů je použití „goto“ téměř tím nejhorším přestupkem, kterého se člověk může dopustit.

Existuje několik důvodů, proč si vývojáři softwaru váží tak nízké úcty. Papír Edsgera W. Dijkstra Případ proti prohlášení GO TO je relativně rané pojednání o zlu zneužívání GOTO. V tomto článku Dijkstra uvádí: „[Byl jsem] přesvědčen, že příkaz go to by měl být zrušen ze všech programovacích jazyků„ vyšší úrovně “.“ Dijkstra's Go To Statement Považováno za škodlivé Dopis nejenže kritizoval výrok goto, ale také nastartoval populární trend v počítačové vědě používající frázi „považován za škodlivý“ (ačkoli tato dvě slova byla zjevně používána mimo programování dříve).

Mnoho programátorů od Dijkstra bylo pokousáno některými problémy s udržovatelností spojenými s použitím příkazů goto v určitých jazycích. Jiní programátoři tyto příběhy slyšeli nebo do nich natlačili „Nebudete používat goto“ natolik, že nepotřebují na vlastní kůži zažít své nevýhody, aby věřili, že by neměli používat GOTO.

Ačkoli se zdá, že prohlášení goto má obecně špatnou pověst, není bez jeho příznivců. Frank Rubin napsal odpověď na Dijkstra Přejít na prohlášení považováno za škodlivé (Březen 1968) s názvem GOTO považováno za škodlivé „považováno za škodlivé“ (březen 1987). V tomto dopise Rubin napsal o tom, že Dijkstrův dopis měl na programátory tak dramatický účinek, že „představa, že GOT0 je škodlivá, je přijata téměř univerzálně, bez jakýchkoli pochyb a pochyb.“ Z tohoto pozorování Rubin napsal: „To způsobilo nevyčíslitelnou škodu v oblasti programování, která ztratila účinný nástroj. Je to jako řezníci, kteří zakazují nože, protože se dělníci někdy porežou.“ Všimněte si, že Dijkstra reagoval na Rubinův dopis zprávou O poněkud zklamávající korespondenci. Stránka Cunningham & Cunningham Wiki Go To říká o výroku goto: "Učeň to používá bez přemýšlení. Poutník se tomu vyhýbá bez přemýšlení. Pán to používá zamyšleně."

Existuje mnoho dalších zdrojů, které pokrývají výhody a nevýhody používání příkazu goto. Nemám v úmyslu tu debatu přehodit jinak než krátkou prezentací rané historie kontroverze, která již byla popsána. Slyšel jsem, že někteří vývojáři Java říkají, že Java nemá prohlášení goto, a to je to, o čem chci diskutovat ve zbytku tohoto blogového příspěvku.

Java rezervuje „goto“ jako vyhrazené klíčové slovo. Je to však nepoužívané klíčové slovo. To znamená, že ačkoli klíčové slovo ve skutečnosti neprodukuje nic produktivního, je to také slovo, které nelze v kódu použít pro názvy proměnných nebo jiných konstruktů. Například následující kód nebude kompilován:

příklady zásilky; / ** * Třída předvádějící podobnou funkci Java. * / public class JavaGotoFunctionality {/ ** * Hlavní spustitelná funkce. * * @param argumenty Argumenty příkazového řádku: žádné neočekávané. * / public static void main (final String [] argumenty) {final String goto = "Jdi do postele!"; }} 

Pokud se pokusím tento kód zkompilovat, zobrazí se chyba, jako je ta, která se zobrazuje na dalším snímku obrazovky.

Chybová zpráva „očekává se“ s ukazatelem v prostoru před „goto“ dává zkušenému vývojáři Java dostatek vodítka k tomu, aby si rychle uvědomil, že s používáním „goto“ něco není v pořádku. Pro někoho nového v Javě to však nemusí být tak zřejmé.

Obecně nepoužívám konstrukci goto, ale také si uvědomuji, že existují situace, ve kterých její použití vytváří kód, který je čitelnější a používá méně šílené řešení, než aby jej nepoužíval. V Javě to bylo také realizováno a je poskytována podpora pro některé z nejběžnějších situací, ve kterých by byl příkaz goto nejužitečnější a pravděpodobně by byl výhodnější než alternativy. Nejviditelnější příklady jsou označeny přestávka a označené pokračovat prohlášení. Ty jsou popsány a předvedeny v sekci Java Tutorials Branching Statements.

Schopnost označit konkrétní prohlášení a poté mít přestávka nebo pokračovat použít na toto prohlášení spíše než na jeho nejbezprostřednější prohlášení (jako neoznačené přestávka nebo pokračovat does) je obzvláště užitečné v případech, kdy by vnořené smyčky jinak vyžadovaly více kódu a složitější kód, aby bylo dosaženo stejné věci. Zjistil jsem, že mohu často přepracovat své datové struktury a kód, abych se těmto situacím vyhnul, ale to není vždy praktické.

Dalším dobrým zdrojem souvisejícím s používáním funkcí podobných goto v Javě jsou prohlášení Joto Tech Tip ze dne 13. června 2000 a programování v Javě. Jak tento tip zdůrazňuje, štítky lze skutečně použít pro jakýkoli blok a nejsou omezeny na přestávka a pokračovat. Nicméně, to je moje zkušenost, že nutnost tohoto přístupu mimo přestávka a pokračovat je mnohem méně časté.

Jedním z důležitých poznatků o štítcích je, že provádění kódu se na tento štítek doslova nevrací, když rozbít štítek je proveden. Místo toho tok spuštění přejde na příkaz bezprostředně následující po označeném příkazu. Například kdybych měl vnější pro smyčka s názvem „dustin:“, pak by přerušení toho skutečně vedlo k prvnímu spustitelnému příkazu po konci označeného pro smyčka. Jinými slovy, chová se spíše jako příkaz „přejít na příkaz následující po příkazu označeném“.

Neuvádím žádné příklady použití těchto štítků přestávka nebo označené pokračovat prohlášení zde, protože existuje spousta dobrých příkladů snadno dostupných online. Konkrétně dva zdroje, které jsem již zmínil (Java Tutorials Branching Statements a Goto Statements a Java Programming Tech Tip), zahrnují jednoduché ilustrativní příklady.

Čím více pracuji v odvětví vývoje softwaru, tím více jsem se přesvědčil, že při vývoji softwaru existuje několik absolutních hodnot a že extremistické pozice se téměř vždy v jednom či druhém bodě mýlí. Obecně se vyhýbám používání goto nebo goto-like kódu, ale jsou chvíle, kdy je to nejlepší kód pro danou práci. Ačkoli Java nemá přímou podporu goto, poskytuje podporu podobnou goto, která splňuje většinu mých relativně málo častých potřeb takové podpory.

Tento příběh, „Java to go“, původně publikoval JavaWorld.